P37 Ridge嶺迴歸分析
阿新 • • 發佈:2020-12-24
http://bilibili.com/video/BV184411Q7Ng?p=37
#python嶺迴歸進行房間預測:
#load_boston裡面的數值都是連續的 from sklearn.datasets import load_boston #從sklearn中的線性模型匯入線性迴歸,SGD隨機梯度下降 from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScalerfrom sklearn.metrics import mean_squared_error def mylinear(): """ 線性迴歸預測房子價格 :return: """ # 獲取資料 lb=load_boston() # 分割資料集到訓練集和測試集 x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25) #print(y_train) #列印訓練樣本 #print("\n") #print(y_test) #列印測試樣本 # 對特徵值進行標準化處理,目標值要不要進行標準化處理?答:也要標準化,因為特徵值標準化之後,乘以小權重之後,得到 # 的值肯定也很小,這與原本的目標值相差會很大 # 特徵值和目標值都必須進行標準化處理,例項化兩個標準化API std_x=StandardScaler() #x_train=std_x.fit_transform(x_train.reshape(-1,13)) #x_test=std_x.fit_transform(x_test.reshape(-1,13)) x_train=std_x.fit_transform(x_train) x_test=std_x.fit_transform(x_test) # 對目標值進行標準化 std_y=StandardScaler() y_train=std_y.fit_transform(y_train.reshape(-1,1)) #樣本訓練標籤y_train源程式提供的是1維資料, # 這裡要做一個維度的形狀轉換,1維->2維,不知道有多少個樣本,所以第一個引數是"-1",但是每個樣本都只有一個目標值 y_test=std_y.transform(y_test.reshape(-1,1)) #y_train=std_y.fit_transform(y_train) #樣本訓練標籤y_train源程式提供的是1維資料, # 這裡要做一個維度的形狀轉換,1維->2維,不知道有多少個樣本,所以第一個引數是"-1",但是每個樣本都只有一個目標值 #x_test=std_y.transform(y_test) #estimator預測 # 首先使用正規方程求解方式預測結果: zhengguifunction=LinearRegression() zhengguifunction.fit(x_train,y_train) #print("通過正規方程的方法求解的迴歸方程的係數是:\n",zhengguifunction.coef_) # 打印出求解的權重引數 # 沒有準確率了,但是可以使用求出的權重預測測試集樣本的價格 #y_predict=lr.predict(x_test) #這個是根據測試樣本預測的價格 # 之前標準化了,現在轉化回去,不然預測的都是小值 y_zhengguifunction_predict = std_y.inverse_transform(zhengguifunction.predict(x_test)) # 這個是根據測試樣本預測的價格 #print("正規方程的方法,測試集裡面每個測試樣本中房子的預測價格是:\n",y_zhengguifunction_predict) #打印出預測價格 print("正規方程的均方誤差是:",mean_squared_error(std_y.inverse_transform(y_test),y_zhengguifunction_predict),'單位是:萬元的平方') # 通過梯度下降的方式進行房價預測: #lr=LinearRegression() sgdmethod=SGDRegressor() #SGD是隨機梯度下降的意思,regressor就是迴歸的意思 sgdmethod.fit(x_train,y_train) sgdmethod.coef_=sgdmethod.coef_.reshape(1,-1) #print("通過梯度下降的方法迭代求解的迴歸方程的係數是:\n",sgdmethod.coef_) # 打印出求解的權重引數 # 沒有準確率了,但是可以使用求出的權重預測測試集樣本的價格 #y_predict=lr.predict(x_test) #這個是根據測試樣本預測的價格 # 之前標準化了,現在轉化回去,不然預測的都是小值 y_sgdmethod_predict = std_y.inverse_transform(sgdmethod.predict(x_test)) # 這個是根據測試樣本預測的價格 y_sgdmethod_predict=y_sgdmethod_predict.reshape(-1,1) #print("梯度下降的方法,測試集裡面每個測試樣本中房子的預測價格是:\n",y_sgdmethod_predict) #打印出預測價格 print("梯度下降的均方誤差是:", mean_squared_error(std_y.inverse_transform(y_test), y_sgdmethod_predict),'單位是:萬元的平方') # 通過嶺迴歸的方式進行房價預測: sgd_Ridge=Ridge(alpha=1.0) #alpha是迴歸力度引數 sgd_Ridge.fit(x_train,y_train) sgd_Ridge.coef_=sgd_Ridge.coef_.reshape(1,-1) #print("通過梯度下降的方法迭代求解的迴歸方程的係數是:\n",sgdmethod.coef_) # 打印出求解的權重引數 # 之前標準化了,現在轉化回去,不然預測的都是小值 sgd_Ridge_predict = std_y.inverse_transform(sgd_Ridge.predict(x_test)) # 這個是根據測試樣本預測的價格 sgd_Ridge_predict=sgd_Ridge_predict.reshape(-1,1) #print("梯度下降的方法,測試集裡面每個測試樣本中房子的預測價格是:\n",sgd_Ridge_predict) #打印出預測價格 print("嶺迴歸的均方誤差是:", mean_squared_error(std_y.inverse_transform(y_test), sgd_Ridge_predict),'單位是:萬元的平方') # 下面列印正規方程和隨機梯度下降分別預測的權重係數的差值 #print("通過正規方程方法求得的係數和隨機梯度下降迭代求得的係數差值是:") #for i in range(sgdmethod.coef_.shape[1]): # print(sgdmethod.coef_[0][i]-zhengguifunction.coef_[0][i]) # 下面列印正規方程和隨機梯度下降分別預測的房價的差值 #print("通過正規方程方法預測的房價和隨機梯度下降迭代預測的房價的差值是:") #for i in range(y_sgdmethod_predict.shape[0]): # print("%.1f"%abs((y_sgdmethod_predict[i][0]-y_zhengguifunction_predict[i][0])*10),"千元") return None if __name__=="__main__": mylinear()
執行結果:
C:\Users\TJ\AppData\Local\Programs\Python\Python37\python.exe D:/qcc/python/mnist/fangjia_yuce.py
正規方程的均方誤差是: 22.63101875379508 單位是:萬元的平方
梯度下降的均方誤差是: 23.391171004734396 單位是:萬元的平方
嶺迴歸的均方誤差是: 22.639158049580825 單位是:萬元的平方
- 可見,加了正則化的線性迴歸好於一般的線性迴歸。
病態資料:異常資料,有異常資料的話最容易出現過擬合的情況,而嶺迴歸能在一定程度上抵抗這種異常資料。