机器学习线性回归——概念梳理及非线性拟合
活動地址:CSDN21天學習挑戰賽
在學術研究和工程實踐中,線性回歸的概念廣為人知。雖然線性回歸模型簡單,但卻涵蓋了機器學習中相當多的內容,在某些場景,線性回歸模型是十分有效的,即使在非線性的場合,借助核函數的思想,線性回歸也能勝任。其充分體現了奧卡姆剃刀原理:如無必要,勿增實體。正所謂大道至簡。
本文總結了學習線性回歸時的一些記錄,同時也對線性回歸的概念做了一些梳理
從最大似然估計理解線性回歸
在解決實際問題時,很多隨機現象可以看做眾多因素獨立作用的綜合反應,這類隨機現象往往近似服從正態分布。
回到線性回歸中,最初,我們使用預測結果與真實結果之間的距離來定義目標函數,通過使目標函數最小,來得到最優的回歸系數。
另一方面,我們假設預測結果與真實結果之間的誤差是獨立同分布的,服從均值為0的高斯分布,通過最大似然估計的方法,同樣也可以得到類似通過距離定義的目標函數,同樣通過使目標函數最小,來得到最優的回歸系數。
三種梯度下降的策略
在求解上面定義的目標函數最小值的過程中,我們可以使用直接法或梯度下降法,直接法要求損失函數有解析解,而梯度下降算法對目標函數的要求較低,在應用中則更為普遍。
而在梯度下降法中,根據實際情況,有三種策略:
1、 批量梯度下降
根據所有樣本的平均梯度更新回歸系數
2、 隨機梯度下降
每拿到一個樣本,就根據其梯度更新回歸系數
3、 mini-batch
每次根據若干個而非全部樣本的平均梯度更新回歸系數
正則化策略
上面的求解過程是以測試數據為基礎的,容易造成過擬合,影響模型的泛化能力,即在其他數據上的預測能力,所以引入了正則化策略,正則化策略有三種:
1、 嶺回歸:給目標函數添加L2正則化項,即在使目標函數最小化的同時,使回歸系數的平方和最小
2、 Lasso回歸:給目標函數添加L1正則化項
3、 ElasticNe回歸:給目標函數添加L1正則化項和L2正則化項
模型的評價
在回歸分析中,最常用的評價模型的指標就是均方差MSE以及均方根誤差RMSE,除此之外,還有回歸平方和ESS、殘差平方和RSS、總體平方和TSS以及R2
?
? ? ? ? ? ? ? ? ? ??
案例:波士頓房價預測
?
數據格式如下圖所示,最后一列為目標值,即房價,前面13列為屬性:
代碼如下:
import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV from sklearn.pipeline import Pipeline from sklearn.metrics import mean_squared_errordef not_empty(s):return s != ''if __name__ == "__main__":# 加載數據并作前置處理file_data = pd.read_csv('housing.data', header=None)data = np.empty((len(file_data), 14))for i, d in enumerate(file_data.values):d = list(map(float, list(filter(not_empty, d[0].split(' ')))))data[i] = dx, y = np.split(data, (13,), axis=1)y = y.ravel()# 拆分訓練數據和測試數據x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=0)# 定義模型,二次特征+線性回歸,其中線性回歸分別采用無正則化/Ridge正則化/LASSO正則化/ElasticNet正則化models = [Pipeline([('poly', PolynomialFeatures()), ('linear', LinearRegression(fit_intercept=False))]),Pipeline([('poly', PolynomialFeatures()), ('linear', RidgeCV(fit_intercept=False))]),Pipeline([('poly', PolynomialFeatures()), ('linear', LassoCV(fit_intercept=False))]),Pipeline([('poly', PolynomialFeatures()),('linear', ElasticNetCV(l1_ratio=[0.1, 0.3, 0.5, 0.7, 0.99, 1], fit_intercept=False))])]# 模型標題model_titles = ["二次特征+簡單線性回歸", "二次特征+嶺回歸", "二次特征+LASSO回歸", "二次特征+ElasticNet回歸"]mpl.rcParams['font.sans-serif'] = ['simHei']mpl.rcParams['axes.unicode_minus'] = False# 繪圖準備plt.figure(figsize=(15, 10), facecolor='w')# 遍歷所有模型,分別利用不同的模型進行擬合for i in range(len(models)):plt.subplot(2, 2, i + 1)# 當前模型model = models[i]print('開始建模: {}'.format(model_titles[i]))# 訓練模型model.fit(x_train, y_train)# 對測試數據目標值(房價)進行排序,方便顯示order = y_test.argsort(axis=0)y_test = y_test[order]x_test = x_test[order, :]# 對測試數據進行預測y_pred = model.predict(x_test)# R2r2 = model.score(x_test, y_test)# 均方誤差mse = mean_squared_error(y_test, y_pred)print('R2:', r2)print('均方誤差:', mse)# 繪制子圖t = np.arange(len(y_pred))plt.plot(t, y_test, 'r-', lw=2, label='真實值')plt.plot(t, y_pred, 'g-', lw=2, label='估計值')plt.legend(loc='upper left')plt.grid(True)plt.title(model_titles[i], fontsize=18)plt.xlabel('樣本編號', fontsize=15)plt.ylabel('房屋價格', fontsize=15)plt.tight_layout()plt.show()# plt.savefig('Boston.png', dpi=800)代碼運行結果如下:
作者這水平有限,有不足之處歡迎留言指正
?
?
總結
以上是生活随笔為你收集整理的机器学习线性回归——概念梳理及非线性拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高质量解读《互联网企业安全高级指南》三部
- 下一篇: Linux 安装 RabbitMq 详细