线性回归
步骤:
- 明确定义所要解决的问题——网店销售额的预测
- 在数据的收集与预处理环节,分五个环节完成数据的预处理工作,分别如下
(1)收集数据— 需要提供的网店的相关记录
(2)将收集到的数据可视化,显示出来看一看
(3)做特征工程,使数据更容易被机器处理
(4)拆分数据集为训练集和测试集
(5)做特征缩放,把数据值压缩到比较小的区间 - 选择机器学习的模型环节
(1)确定机器学习的算法——这里也就是线性回归算法
(2)确定线性回归算法的假设函数
(3)确定线性回归算法的损失函数 - 通过梯度下降训练机器,确定模型内部参数的过程
- 进行超参数调试和性能优化
一、问题定义:网站广告该如何投放
先看数据:
数据是代表微信公众号广告投放金额、微博广告投放金额、其他类型广告投放金额、商品销售额(千元)
定义问题:
- 各种广告和商品销售额的相关度如何。
- 各种广告和商品销售额之间体现出一种什么关系。
- 哪一种广告对于商品销售额的影响最大。
- 分配特定的广告投放金额,预测出未来的商品销售额。
在机器学习中,如果只包括一个自变量和一个因变量,且两者的关系可用一条直线近似表示,这种回归分析就称为一元线性回归分析。
如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
二、数据的收集和预处理
1.收集网店销售额数据
advertising.csv
需要的可以去网上搜一搜。
2.数据的读取和可视化
import numpy as np
import pandas as pd
df_ads = pd.read_csv(r'E:\Users\lenovo\Desktop\线性回归\数据集\advertising.csv')
df_ads.head()
3.数据的相关分析
# 导入数据可视化所需要的库
import matplotlib.pyplot as plt #Matplotlib – Python画图工具库
import seaborn as sns #Seaborn – 统计学数据可视化工具库
#对所有的标签和特征两两显示其相关性的热力图(heatmap)
sns.heatmap(df_ads.corr(), cmap="YlGnBu", annot = True)
plt.show() #plt代表英文plot,就是画图的意思
相关性越高,颜色越深。此处的相关性分析结果很明确的告诉我们——将有限的金钱投放到微信公众号里面做广告是最为合理的选择。
4.数据的散点图
通过散点图两两一组显示商品销售额和各种广告投放金额之间的对应关系。
#显示销量和各种广告投放量的散点图
sns.pairplot(df_ads,
x_vars=['wechat', 'weibo', 'others'],
y_vars='sales',
height=4, aspect=1, kind='scatter')
plt.show()
5.数据集清洗和规范化
下面把df_ads中的微信公众号广告投放金额字段读入一个NumPy数组X,也就是清洗了其他两个特征字段,并把标签读入数组y:
X = np.array(df_ads.wechat) #构建特征集,只含有微信广告一个特征
y = np.array(df_ads.sales) #构建标签集,销售金额
print ("张量X的阶:",X.ndim)
print ("张量X的形状:", X.shape)
print ("张量X的内容:", X)
对于回归问题的数值类型数据集,机器学习模型所读入的规范格式应该是2D张量,也就是矩阵,其形状为(样本数,标签数)
进行张量变形:
X = X.reshape((len(X),1)) #通过reshape函数把向量转换为矩阵,len函数返回样本个数
y = y.reshape((len(y),1)) #通过reshape函数把向量转换为矩阵,len函数返回样本个数print ("张量X的阶:",X.ndim)
print ("张量X的形状:", X.shape)
print ("张量X的内容:", X)
数据的结构从1D数组变成了有行有列的矩阵。
6.拆分数据集为训练集和测试集
#将数据集进行80%(训练集)和20%(测试集)的分割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=0)
7.把数据归一化
通过Sklearn库中的preprocessing (数据预处理)工具中的Min Max Scaler可以实现数据的归一化。
这里定义一个归一化函数:
def scaler(train, test): #定义归一化函数,进行数据压缩
min = train.min(axis=0) #训练集最小值
max = train.max(axis=0) #训练集最大值
gap = max - min #最大值和最小值的差
train -= min #所有数据减最小值
train /= gap #所有数据除以大小值差
test -= min #把训练集最小值应用于测试集
test /= gap #把训练集大小值差应用于测试集
return train, test #返回压缩后的数据
不能使用测试集中数据信息进行特征缩放中间步骤中任何值的计算。
对特征和标签进行归一化:
X_train,X_test = scaler(X_train,X_test) #对特征归一化
y_train,y_test = scaler(y_train,y_test) #对标签也归一化
查看归一化后的散点图:
#用之前已经导入的matplotlib.pyplot中的plot方法显示散点图
plt.plot(X_train,y_train,'r.', label='Training data')
plt.xlabel('Wechat Ads') # x轴Label
plt.ylabel('Sales') # y轴Label
plt.legend() # 显示图例
plt.show() # 显示绘图结果
形状和之前的图像完全一致。
三、选择机器学习模型
1.确定线性回归模型
这个简单的模型就是一元线性函数:y=ax+b
a就相当于w:权重,b就相当于偏置。
weight是权重,bias是偏置。
2.假设(预测)函数——h(x)
y’=wx+b
h(x)=wx+b
注意:
- y’指的是所预测出的标签,读作y帽(y-hat)或y撇
- h(x)就是机器学习所得到的函数模型,他能根据输入的特征进行标签的预测。
我们就把它称为假设函数。有时也叫做预测函数。
所以机器学习的具体目标就是确定假设函数h(x):
- 确定b,也就是y轴截距,这里称为偏置。
- 确定w,也就是斜率,这里称为特征x的权重。
3.损失(误差)函数——L(w,b)
损失:是对糟糕预测的惩罚。损失也就是误差,也称为成本或代价
损失函数(loss function)L(w,b)就是用来计算平均损失的。
如果平均损失小,参数就好;如果平均损失大,模型或者参数就还要继续调整。
机器学习中的损失函数,主要包括:
- 用于回归的损失函数。
– 均方误差(MSE)函数,也叫平方损失或L2损失函数
– 平均绝对误差(MAE)函数,也叫L1损失函数
– 平均偏差误差函数 - 用于分类的损失函数
– 交叉熵损失函数
– 多分类SVM损失函数
线性回归模型的常用损失函数——均方误差函数。
手工定义一个均方误差函数:
def loss_function(X, y, weight, bias): # 手工定义一个MSE均方误差函数
y_hat = weight*X + bias # 这是假设函数,其中已经应用了Python的广播功能
loss = y_hat-y # 求出每一个y’和训练集中真实的y之间的差异
cost = np.sum(loss**2)/(2*len(X)) # 这是均方误差函数的代码实现
return cost # 返回当前模型的均方误差值
随便定义两组参数,看看其均方误差大小:
print ("当权重5,偏置3时,损失为:",