我们用加州房价预测来讲述普通线性回归的算法实战和预测指标。在这里省去数据预处理和特征工程的步骤。首先导入相应的模块:
from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集
import pandas as pd
接下来导入数据:
housevalue = fch() #会需要下载
然后我们用特征名字替换原有的column名,pd.dataframe将数据转化为数据框格式,数据拆分并重置索引:
X.columns = housevalue.feature_names
X = pd.DataFrame(housevalue.data)
y = pd.DataFrame(housevalue.target)
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
可以看到划分出来的数据集索引的乱的,因此我们要重置索引:
#恢复索引
for i in [Xtrain, Xtest]:
i.index = range(i.shape[0])
接下来我们训练模型:
reg = LR().fit(Xtrain, Ytrain)
用训练好的模型去预测我们的yhat:
yhat = reg.predict(Xtest) #预测我们的yhat
查看每个变量对应的参数值:
[*zip(Xtrain.columns,reg.coef_.reshape(-1))]
查看截距:
reg.intercept_
现在我们用MSE(均方误差)和r2来评判模型的好坏。MSE用来预测是否预测到了正确的数值,R2用来判断是否拟合了足够多的信息,MSE越小越好,R2越接近1越好:
在这里我们用交叉验证去获得MSE值和R2:
from sklearn.metrics import mean_squared_error as MSE
cross_val_score(reg,X,y,cv=10,scoring="neg_mean_squared_error").mean()
from sklearn.metrics import r2_score
cross_val_score(reg,X,y,cv=10,scoring="r2").mean()
我们观察到,我们在加利福尼亚房屋价值数据集上的MSE其实不是一个很大的数(0.5),但我们的R2不高,百分之四十几的信息都被遗漏掉了。这证明我们的模型比较好地拟合了一部分数据的数值,却没有能正确拟合数据的分布。让我们与绘图来看看,究竟是不是这 样一回事。我们可以绘制一张图上的两条曲线,一条曲线是我们的真实标签Ytest,另一条曲线是我们的预测结果 yhat,两条曲线的交叠越多,我们的模型拟合就越好:
plt.plot(range(len(Ytest)),sorted(Ytest),c="black",label= "Data")
plt.plot(range(len(yhat)),sorted(yhat),c="red",label = "Predict")
plt.legend()
plt.show()
可见,虽然我们的大部分数据被拟合得比较好,但是图像的开头和结尾处却又着较大的拟合误差。如果我们在图像右 侧分布着更多的数据,我们的模型就会越来越偏离我们真正的标签。这种结果类似于我们前面提到的,虽然在有限的数据集上将数值预测正确了,但却没有正确拟合数据的分布,如果有更多的数据进入我们的模型,那数据标签被预测 错误的可能性是非常大的。