1. 程式人生 > >第四篇[機器學習] 機器學習,線性回歸的優化

第四篇[機器學習] 機器學習,線性回歸的優化

images .html span mod 來看 itl sso linear 我們

當我們的數據存在多重共線性時,即其中的一個自變量可以用其他一個或幾個自變量的線性表達式進行表示,你會發現,擬合之後的方差會特別大

一般說來當解釋變量的容忍度(TOLERANCE)小於0.10或者方差膨脹因子(VIF)大於10時,說明變量之間存在多重共線性現象,會影響到回歸模型的正確估計。

方差膨脹因子VIF=1/(1-r2),r是線性相關系數

具體可以參考:多重共線性,怎麽判斷是否有多重共線性,怎麽解決

scikit-learn介紹了一種嶺回歸,嶺回歸就是帶二範數懲罰的最小二乘回歸。

技術分享

通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價獲得回歸系數更為符合實際、更可靠的回歸方法,對病態數據的擬合要強於OLS。本質是在自變量信息矩陣的主對角線元素上人為地加入一個非負因子。

再來看看scikit-learn上面的代碼

#-*- coding: UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model

# X is the 10x10 Hilbert matrix
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
print (X)
print (y)

n_alphas = 10
alphas = np.logspace(-10, -2, n_alphas) #
創建以10的-10次方開始,10的-2次方結尾,元素個數為200的等比數列,賦值給alphas coefs = [] for a in alphas: ridge = linear_model.Ridge(alpha=a, fit_intercept=False) ridge.fit(X, y) coefs.append(ridge.coef_) ax = plt.gca() #獲取當前的axes繪圖區域 ax.plot(alphas, coefs) ax.set_xscale(log) ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis,間隔是10的-1次方
plt.xlabel(alpha) plt.ylabel(weights) plt.title(Ridge coefficients as a function of the regularization) plt.axis(tight) plt.show()

技術分享

在嶺跡圖中,當alpha值過大時,回歸系數趨近於零,當alpha越小時,相當於最小二乘法,回歸系數振蕩很大。

所以需要選取合適的系數值

嶺回歸和lasso回歸類似

原本是想用嶺回歸和lasso來再把titanic來一遍,不過,這個也沒有多重共線性問題,還是用接下來的邏輯回歸來嘗試一下吧。

羞愧的我。

第四篇[機器學習] 機器學習,線性回歸的優化