【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集
各位同學好,今天我和大家分享一下python機器學習中線性回歸算法的實例應用,并介紹正則化、嶺回歸方法。在上一篇文章中我介紹了線性回歸算法的原理及推導過程:【機器學習】(7) 線性回歸算法:原理、公式推導、損失函數、似然函數、梯度下降
本節(jié)中我將借助Sklearn庫完成波士頓房價預測,帶大家進一步學習線性回歸算法。文末附python完整代碼。那我們開始吧。
1. Sklearn 庫實現
1.1 線性回歸方法選擇
(1)正規(guī)方程的線性回歸
????????導入方法: from sklearn.linear_model import LinearRegression
????????當數據量較小時(<10萬條),使用該方法的準確率更高
(2)梯度下降法
? ? ? ? 導入方法:?from sklearn.linear_model import SGDClassifier
????????當數據集很大時,使用該方法準確率更高。(盡量采用嶺回歸方法,得到的結果會更好)
梯度下降法公式我已經在上一篇文章中推導過,正規(guī)化方程的推導本文不做介紹,感興趣的可自己查閱一下資料。正則化嶺回歸方法在文末介紹。
1.2 模型準確率的評分方法
(1)平均誤差
????????導入方法:?from sklearn.metrics import mean_absolute_error
????????計算平均誤差方法: mean_absolute_error( 真實值 , 預測值 )
(2)均方誤差
????????導入方法:?from sklearn.metrics import mean_squared_error
????????計算均方誤差:?mean_squared_error( 真實值 , 預測值 )
2. 實例應用 -- 房價預測
2.1 數據獲取
波士頓房價數據時sklearn中自帶的數據,可以直接調用。如果有同學對sklearn內部數據集獲取有疑問的話,可以參考我的前幾篇文章,如下文的第2.1小節(jié):【機器學習】(1) K近鄰算法:原理、實例應用(紅酒分類預測)附python完整代碼及數據集
#(1)數據獲取
from sklearn.datasets import load_boston
boston = load_boston() #保存波士頓房價數據集
讀取數據集的返回值是一個.Bunch類型數據,含有13項特征值,1項房價目標值。data中存放的是特征值數據,DESCR是對該數據集的描述,feature_names是特征值的名稱,filename是該數據集的路徑,target是房價數據。
2.2 數據處理?
從.Bunch數據中獲取特征值和目標值數據,boston_features存放的是影響房價的13項特征數據,boston_targets存放的是房價。
由于線性規(guī)劃對特征值比較敏感,數據對預測結果的影響也比較大。為了避免數據單位不統(tǒng)一以及數據跨度較大等問題導致預測結果不準確,因此對特征值數據進行標準化處理。
標準化方法導入: from sklearn.preprocessing import StandardScaler?
轉換方法:?scaler.fit_transform()
#(2)數據處理
# 獲取特征值
boston_features = boston.data
# 獲取目標值
boston_targets = boston.target
# 標準化處理--正態(tài)分布
from sklearn.preprocessing import StandardScaler #導入標準化處理方法
scaler = StandardScaler() #接收標準化方法
# 將特征值數據傳入標準化轉換函數中
boston_features = scaler.fit_transform(boston_features)
?2.3 劃分訓練集和測試集
一般采用75%的數據用于訓練,25%用于測試,因此在數據進行預測之前,先要對數據劃分。
#(3)劃分訓練集和測試集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(boston_features,boston_targets,test_size=0.25)
如果有同學對測試集和訓練集劃分方法有疑問的可以看下文的第3.1小節(jié):【機器學習】(1) K近鄰算法:原理、實例應用(紅酒分類預測)附python完整代碼及數據集_小狄同學的博客-CSDN博客
2.4 使用正規(guī)方程方法預測
使用linear接收正規(guī)方程方法,訓練函數?.fit()?中傳入訓練值,預測函數?.predict()?傳入測試集的特征值x_test,而測試集的目標值y_test用來計算模型誤差。
# 導入正規(guī)方程方法
from sklearn.linear_model import LinearRegression
# linear接收正規(guī)化方法
linear = LinearRegression()
# 訓練,輸入訓練所需的特征值和目標值
linear.fit(x_train,y_train)
# 預測,輸入預測所需的特征值
linear_predict = linear.predict(x_test)
計算模型誤差
分別計算房價預測值 linear_predict?和真實值 y_test?之間的平均誤差和均方誤差,得到模型的平均誤差為3.5,均方誤差為21.2
# 使用平均誤差計算模型準確率
from sklearn.metrics import mean_absolute_error
# 傳入預測結果和真是結果計算平均誤差
linear_mean_absolute = mean_absolute_error(y_test,linear_predict)
# 使用均方誤差計算模型準確率
from sklearn.metrics import mean_squared_error
# 傳入預測結果和真是結果計算均方誤差
linear_mean_squared = mean_squared_error(y_test,linear_predict)
2.5 使用梯度下降法預測
與上述方法同理,sgd存放梯度下降方法,訓練函數.fit()中傳入訓練所需的特征值和目標值,預測函數.predict()中傳入預測所需的特征值x_test。
!注意!:在sklearn 模型訓練如果出現如下報錯:‘ValueError: Unknown label type: ‘unknown’’
這時在訓練所需的目標值后面加上 .astpye('str') 或 astype('int') 即可
如果訓練的目標值y_train是整型數據,寫成 fit(x_train,y_train.astype('int'))
如果訓練的目標值y_train是浮點型數據,寫成 fit(x_train,y_train.astype('str'))
#(5)使用梯度下降法預測
# 導入梯度下降法方法
from sklearn.linear_model import SGDClassifier
# sgd接收梯度下降方法
sgd = SGDClassifier()
# 訓練
sgd.fit(x_train,y_train.astype('str'))
# 預測
sgd_predict = sgd.predict(x_test)# 使用平均誤差計算準確率
sgd_mean_absolute = mean_absolute_error(y_test,sgd_predict)
# 使用均方誤差計算準確率
sgd_mean_squared = mean_squared_error(y_test,sgd_predict)
分別計算房價預測值 sgd_predict?和真實值 y_test?之間的平均誤差和均方誤差,得到模型的平均誤差為4.2,均方誤差為38.4
由此可見,在數據量較少的情況下,正規(guī)方程線性回歸比梯度下降線性回歸的準確率要稍微高一些
3. 正則化與嶺回歸
正則化(規(guī)整化)出現的目標是為了防止過擬合現象,公式如下:
在上一節(jié)中我們證明了推導了損失函數??的公式由來,MSE()也可以理解為損失函數。只有除的常數項不一樣,其他都一樣,如下式:
?,?
此外,式中???表示正則化,那么正則化的作用是什么呢,我舉個例子幫助大家理解。
????????假設現在有一組特征值x=[1,1,1,1],若在進行線性回歸的時候,權重??可以取兩組值,=[1,0,0,0],=[0.25,0.25,0.25,0.25],權重??和??與 x 相乘的結果相同。那我們究竟選那一組權重比較好呢,?這時帶入正則化方法,?正則化之后的結果為?,?正則化之后的結果為?,選擇正則化最小的這一組參數,因此我們選擇??這組參數。因為正則化結果越小,對應的權重越小,對模型越有利。若某一個特征權重很大,那么稍微一點點的變化都會對模型產生很大影響。
回到公式中,?代表懲罰力度,?越大,正則化越大,而我們選擇正則化后結果最小的那組參數。因此??越大,說明懲罰力度越大。但懲罰力度并不是越大越好,太大了,可能會導致模型處理擬合得不好,導致最終預測評分低。?需要不斷調試。
嶺回歸,就是加入了正則懲罰項的回歸,可用 sklearn.linear_model.Ridge 來實現。
from sklearn.linear_model import Ridge
ridge = Ridge( alpha = 1 )? ??
此處的 alpha 代表懲罰力度
我們使用嶺回歸方法再對這個例子進行預測
#(6)使用嶺回歸預測
# 導入嶺回歸方法
from sklearn.linear_model import Ridge
# 接收嶺回歸方法,自定義懲罰力度
ridge = Ridge(alpha=10)
# 訓練
ridge.fit(x_train,y_train)
# 預測
ridge_predict = ridge.predict(x_test)
# 誤差計算
# 平均誤差
ridge_mean_absolute = mean_absolute_error(y_test, ridge_predict)
# 均方誤差
ridge_mean_squared = mean_squared_error(y_test,ridge_predict)
# 輸出每一項的權重
ridge_coef = ridge.coef_
# 輸出偏移量
ridge_intercept = ridge.intercept_
得到房價預測值和真實值的平均誤差為3.2,均方誤差為20.4
查看每一項的權重值: ridge.coef_
查看偏移量的值: ridge.intercept_
即線性回歸公式中:?
完整代碼展示:?
#(1)數據獲取
from sklearn.datasets import load_boston
boston = load_boston() #保存波士頓房價數據集#(2)數據處理
# 獲取特征值
boston_features = boston.data
# 獲取目標值
boston_targets = boston.target
# 線性回歸對特征值比較敏感,數據對結果的影響比較大,如果有某一項過大,會產生很大影響
# 標準化處理--正態(tài)分布
from sklearn.preprocessing import StandardScaler #導入標準化處理方法
scaler = StandardScaler() #接收標準化方法
# 將特征值數據傳入標準化轉換函數中
boston_features = scaler.fit_transform(boston_features)#(3)劃分訓練集和測試集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(boston_features,boston_targets,test_size=0.25)#(4)使用正規(guī)方程預測
# 導入正規(guī)方程方法
from sklearn.linear_model import LinearRegression
# linear接收正規(guī)化方法
linear = LinearRegression()
# 訓練,輸入訓練所需的特征值和目標值
linear.fit(x_train,y_train)
# 預測,輸入預測所需的特征值
linear_predict = linear.predict(x_test)# 使用平均誤差計算模型準確率
from sklearn.metrics import mean_absolute_error
# 傳入預測結果和真是結果計算平均誤差
linear_mean_absolute = mean_absolute_error(y_test,linear_predict)
# 使用均方誤差計算模型準確率
from sklearn.metrics import mean_squared_error
# 傳入預測結果和真是結果計算均方誤差
linear_mean_squared = mean_squared_error(y_test,linear_predict)#(5)使用梯度下降法預測
# 導入梯度下降法方法
from sklearn.linear_model import SGDClassifier
# sgd接收梯度下降方法
sgd = SGDClassifier()
# 訓練
sgd.fit(x_train,y_train.astype('str'))
# 預測
sgd_predict = sgd.predict(x_test)# 使用平均誤差計算準確率
sgd_mean_absolute = mean_absolute_error(y_test,sgd_predict)
# 使用均方誤差計算準確率
sgd_mean_squared = mean_squared_error(y_test,sgd_predict)#(6)使用嶺回歸預測
# 導入嶺回歸方法
from sklearn.linear_model import Ridge
# 接收嶺回歸方法
ridge = Ridge(alpha=10)
# 訓練
ridge.fit(x_train,y_train)
# 預測
ridge_predict = ridge.predict(x_test)
# 誤差計算
# 平均誤差
ridge_mean_absolute = mean_absolute_error(y_test, ridge_predict)
# 均方誤差
ridge_mean_squared = mean_squared_error(y_test,ridge_predict)
# 輸出每一項的權重
ridge_coef = ridge.coef_
# 輸出偏移量
ridge_intercept = ridge.intercept_
總結
以上是生活随笔為你收集整理的【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习入门】(7) 线性回归算法:原
- 下一篇: 【机器学习入门】(10) 特征工程:特征