13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比
1.線性回歸
1.1 線性模型
試圖學(xué)得一個通過屬性的線性組合來進(jìn)行預(yù)測的函數(shù):
1.2 定義
定義:線性回歸通過一個或者多個自變量與因變量之間進(jìn)行建模的回歸分析。其中特點為一個或多個稱為回歸系數(shù)的模型參數(shù)的線性組合。
一元線性回歸:涉及到的變量只有一個。
多元線性回歸:涉及到的變量兩個或兩個以上。
要注意的是:預(yù)測結(jié)果與真實值是有一定的誤差的。
單變量:
多變量:
1.3 損失函數(shù)(誤差大小)
如何去求模型當(dāng)中的W,使得損失最小?
(目的是找到最小損失對應(yīng)的W值)
缺點:當(dāng)特征過于復(fù)雜,求解速度太慢;對于復(fù)雜的算法,不能使用正規(guī)方程求解(邏輯回歸等)
1.4 損失函數(shù)直觀圖(單變量舉例)
1.5 最小二乘法之梯度下降(理解過程)
我們以單變量中的w0,w1為例子:
理解:沿著這個函數(shù)下降的方向找,最后就能找到山谷的最低點,然后更新W值。
使用:面對訓(xùn)練數(shù)據(jù)規(guī)模十分龐大的任務(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 : 預(yù)測值return : 浮點數(shù)結(jié)果注意:真實值,預(yù)測值為標(biāo)準(zhǔn)化之前的值。
1.6 sklearn線性回歸正規(guī)方程、梯度下降A(chǔ)PI
正規(guī)方程線性回歸(Normal Equation)
優(yōu)點:直接求解,且誤差較小
缺點:當(dāng)特征過多且過于復(fù)雜(維度>10000)時,求解速度太慢且得不到結(jié)果
案例一:
# -*- 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## 設(shè)置字符集,防止中文亂碼 mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False# 定義目標(biāo)函數(shù)通過改函數(shù)產(chǎn)生對應(yīng)的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# 定義數(shù)據(jù)集 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ùn)練集和測試集 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=2)# 數(shù)據(jù)標(biāo)準(zhǔn)化 ss = StandardScaler() x_train_s = ss.fit_transform(x_train) x_test_s = ss.transform(x_test)# 輸出下原數(shù)據(jù)的標(biāo)準(zhǔn)差和平均數(shù) print(ss.scale_) print(ss.mean_)# 訓(xùn)練模型 lr = LinearRegression() lr.fit(x_train_s,y_train)print(lr.coef_) print(lr.intercept_)# 用模型預(yù)測 y_predict=lr.predict(x_test_s) lr.score(x_test_s,y_test)## 預(yù)測值和實際值畫圖比較 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='預(yù)測值') plt.legend(loc = 'upper left') #顯示圖例,設(shè)置圖例的位置 plt.title("線性回歸預(yù)測真實值之間的關(guān)系",fontsize=20) plt.grid(b=True) #加網(wǎng)格 plt.show()輸出結(jié)果:
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/
輸出結(jié)果:
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圖片結(jié)果:
案例三:
隨機梯度下降線性回歸(Stochastic Gradient Descent,SGD)
優(yōu)點:面對大量特征也能求得結(jié)果,且能夠找到較好的結(jié)果。
缺點:速度相對較慢,需要多次迭代,且需要調(diào)整學(xué)習(xí)率,當(dāng)學(xué)習(xí)率調(diào)整不當(dāng)時,可能會出現(xiàn)函數(shù)不收斂的情況。
案例:
# -*- 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():"""線性回歸直接預(yù)測房子價格:return:"""# 獲取數(shù)據(jù)lb = load_boston(return_X_y=False)# 分割數(shù)據(jù)集到訓(xùn)練集和測試集x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)print(y_train,y_test)# 進(jìn)行標(biāo)準(zhǔn)化處理(?) 目標(biāo)值處理?# 特征值和目標(biāo)值是都必須進(jìn)行標(biāo)準(zhǔn)化處理, 實例化兩個標(biāo)準(zhǔn)化APIstd_x = StandardScaler()x_train = std_x.fit_transform(x_train)x_test = std_x.transform(x_test)# 目標(biāo)值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)# 梯度下降去進(jìn)行房價預(yù)測sgd = SGDRegressor()sgd.fit(x_train,y_train)print(sgd.coef_)# 預(yù)測測試集的房子價格y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))print("梯度下降測試集里面每個房子的預(yù)測價格:", y_sgd_predict)print("梯度下降的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))return Noneif __name__ == "__main__":mylinear()1.7 梯度下降 和 正規(guī)方程對比
特點: 線性回歸器是最簡單,易用的回歸模型。
線性回歸器是最為簡單、易用的回歸模型。從某種程度上限制了使用,盡管如此,在不知道特征之間關(guān)系的前提下,我們?nèi)匀皇褂镁€性回歸器作為大多數(shù)系統(tǒng)的首要選擇。
小規(guī)模數(shù)據(jù):LinearRegression(不能解決擬合問題)以及其它
大規(guī)模數(shù)據(jù):SGDRegressor
打個賞唄,您的支持是我堅持寫好博文的動力。
總結(jié)
以上是生活随笔為你收集整理的13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12_信息熵,信息熵公式,信息增益,决策
- 下一篇: 社会保障卡可以异地激活吗