13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比
1.線性回歸
1.1 線性模型
試圖學得一個通過屬性的線性組合來進行預測的函數:
1.2 定義
定義:線性回歸通過一個或者多個自變量與因變量之間進行建模的回歸分析。其中特點為一個或多個稱為回歸系數的模型參數的線性組合。
一元線性回歸:涉及到的變量只有一個。
多元線性回歸:涉及到的變量兩個或兩個以上。
要注意的是:預測結果與真實值是有一定的誤差的。
單變量:
多變量:
1.3 損失函數(誤差大小)
如何去求模型當中的W,使得損失最小?
(目的是找到最小損失對應的W值)
缺點:當特征過于復雜,求解速度太慢;對于復雜的算法,不能使用正規方程求解(邏輯回歸等)
1.4 損失函數直觀圖(單變量舉例)
1.5 最小二乘法之梯度下降(理解過程)
我們以單變量中的w0,w1為例子:
理解:沿著這個函數下降的方向找,最后就能找到山谷的最低點,然后更新W值。
使用:面對訓練數據規模十分龐大的任務。
1.5 回歸性能評估
(均方誤差(Mean Squared Error)MSE)評價機制:
1.5.1 sklearn回歸評估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true, y_pred)均方誤差回歸損失y_true : 真實值y_pred : 預測值return : 浮點數結果注意:真實值,預測值為標準化之前的值。
1.6 sklearn線性回歸正規方程、梯度下降API
正規方程線性回歸(Normal Equation)
優點:直接求解,且誤差較小
缺點:當特征過多且過于復雜(維度>10000)時,求解速度太慢且得不到結果
案例一:
# -*- coding: UTF-8 -*-import sklearn from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pd## 設置字符集,防止中文亂碼 mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False# 定義目標函數通過改函數產生對應的y # y=1*x[0]+2*x[1]+....(n+1)*x[n] def l_model(x):params = np.arange(1,x.shape[-1]+1)y = np.sum(params*x)+np.random.randn(1)*0.1return y# 定義數據集 x = pd.DataFrame(np.random.rand(500,6)) y = x.apply(lambda x_rows:pd.Series(l_model(x_rows)),axis=1)print(x) print("--------------------------------------------") print(y) print("--------------------------------------------")# 劃分訓練集和測試集 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=2)# 數據標準化 ss = StandardScaler() x_train_s = ss.fit_transform(x_train) x_test_s = ss.transform(x_test)# 輸出下原數據的標準差和平均數 print(ss.scale_) print(ss.mean_)# 訓練模型 lr = LinearRegression() lr.fit(x_train_s,y_train)print(lr.coef_) print(lr.intercept_)# 用模型預測 y_predict=lr.predict(x_test_s) lr.score(x_test_s,y_test)## 預測值和實際值畫圖比較 t = np.arange(len(x_test_s)) plt.figure(facecolor='w') #建一個畫布,facecolor是背景色 plt.plot(t, y_test, 'r-', linewidth=2, label='真實值') plt.plot(t, y_predict, 'g-', linewidth=1, label='預測值') plt.legend(loc = 'upper left') #顯示圖例,設置圖例的位置 plt.title("線性回歸預測真實值之間的關系",fontsize=20) plt.grid(b=True) #加網格 plt.show()輸出結果:
0 1 2 3 4 5 0 0.121430 0.769888 0.595199 0.753939 0.655383 0.456001 1 0.553240 0.813419 0.001539 0.577961 0.319791 0.621340 2 0.182807 0.050649 0.749899 0.838822 0.484833 0.086469 3 0.192126 0.830503 0.542332 0.031367 0.164466 0.905168 4 0.504114 0.267268 0.927765 0.532320 0.519348 0.820886 .. ... ... ... ... ... ... 495 0.252219 0.710159 0.368021 0.383371 0.532386 0.783152 496 0.234624 0.356947 0.746875 0.466724 0.826973 0.748026 497 0.754129 0.086671 0.521319 0.397017 0.122910 0.363536 498 0.131987 0.627655 0.460967 0.217514 0.399104 0.352512 499 0.433256 0.185982 0.642580 0.014061 0.748104 0.219911 [500 rows x 6 columns] --------------------------------------------0 0 12.307726 1 9.914944 2 8.726742 3 9.821706 4 13.433480 .. ... 495 11.766508 496 13.585479 497 6.747270 498 7.694877 499 7.956194 [500 rows x 1 columns] -------------------------------------------- [0.29208501 0.29339293 0.28590121 0.29285606 0.28335227 0.30361955] [0.49172956 0.50414285 0.48561849 0.48097964 0.48482669 0.47370829] [[0.28845918 0.59197092 0.85958405 1.16537609 1.41842054 1.81026001]] [10.14439954]圖:
案例二:
https://blog.csdn.net/seagal890/article/details/105125566/
輸出結果:
Coefficients: [-1.12386867e-01 5.80587074e-02 1.83593559e-02 2.12997760e+00-1.95811012e+01 3.09546166e+00 4.45265228e-03 -1.50047624e+003.05358969e-01 -1.11230879e-02 -9.89007562e-01 7.32130017e-03-5.44644997e-01] Variance score: 0.7634174432138463圖片結果:
案例三:
隨機梯度下降線性回歸(Stochastic Gradient Descent,SGD)
優點:面對大量特征也能求得結果,且能夠找到較好的結果。
缺點:速度相對較慢,需要多次迭代,且需要調整學習率,當學習率調整不當時,可能會出現函數不收斂的情況。
案例:
# -*- coding: utf-8 -*-from sklearn.datasets import load_boston from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error,classification_report from sklearn.externals import joblibdef mylinear():"""線性回歸直接預測房子價格:return:"""# 獲取數據lb = load_boston(return_X_y=False)# 分割數據集到訓練集和測試集x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)print(y_train,y_test)# 進行標準化處理(?) 目標值處理?# 特征值和目標值是都必須進行標準化處理, 實例化兩個標準化APIstd_x = StandardScaler()x_train = std_x.fit_transform(x_train)x_test = std_x.transform(x_test)# 目標值std_y = StandardScaler()# 下面會報:ValueError: Expected 2D array, got 1D array instead: 的錯誤,是因為python3的原因y_train = std_y.fit_transform(y_train)y_test = std_y.transform(y_test)# 梯度下降去進行房價預測sgd = SGDRegressor()sgd.fit(x_train,y_train)print(sgd.coef_)# 預測測試集的房子價格y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))print("梯度下降測試集里面每個房子的預測價格:", y_sgd_predict)print("梯度下降的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))return Noneif __name__ == "__main__":mylinear()1.7 梯度下降 和 正規方程對比
特點: 線性回歸器是最簡單,易用的回歸模型。
線性回歸器是最為簡單、易用的回歸模型。從某種程度上限制了使用,盡管如此,在不知道特征之間關系的前提下,我們仍然使用線性回歸器作為大多數系統的首要選擇。
小規模數據:LinearRegression(不能解決擬合問題)以及其它
大規模數據:SGDRegressor
打個賞唄,您的支持是我堅持寫好博文的動力。
總結
以上是生活随笔為你收集整理的13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12_信息熵,信息熵公式,信息增益,决策
- 下一篇: 社会保障卡可以异地激活吗