天天看點

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參數來調節的。

更多幹貨内容,歡迎關注今日頭條賬号“人人都會機器學習”;你也可以搜尋知識星球“自學機器學習”,裡面也有精彩内容;還可以關注公衆号:“資料實幹家”,為你獻上資料大餐。