【机器学习与实战】回归分析与预测:数据预处理
配套视频课程:www.bilibili.com/video/BV1Rx…
一、处理步骤
1、明确定义所要解决的问题,如果预测销售额,预测房价等
2、进行数据收集和预处理:
(1)收集数据(如某店的销售额数据)
(2)将数据可视化,显示出来看看情况
(3)进行特征标注和分类整理
(4)将数据集拆分为训练集和测试集
(5)对特征进行缩放,压缩到比较小的区间,如0到1或-1到1
3、选择机器学习模型
(1)确定机器学习的算法,如线性回归, 逻辑回归
(2)确定线性回归的假设函数
(3)确定线性回归的损失函数
4、通过梯度下降训练机器,确定模型的内部参数
5、进行超参调整与性能优化
线性回归有一元线性回归,如y=ax+b,有的地方也表示为f(x)=ax+b,其中s是系数,也叫权重,也叫斜率,而b叫截距(就是Y轴上离原点的距离),也有多元线性回归,如f(x1,x2,x3,x4,x5)=a1x1+a2x2+a3x3+a4x4+a5x5+b,通常在机器学习中,大家更喜欢用 wx+b来表示,因为w可以表示权重的意思,但是本质是没有任何区别的,只是一个参数的名称而已。
二、数据相关性分析
基于某网站的历史销售数据来预测后续销售额,具体想知道以下几个问题:
(1)各种广告和商品销售额的相关度如何?
(2)各种广告和端口销售额之间所体系的关系?
(3)哪一种广告对销售额的影响最大?
(4)分配特定广告投放金额,来预测销售额。
以上问题的定义相对来说是很明确的,有了明确的问题,才能更好的建模,机器学习的本质就是要通过建模和训练,找到一个由此推彼的函数。
基于advertising.csv的数据,利用matplotlib的热力图(heatmap)可以直观快速了解哪些列对销售额的影响最大,代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
ads = pd.read_csv('./advertising.csv')
print(ads.head()) # 显示数据列名和少量数据
sb.heatmap(ads.corr(), annot=True) # corr:计算相关系数,annot=True,显示数字
plt.show()
从上图绘制的相关系数热力图来看,微信(wechat)的广告投放对销售额(sales)所产生的影响最大,也就是说微信广告的效果最好,微博次之,其他广告渠道最差。
当然,除了使用热力图来绘制相关性,我们也可以使用散点图来绘制两两影响,代码如下:
sb.pairplot(ads, x_vars=['wechat', 'weibo', 'others'], y_vars='sales')
plt.show()
同样可以比较直观的看出,微信与销售额之间成更好的正相关,拟合度更高。同时,根据以上可视化图像,也可以辅助我们选择一个更为合适的函数进行拟合。
三、数据处理
1、数据集清洗和规范
通过相关系数的分析后,可以发现微博的相关度最高,为了简化模型,可以暂时忽略微博和其他广告,先来分析微信和销售额数据,此时,就相当于把多变量回归(多元回归)变成了单变量回归的分析。
import pandas as pd
import numpy as np
ads = pd.read_csv('./advertising.csv')
x = np.array(ads.wechat)
y = np.array(ads.sales)
print("数据集x的形状为:", x.shape) # 数据集x的形状为: (200,),表示这是一个1D张量,有200个样本
但是机器学习需要读取的是2D张量,所以需要对上述张量进行变形,变为(200,1),那么同样的y也需要一起变形
x = x.reshape((len(x), 1))
y = y.reshape((len(y), 1))
print("数据集x的形状为:", x.shape)
2、拆分数据集
在进行机器学习的建模过程中,至少需要将数据集拆分为训练集和测试集,才能比较好的检验模型的参数是否达到最优,代码如下:
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)
3、数据归一化(或标准化)
特征缩放对于机器学习特别重要,可以让机器在读取数据的时候感觉更舒服,训练起来效率更高。归一化就是按比例的线性缩放,数据分布不变,但是都落入一个小的区间,如0到1或-1到1,归一化有很多操作手段,下列的公式叫Min-Max标准化:
也就是说当前某个样本的值将变更为一个0到1之间的区间(想想为什么不是-1到1),代码如下:
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)
# 绘制散点图来确认形状是否发生变化
plt.plot(x_train, y_train, 'r.') # r.
plt.xlabel('wechat')
plt.ylabel('sales')
plt.show()
上述代码中的 “r.” 表示线条的风格,r表示颜色为red, . 表示绘制点图,而不是线条:blog.csdn.net/ZK_J1994/ar…
可以看到,归一化之后,数据的相关性与归一化之前没有任何区别。也可以使用sklearn库进行归一化处理:
from sklearn.preprocessing import MinMaxScaler
def scaler(train, test):
mms = MinMaxScaler()
train = mms.fit_transform(train)
test = mms.fit_transform(test)
return train, test
除了使用归一化之外,还可以对数据集进行标准化,其公式为:(X-平均值)/标准差,也可以很好的处理数据统一性问题 ,也可以在sklearn中直接调用StandardScalar对象来实现运算 blog.51cto.com/u_16213677/…