天天看点

python 线性回归_用Python实现线性回归算法

python 线性回归_用Python实现线性回归算法

前几天我们介绍了线性回归模型的原理,今天我们主要来看如何用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参数来调节的。

更多干货内容,欢迎关注今日头条账号“人人都会机器学习”;你也可以搜索知识星球“自学机器学习”,里面也有精彩内容;还可以关注公众号:“数据实干家”,为你献上数据大餐。