日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比

發布時間:2024/9/27 编程问答 28 豆豆

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)時,求解速度太慢且得不到結果

sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False,copy_X=True, n_jobs=1) 通過正規方程優化fit_intercept : 默認為True,是否計算該模型的偏置。如果使用中心化的數據,可以考慮設置為False,不考慮偏置。注意這里是考慮,一般還是要考慮偏置。 normalize : 默認為false。當fit_intercept設置為false的時候,這個參數會被自動忽略。如果為True,回歸器會標準化輸入參數:減去平均值,并且除以相應的二范數。當然啦,在這里還是建議將標準化的工作放在訓練模型之前。通過設置sklearn.preprocessing.StandardScaler來實現,而在此處設置為false. copy_X : 默認為True,否則X會被改寫。 n_jobs : int默認為1.-1時默認使用全部CPUs可用屬性: coef_:如果輸入的是多目標問題,則返回一個二維數組(n_targets, n_features);如果是單目標問題,返回一個一維數組 (n_features,) intercept_:偏置,線性模型中的獨立項 rank_:矩陣X的秩,僅在X為密集矩陣時有效。 輸出:矩陣X的秩 singular_:矩陣X的奇異值,僅在X密集矩陣時有效。可用的methods: fit(X,y,sample_weight=None): 訓練模型,sample_weight為每個樣本權重值,默認NoneX: array, 稀疏矩陣 [n_samples,n_features]y: array [n_samples, n_targets]sample_weight: 權重 array [n_samples]get_params(self[,deep=True]):deep默認為True,返回一個字典,鍵為參數名,值為估計器參數值predict(self,X):模型預測,返回預測值,預測基于R^2值score(self,X,y[,sample_weight]):模型評估,返回R^2系數,最優值為1,說明所有數據都預測正確set_params(self, **params)設置估計器的參數,可以修改參數重新訓練

案例一:

# -*- 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/

# -*- coding: utf-8 -*-import matplotlib.pyplot as plt from sklearn import datasets, linear_model, metrics from sklearn.model_selection import train_test_split# load the boston dataset boston = datasets.load_boston(return_X_y=False)# defining feature matrix(X) and response vector(y) X = boston.data y = boston.target# splitting X and y into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)# create linear regression object reg = linear_model.LinearRegression()# train the model using the training sets reg.fit(X_train, y_train)# regression coefficients print('Coefficients: \n', reg.coef_)# variance score: 1 means perfect prediction print('Variance score: {}'.format(reg.score(X_test, y_test)))# plot for residual error# setting plot style plt.style.use('fivethirtyeight')# plotting residual errors in training data plt.scatter(reg.predict(X_train), reg.predict(X_train) - y_train, color="red", s=10, label='Train data')# plotting residual errors in test data plt.scatter(reg.predict(X_test), reg.predict(X_test) - y_test, color="blue", s=10, label='Test data')# plotting line for zero residual error plt.hlines(y=0, xmin=0, xmax=50, linewidth=2)# plotting legend plt.legend(loc='upper right')# plot title plt.title("Residual errors")# function to show plot plt.show()

輸出結果:

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

圖片結果:

案例三:

# -*- 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)# estimator預測# 正規方程求解方式預測結果lr = LinearRegression()lr.fit(x_train, y_train)print(lr.coef_)# 保存訓練好的模型joblib.dump(lr, "./tmp/test.pkl")# 預測測試集的房子價格y_lr_predict = std_y.inverse_transform(lr.predict(x_test))print("正規方程測試集里面每個房子的預測價格:", y_lr_predict)print("正規方程的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))# 預測房價結果# model = joblib.load("./tmp/test.pkl")# y_predict = std_y.inverse_transform(model.predict(x_test))# print("保存的模型預測的結果:", y_predict)return Noneif __name__ == "__main__":mylinear()

隨機梯度下降線性回歸(Stochastic Gradient Descent,SGD)
優點:面對大量特征也能求得結果,且能夠找到較好的結果。
缺點:速度相對較慢,需要多次迭代,且需要調整學習率,當學習率調整不當時,可能會出現函數不收斂的情況。

sklearn.linear_model.SGDRegressor(loss=’squared_loss’,fit_intercept=True,learning_rate=’invscaling’,eta0=0.01) SGDRegressor類實現了隨機梯度下降學習,它支持不同的loss函數和正則化懲罰項來擬合線性回歸模型loss:損失類型loss='squared_loss':普通最小二乘法 fit_intercept:是否計算偏置 learning_rate:string,optional學習率填充1'constant':eta = eta02'optimal':eta=1.0 / (alpha * (t + t0)) [default]3'invscaling':eta=eta0 / pow(t,power_t)power_t = 0.25 : 存在父類當中4、對于一個常數值的學習率來說,可以使用learning_rate=’constant’,并使用eta0來指定學習率。SGDRegressor.coef_:回歸系數 SGDRegressor.intercept_:偏置

案例:

# -*- 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、梯度下降 和 正规方程对比的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。