简单线性回归,就是两个随机变量存在一定大小的相关系数的前提下,结合散点图观察,采用最小二乘OLS方法,尝试建立一条回归直线,使得误差平方和SSE最小。OLS是一种参数方法,通过确定直线的斜率b和截距a,求得直线方程y=a+bx。利用该直线方程,可对满足条件的测试集中的x值,预测出相应的y值,并评价模型效果。
本文通过一些人造数据,讲解Python实现简单线性回归的建模方法。
数据集包含两个随机变量:学习时间、分数。
一、统一概念
机器学习和数据分析的步骤相似:
①提出问题
②理解数据
③数据清洗
④建立模型
⑤评估模型
本文重点关注建模过程,故而忽略前3步。
简单线性回归就是一元线性回归。含有一个自变量(特征)+一个因变量(标签)。
通用表达式为y=a+bx,a为截距项,b为斜率(也叫回归系数)。
机器学习的一般建模分析方法,需先将原始数据集拆分出一定比例的数据子集,作为训练集。其余的数据则作为测试集,用来评估模型效果。
拆分的时候采用随机拆分,只需指定比例即可。
简单线性回归的特征一般为连续型变量,标签也为连续型变量。
二、建立模型
解释了可能出现的概念之后,可以着手准备建立模型了。
0.准备数据
通过有序字典的方式,手动创建一个原始数据集,包括两个随机变量(特征:x;标签:y):创建原始数据集
1.建模第一步:计算相关系数矩阵,提取特征和标签提取原始数据集的特征和标签
2.建模第二步:得到训练集和测试集
在导入机器学习交叉验证包的分割模块时,会弹出警告,经搜索,sklearn 0.20以后的版本将不支持sklearn.cross_validation包:
解决办法:修改为高级版本支持的包sklearn.model_selection.
在分割数据集的过程中,又弹出警告:
警告信息说的很清楚了,让我们补足testsize的大小。加一个参数test_size=0.2。如下:
原始数据集的特征:exam_x;训练集特征:x_train;测试集特征:x_test;
原始数据集的标签:exam_y;训练集标签:y_train;测试集标签:y_test。
二八分,训练集80%,测试集20%。
这里补充一下第一步需要的散点图,由于散点图的绘制过程需要提取出特征和标签,所以放在这里补充:
这里也可看出,适合用简单线性回归模型。
3.建模第三步:创建并训练模型
首先,导入 机器学习的线性模型包:from sklearn.linear_model import LinearRegression
然后,创建线性回归模型;再用训练集训练模型:
此处会报错:
通过划线部分我们得到:此处需要二维参数,而我们只传入了一维参数,如果只有一个特征,需要通过numpy重塑形状为n行1列。
备注:reshape为numpy的ndarray类型所具有的方法,Series需要先取出值的部分,即Series.values,再reshape(-1,1)成n行1列。关于reshape的规则见下图:numpy.array.reshape规则
言归正传,将训练集特征和测试集特征重塑为n行1列:
再训练模型一次,并求出截距和斜率,写出OLS方程:求出OLS方程
由于在绘制OLS直线时,需要用到 模型对训练集特征预测出来的y值,此处求一下:
y_train_pred = model.predict(x_train)
三、评估模型
简单线性回归模型的效果用判别系数r^2
可以看到,判别系数r平方为0.74,模型拟合效果较好。
下面通过可视化,直观感受一下效果:训练集:蓝色;测试集:红色