前几天我们介绍了线性回归模型的原理,今天我们主要来看如何用Python代码将线性回归写出来。
首先,打开我们的jupyter notebook,把常用的一些包都加载上吧:
import numpy as np
import pandas as pd
然后,加载我们的线性回归模型:
from sklearn.linear_model import LinearRegression
数据集就选择sklearn包自带的“波士顿房价预测数据集”:
from sklearn.datasets import load_boston
将数据集放到boston对象中,并查看它的内容:
boston = load_boston()
boston.keys()
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])
影响房价的特征在data中,房价在target中,我们先来看下有哪些特征:
boston['feature_names']
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')
可以看到,一共有13个特征之多。再看下房屋价格的前5行数据:
boston['target'][:5]
array([24. , 21.6, 34.7, 33.4, 36.2])
好了,下面先把数据集分成训练集和测试集:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(boston['data'],boston['target'],random_state=0)
构建我们的回归模型并训练它:
lr = LinearRegression()
lr.fit(X_train,y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
normalize=False)
可以看到,返回了一个训练完成的线性回归模型。我们可以看到该线性模型的系数和截距:
lr.coef_ #系数
array([-1.17735289e-01, 4.40174969e-02, -5.76814314e-03, 2.39341594e+00,
-1.55894211e+01, 3.76896770e+00, -7.03517828e-03, -1.43495641e+00,
2.40081086e-01, -1.12972810e-02, -9.85546732e-01, 8.44443453e-03,
-4.99116797e-01])
可以看出,给我们的13个特征都加了一个系数。再来看下截距:
lr.intercept_ #截距
36.933255457118975
之后我们就可以进行预测了,这里用score方法可以直接看出该模型在训练集和测试集上的性能:
lr.score(X_train,y_train) #模型在训练集上的性能
0.7697699488741149
lr.score(X_test,y_test) #模型在测试集上的性能
0.6354638433202129
我们看到,模型在训练集上的精确度是77%左右,在测试集上是64%左右。测试集的精度低于训练集,有可能是过拟合,但鉴于两者精度都不高,也有欠拟合的可能性。
但我们还是用有正则化项、防止过拟合的岭回归来试试。首先,还是加载模型:
from sklearn.linear_model import Ridge
然后在训练集上使用它:
ridge_model = Ridge().fit(X_train,y_train)
最后,评估岭回归模型的性能:
ridge_model.score(X_train,y_train)
0.7678858330771393
ridge_model.score(X_test,y_test)
0.626618220461385
从上面的代码看出,我们的岭回归模型的泛化能力并没有提高,那就很有可能是我们的模型复杂度不够,需要给原始数据增加一些特征,这个我们后面会讨论。
除了岭回归,我们还有lasso回归,也是用来防止过拟合的,我们来看看它的表现如何:
from
可以看出,Lasso回归模型在训练集和测试集上的表现都很差,而且不如我们原始的线性模型,再次说明需要增加模型的复杂度。
还需要说明的是,Ridge和Lasso回归模型中,正则化项的系数是通过alpha参数来调节的。
更多干货内容,欢迎关注今日头条账号“人人都会机器学习”;你也可以搜索知识星球“自学机器学习”,里面也有精彩内容;还可以关注公众号:“数据实干家”,为你献上数据大餐。