下面是一組用於回歸的方法,其中目標值 y 是輸入變量 x 的線性組合。 在數學概念中,如果 是預測值。
在整個模塊中,我們定義向量 作為 coef_ ,定義 作為 intercept_ 。
如果需要使用廣義線性模型進行分類,請參閱 logistic 回歸 。
1.1.1. 普通最小二乘法LinearRegression 擬合一個帶有係數 的線性模型,使得數據集實際觀測數據和預測數據(估計值)之間的殘差平方和最小。其數學表達式為:
LinearRegression 會調用 fit 方法來擬合數組 X, y,並且將線性模型的係數 存儲在其成員變量 coef_ 中:
>>>
>>> from sklearn import linear_model>>> reg = linear_model.LinearRegression()>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)>>> reg.coef_array([ 0.5, 0.5])
然而,對於普通最小二乘的係數估計問題,其依賴於模型各項的相互獨立性。當各項是相關的,且設計矩陣 的各列近似線性相關,那麼,設計矩陣會趨向於奇異矩陣,這會導致最小二乘估計對於隨機誤差非常敏感,產生很大的方差。例如,在沒有實驗設計的情況下收集到的數據,這種多重共線性(multicollinearity)的情況可能真的會出現。
示例:
1.1.1.1. 普通最小二乘法複雜度該方法使用 X 的奇異值分解來計算最小二乘解。如果 X 是一個 size 為 (n, p) 的矩陣,設 ,則該方法的複雜度為
1.1.2. 嶺回歸Ridge 回歸通過對係數的大小施加懲罰來解決 普通最小二乘法 的一些問題。 嶺係數最小化的是帶罰項的殘差平方和,
其中, 是控制係數收縮量的複雜性參數: 的值越大,收縮量越大,這樣係數對共線性的魯棒性也更強。
與其他線性模型一樣, Ridge 用 fit 方法將模型係數 存儲在其 coef_ 成員中:
>>>
>>> from sklearn import linear_model>>> reg = linear_model.Ridge (alpha = .5)>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None, normalize=False, random_state=None, solver='auto', tol=0.001)>>> reg.coef_array([ 0.34545455, 0.34545455])>>> reg.intercept_ 0.13636...
示例:
1.1.2.1. 嶺回歸的複雜度這種方法與 普通最小二乘法 的複雜度是相同的.
1.1.2.2. 設置正則化參數:廣義交叉驗證RidgeCV 通過內置的 Alpha 參數的交叉驗證來實現嶺回歸。 該對象與 GridSearchCV 的使用方法相同,只是它默認為 Generalized Cross-Validation(廣義交叉驗證 GCV),這是一種有效的留一驗證方法(LOO-CV):
>>>
>>> from sklearn import linear_model>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None, normalize=False)>>> reg.alpha_ 0.1
參考
1.1.3. LassoThe Lasso 是估計稀疏係數的線性模型。 它在一些情況下是有用的,因為它傾向於使用具有較少參數值的情況,有效地減少給定解決方案所依賴變量的數量。 因此,Lasso 及其變體是壓縮感知領域的基礎。 在一定條件下,它可以恢復一組非零權重的精確集(見 Compressive sensing: tomography reconstruction with L1 prior (Lasso) )。
在數學公式表達上,它由一個帶有 先驗的正則項的線性模型組成。 其最小化的目標函數是:
lasso estimate 解決了加上罰項 的最小二乘法的最小化,其中, 是一個常數, 是參數向量的 -norm 範數。
Lasso 類的實現使用了 coordinate descent (坐標下降算法)來擬合係數。 查看 最小角回歸 ,這是另一種方法:
>>>
>>> from sklearn import linear_model>>> reg = linear_model.Lasso(alpha = 0.1)>>> reg.fit([[0, 0], [1, 1]], [0, 1])Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False)>>> reg.predict([[1, 1]])array([ 0.8])
對於較低級別的任務,同樣有用的是函數 lasso_path 。它能夠通過搜索所有可能的路徑上的值來計算係數。
舉例:
Note
Feature selection with Lasso(使用 Lasso 進行特徵選擇)
由於 Lasso 回歸產生稀疏模型,因此可以用於執行特徵選擇,詳見 基於 L1 的特徵選取 (基於 L1 的特徵選擇)。
1.1.3.1. 設置正則化參數alpha 參數控制估計係數的稀疏度。1.1.3.1.1. 使用交叉驗證scikit-learn 通過交叉驗證來公開設置 Lasso alpha 參數的對象: LassoCV 和 LassoLarsCV。 LassoLarsCV 是基於下面解釋的 最小角回歸 算法。
對於具有許多線性回歸的高維數據集, LassoCV 最常見。 然而,LassoLarsCV 在尋找 alpha 參數值上更具有優勢,而且如果樣本數量與特徵數量相比非常小時,通常 LassoLarsCV 比 LassoCV 要快。
有多種選擇時,估計器 LassoLarsIC 建議使用 Akaike information criterion (Akaike 信息準則)(AIC)和 Bayes Information criterion (貝葉斯信息準則)(BIC)。 當使用 k-fold 交叉驗證時,正則化路徑只計算一次而不是 k + 1 次,所以找到 α 的最優值是一種計算上更便宜的替代方法。 然而,這樣的標準需要對解決方案的自由度進行適當的估計,對於大樣本(漸近結果)導出,並假設模型是正確的,即數據實際上是由該模型生成的。 當問題嚴重受限(比樣本更多的特徵)時,他們也傾向於打破。
示例:
1.1.3.1.3. 與 SVM 的正則化參數的比較alpha 和 SVM 的正則化參數``C`` 之間的等式關係是 alpha = 1 / C 或者 alpha = 1 / (n_samples * C) ,並依賴於估計器和模型優化的確切的目標函數。 .. _multi_task_lasso:
1.1.4. 多任務 LassoMultiTaskLasso 是一個估計多元回歸稀疏係數的線性模型: y 是一個 (n_samples, n_tasks) 的二維數組,其約束條件和其他回歸問題(也稱為任務)是一樣的,都是所選的特徵值。下圖比較了通過使用簡單的 Lasso 或 MultiTaskLasso 得到的 W 中非零的位置。 Lasso 估計產生分散的非零值,而 MultiTaskLasso 的一整列都是非零的。
擬合 time-series model (時間序列模型),強制任何活動的功能始終處於活動狀態。
示例:
在數學上,它由一個線性模型組成,以混合的 作為正則化器進行訓練。目標函數最小化是:
其中 表示 Frobenius 標準:
並且 讀取為:
MultiTaskLasso 類的實現使用了坐標下降作為擬合係數的算法。
1.1.5. 彈性網絡彈性網絡 是一種使用 L1, L2 範數作為先驗正則項訓練的線性回歸模型。 這種組合允許學習到一個只有少量參數是非零稀疏的模型,就像 Lasso 一樣,但是它仍然保持 一些像 Ridge 的正則性質。我們可利用 l1_ratio 參數控制 L1 和 L2 的凸組合。
彈性網絡在很多特徵互相聯繫的情況下是非常有用的。Lasso 很可能只隨機考慮這些特徵中的一個,而彈性網絡更傾向於選擇兩個。
在實踐中,Lasso 和 Ridge 之間權衡的一個優勢是它允許在循環過程(Under rotate)中繼承 Ridge 的穩定性。
在這裡,最小化的目標函數是
lasticNetCV 類可以通過交叉驗證來設置參數 alpha ( ) 和 l1_ratio ( ) 。
示例:
1.1.6. 多任務彈性網絡MultiTaskElasticNet 是一個對多回歸問題估算稀疏參數的彈性網絡: Y 是一個二維數組,形狀是 (n_samples,n_tasks)。 其限制條件是和其他回歸問題一樣,是選擇的特徵,也稱為 tasks 。從數學上來說, 它包含一個混合的 先驗和 先驗為正則項訓練的線性模型 目標函數就是最小化:
在 MultiTaskElasticNet 類中的實現採用了坐標下降法求解參數。
在 MultiTaskElasticNetCV 中可以通過交叉驗證來設置參數 alpha ( ) 和 l1_ratio ( ) 。
1.1.7. 最小角回歸最小角回歸 (LARS) 是對高維數據的回歸算法, 由 Bradley Efron, Trevor Hastie, Iain Johnstone 和 Robert Tibshirani 開發完成。 LARS 和逐步回歸很像。在每一步,它尋找與響應最有關聯的 預測。當有很多預測有相同的關聯時,它沒有繼續利用相同的預測,而是在這些預測中找出應該等角的方向。
LARS的優點:
當 p >> n,該算法數值運算上非常有效。(例如當維度的數目遠超點的個數)
它在計算上和前向選擇一樣快,和普通最小二乘法有相同的運算複雜度。
它產生了一個完整的分段線性的解決路徑,在交叉驗證或者其他相似的微調模型的方法上非常有用。
如果兩個變量對響應幾乎有相等的聯繫,則它們的係數應該有相似的增長率。因此這個算法和我們直覺 上的判斷一樣,而且還更加穩定。
它很容易修改並為其他估算器生成解,比如Lasso。
LARS 的缺點:
LARS 模型可以在 Lars ,或者它的底層實現 lars_path 中被使用。
1.1.8. LARS LassoLassoLars 是一個使用 LARS 算法的 lasso 模型,不同於基於坐標下降法的實現,它可以得到一個精確解,也就是一個關於自身參數標準化後的一個分段線性解。
>>>
>>> from sklearn import linear_model>>> reg = linear_model.LassoLars(alpha=.1)>>> reg.fit([[0, 0], [1, 1]], [0, 1]) LassoLars(alpha=0.1, copy_X=True, eps=..., fit_intercept=True, fit_path=True, max_iter=500, normalize=True, positive=False, precompute='auto', verbose=False)>>> reg.coef_ array([ 0.717157..., 0. ])
示例:
Lars 算法提供了一個幾乎無代價的沿著正則化參數的係數的完整路徑,因此常利用函數 lars_path 來取迴路徑。
1.1.8.1. 數學表達式該算法和逐步回歸非常相似,但是它沒有在每一步包含變量,它估計的參數是根據與 其他剩餘變量的聯繫來增加的。
在 LARS 的解中,沒有給出一個向量的結果,而是給出一條曲線,顯示參數向量的 L1 範式的每個值的解。 完全的參數路徑存在 coef_path_ 下。它的 size 是 (n_features, max_features+1)。 其中第一列通常是全 0 列。
參考文獻:
1.1.9. 正交匹配追蹤法(OMP)OrthogonalMatchingPursuit (正交匹配追蹤法)和 orthogonal_mp使用了 OMP 算法近似擬合了一個帶限制的線性模型,該限制影響於模型的非 0 係數(例:L0 範數)。
就像最小角回歸一樣,作為一個前向特徵選擇方法,正交匹配追蹤法可以近似一個固定非 0 元素的最優向量解:
正交匹配追蹤法也可以針對一個特殊的誤差而不是一個特殊的非零係數的個數。可以表示為:
OMP 是基於每一步的貪心算法,其每一步元素都是與當前殘差高度相關的。它跟較為簡單的匹配追蹤(MP)很相似,但是相比 MP 更好,在每一次迭代中,可以利用正交投影到之前選擇的字典元素重新計算殘差。
示例:
參考文獻:
http://www.cs.technion.ac.il/~ronrubin/Publications/KSVD-OMP-v2.pdf
Matching pursuits with time-frequency dictionaries, S. G. Mallat, Z. Zhang,
1.1.10. 貝葉斯回歸貝葉斯回歸可以用於在預估階段的參數正則化: 正則化參數的選擇不是通過人為的選擇,而是通過手動調節數據值來實現。
上述過程可以通過引入 無信息先驗 於模型中的超參數來完成。 在 嶺回歸 中使用的 正則項相當於在 為高斯先驗條件下,且此先驗的精確度為 求最大後驗估計。在這裡,我們沒有手工調參數 lambda ,而是讓他作為一個變量,通過數據中估計得到。
為了得到一個全概率模型,輸出 也被認為是關於 的高斯分布。
Alpha 在這裡也是作為一個變量,通過數據中估計得到。
貝葉斯回歸有如下幾個優點:
它能根據已有的數據進行改變。
它能在估計過程中引入正則項。
貝葉斯回歸有如下缺點:
參考文獻
1.1.10.1. 貝葉斯嶺回歸BayesianRidge 利用概率模型估算了上述的回歸問題,其先驗參數 是由以下球面高斯公式得出的:先驗參數 和 一般是服從 gamma 分布 , 這個分布與高斯成共軛先驗關係。
得到的模型一般稱為 貝葉斯嶺回歸, 並且這個與傳統的 Ridge 非常相似。參數 , 和 是在模型擬合的時候一起被估算出來的。 剩下的超參數就是 關於:math:alpha 和 的 gamma 分布的先驗了。 它們通常被選擇為 無信息先驗 。模型參數的估計一般利用最大 邊緣似然對數估計 。
默認 .
貝葉斯嶺回歸用來解決回歸問題:
>>>
>>> from sklearn import linear_model>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]>>> Y = [0., 1., 2., 3.]>>> reg = linear_model.BayesianRidge()>>> reg.fit(X, Y)BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True, fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300, normalize=False, tol=0.001, verbose=False)
在模型訓練完成後,可以用來預測新值:
>>>
>>> reg.predict ([[1, 0.]])array([ 0.50000013])
權值 可以被這樣訪問:
>>>
>>> reg.coef_array([ 0.49999993, 0.49999993])
由於貝葉斯框架的緣故,權值與 普通最小二乘法 產生的不太一樣。 但是,貝葉斯嶺回歸對病態問題(ill-posed)的魯棒性要更好。
示例:
參考文獻
1.1.10.2. 主動相關決策理論 - ARDARDRegression (主動相關決策理論)和 `Bayesian Ridge Regression`_ 非常相似,它採用 分布是與軸平行的橢圓高斯分布。
也就是說,每個權值 從一個中心在 0 點,精度為 的高斯分布中採樣得到的。
並且 .
與 `Bayesian Ridge Regression`_ 不同, 每個 都有一個標準差 。所有 的先驗分布 由超參數 、 確定的相同的 gamma 分布確定。
ARD 也被稱為 稀疏貝葉斯學習 或 相關向量機 [3] [4] 。
示例:
參考文獻:
1.1.11. logistic 回歸logistic 回歸,雖然名字裡有 「回歸」 二字,但實際上是解決分類問題的一類線性模型。在某些文獻中,logistic 回歸又被稱作 logit 回歸,maximum-entropy classification(MaxEnt,最大熵分類),或 log-linear classifier(對數線性分類器)。該模型利用函數 logistic function 將單次試驗(single trial)的可能結果輸出為概率。
scikit-learn 中 logistic 回歸在 LogisticRegression 類中實現了二分類(binary)、一對多分類(one-vs-rest)及多項式 logistic 回歸,並帶有可選的 L1 和 L2 正則化。
作為優化問題,帶 L2 罰項的二分類 logistic 回歸要最小化以下代價函數(cost function):
類似地,帶 L1 正則的 logistic 回歸解決的是如下優化問題:
在 LogisticRegression 類中實現了這些優化算法: 「liblinear」, 「newton-cg」, 「lbfgs」, 「sag」 和 「saga」。
「liblinear」 應用了坐標下降算法(Coordinate Descent, CD),並基於 scikit-learn 內附的高性能 C++ 庫 LIBLINEAR library 實現。不過 CD 算法訓練的模型不是真正意義上的多分類模型,而是基於 「one-vs-rest」 思想分解了這個優化問題,為每個類別都訓練了一個二元分類器。因為實現在底層使用該求解器的 LogisticRegression 實例對象表面上看是一個多元分類器。 sklearn.svm.l1_min_c 可以計算使用 L1 罰項時 C 的下界,以避免模型為空(即全部特徵分量的權重為零)。
「lbfgs」, 「sag」 和 「newton-cg」 solvers (求解器)只支持 L2 懲罰項,對某些高維數據收斂更快。這些求解器的參數 `multi_class`設為 「multinomial」 即可訓練一個真正的多項式 logistic 回歸 [5] ,其預測的概率比默認的 「one-vs-rest」 設定更為準確。
「sag」 求解器基於平均隨機梯度下降算法(Stochastic Average Gradient descent) [6]。在大數據集上的表現更快,大數據集指樣本量大且特徵數多。
「saga」 求解器 [7] 是 「sag」 的一類變體,它支持非平滑(non-smooth)的 L1 正則選項 penalty="l1" 。因此對於稀疏多項式 logistic 回歸 ,往往選用該求解器。
一言以蔽之,選用求解器可遵循如下規則:
CaseSolverL1正則「liblinear」 or 「saga」多項式損失(multinomial loss)「lbfgs」, 「sag」, 「saga」 or 「newton-cg」大數據集(n_samples)「sag」 or 「saga」「saga」 一般都是最佳的選擇,但出於一些歷史遺留原因默認的是 「liblinear」 。
對於大數據集,還可以用 SGDClassifier ,並使用對數損失(』log』 loss)
示例:
L1 Penalty and Sparsity in Logistic Regression
Path with L1- Logistic Regression
Plot multinomial and One-vs-Rest Logistic Regression
Multiclass sparse logisitic regression on newgroups20
MNIST classfification using multinomial logistic + L1
與 liblinear 的區別:
當 fit_intercept=False 擬合得到的 coef_ 或者待預測的數據為零時,用 solver=liblinear 的 LogisticRegression 或 LinearSVC 與直接使用外部 liblinear 庫預測得分會有差異。這是因為, 對於 decision_function 為零的樣本, LogisticRegression 和 LinearSVC 將預測為負類,而 liblinear 預測為正類。 注意,設定了 fit_intercept=False ,又有很多樣本使得 decision_function 為零的模型,很可能會欠擬合,其表現往往比較差。建議您設置 fit_intercept=True 並增大 intercept_scaling 。
Note
利用稀疏 logistic 回歸進行特徵選擇
帶 L1 罰項的 logistic 回歸 將得到稀疏模型(sparse model),相當於進行了特徵選擇(feature selection),詳情參見 基於 L1 的特徵選取 。LogisticRegressionCV 對 logistic 回歸 的實現內置了交叉驗證(cross-validation),可以找出最優的參數 C 。」newton-cg」, 「sag」, 「saga」 和 「lbfgs」 在高維數據上更快,因為採用了熱啟動(warm-starting)。 在多分類設定下,若 multi_class 設為 「ovr」 ,會為每類求一個最佳的 C 值;若 multi_class 設為 「multinomial」 ,會通過交叉熵損失(cross-entropy loss)求出一個最佳 C 值。
參考文獻:
1.1.12. 隨機梯度下降, SGD隨機梯度下降是擬合線性模型的一個簡單而高效的方法。在樣本量(和特徵數)很大時尤為有用。 方法 partial_fit 可用於 online learning (在線學習)或基於 out-of-core learning (外存的學習)
SGDClassifier 和 SGDRegressor 分別用於擬合分類問題和回歸問題的線性模型,可使用不同的(凸)損失函數,支持不同的罰項。 例如,設定 loss="log" ,則 SGDClassifier 擬合一個邏輯斯蒂回歸模型,而 loss="hinge" 擬合線性支持向量機(SVM)。
參考文獻
1.1.13. Perceptron(感知器)Perceptron 是適用於大規模學習的一種簡單算法。默認情況下:
不需要設置學習率(learning rate)。
不需要正則化處理。
僅使用錯誤樣本更新模型。
最後一點表明使用合頁損失(hinge loss)的感知機比 SGD 略快,所得模型更稀疏。
1.1.14. Passive Aggressive Algorithms(被動攻擊算法)被動攻擊算法是大規模學習的一類算法。和感知機類似,它也不需要設置學習率,不過比感知機多出一個正則化參數 C 。
對於分類問題, PassiveAggressiveClassifier 可設定 loss='hinge' (PA-I)或 loss='squared_hinge' (PA-II)。對於回歸問題, PassiveAggressiveRegressor 可設置 loss='epsilon_insensitive' (PA-I)或 loss='squared_epsilon_insensitive'(PA-II)。
參考文獻:
「Online Passive-Aggressive Algorithms」 K. Crammer, O. Dekel, J. Keshat, S. Shalev-Shwartz, Y. Singer - JMLR 7 (2006)
1.1.15. 穩健回歸(Robustness regression): 處理離群點(outliers)和模型錯誤穩健回歸(robust regression)特別適用於回歸模型包含損壞數據(corrupt data)的情況,如離群點或模型中的錯誤。
處理包含離群點的數據時牢記以下幾點:
穩健擬合(robust fitting)的一個重要概念是崩潰點(breakdown point),即擬合模型(仍準確預測)所能承受的離群值最大比例。
注意,在高維數據條件下( n_features 大),一般而言很難完成穩健擬合,很可能完全不起作用。
折中: 預測器的選擇
Scikit-learn提供了三種穩健回歸的預測器(estimator): RANSAC , Theil Sen 和 HuberRegressor
HuberRegressor 一般快於 RANSAC 和 Theil Sen ,除非樣本數很大,即 n_samples >> n_features 。 這是因為 RANSAC 和 Theil Sen 都是基於數據的較小子集進行擬合。但使用默認參數時, Theil Sen 和 RANSAC 可能不如 HuberRegressor 魯棒。
RANSAC 比 Theil Sen 更快,在樣本數量上的伸縮性(適應性)更好。
RANSAC 能更好地處理y方向的大值離群點(通常情況下)。
Theil Sen 能更好地處理x方向中等大小的離群點,但在高維情況下無法保證這一特點。
實在決定不了的話,請使用 RANSAC
1.1.15.2. RANSAC: 隨機抽樣一致性算法(RANdom SAmple Consensus)隨機抽樣一致性算法(RANdom SAmple Consensus, RANSAC)利用全體數據中局內點(inliers)的一個隨機子集擬合模型。
RANSAC 是一種非確定性算法,以一定概率輸出一個可能的合理結果,依賴於迭代次數(參數 max_trials )。這種算法主要解決線性或非線性回歸問題,在計算機視覺攝影測繪領域尤為流行。
算法從全體樣本輸入中分出一個局內點集合,全體樣本可能由於測量錯誤或對數據的假設錯誤而含有噪點、離群點。最終的模型僅從這個局內點集合中得出。
每輪迭代執行以下步驟:
從原始數據中抽樣 min_samples 數量的隨機樣本,檢查數據是否合法(見 is_data_valid )。
用一個隨機子集擬合模型( base_estimator.fit )。檢查模型是否合法(見 is_model_valid )。
計算預測模型的殘差(residual),將全體數據分成局內點和離群點( base_estimator.predict(X) - y )
若局內點樣本數最大,保存當前模型為最佳模型。以免當前模型離群點數量恰好相等(而出現未定義情況),規定僅當數值大於當前最值時認為是最佳模型。
上述步驟或者迭代到最大次數( max_trials ),或者某些終止條件滿足時停下(見 stop_n_inliers 和 stop_score )。最終模型由之前確定的最佳模型的局內點樣本(一致性集合,consensus set)預測。
函數 is_data_valid 和 is_model_valid 可以識別出隨機樣本子集中的退化組合(degenerate combinations)並予以丟棄(reject)。即便不需要考慮退化情況,也會使用 is_data_valid ,因為在擬合模型之前調用它能得到更高的計算性能。
示例:
參考文獻:
https://en.wikipedia.org/wiki/RANSAC
「Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography」 Martin A. Fischler and Robert C. Bolles - SRI International (1981)
「Performance Evaluation of RANSAC Family」 Sunglok Choi, Taemin Kim and Wonpil Yu - BMVC (2009)
1.1.15.3. Theil-Sen 預估器: 廣義中值估計器(generalized-median-based estimator)TheilSenRegressor 估計器:使用中位數在多個維度泛化,對多元異常值更具有魯棒性,但問題是,隨著維數的增加,估計器的準確性在迅速下降。準確性的丟失,導致在高維上的估計值比不上普通的最小二乘法。
示例:
參考文獻:
1.1.15.3.1. 算法理論細節TheilSenRegressor 在漸近效率和無偏估計方面足以媲美 Ordinary Least Squares (OLS) (普通最小二乘法(OLS))。與 OLS 不同的是, Theil-Sen 是一種非參數方法,這意味著它沒有對底層數據的分布假設。由於 Theil-Sen 是基於中值的估計,它更適合於損壞的數據即離群值。 在單變量的設置中,Theil-Sen 在簡單的線性回歸的情況下,其崩潰點大約 29.3% ,這意味著它可以容忍任意損壞的數據高達 29.3% 。
scikit-learn 中實現的 TheilSenRegressor 是多元線性回歸模型的推廣 [8] ,利用了空間中值方法,它是多維中值的推廣 [9] 。
關於時間複雜度和空間複雜度,Theil-Sen 的尺度根據
這使得它不適用於大量樣本和特徵的問題。因此,可以選擇一個亞群的大小來限制時間和空間複雜度,只考慮所有可能組合的隨機子集。
示例:
參考文獻:
1.1.15.4. Huber 回歸HuberRegressor 與 Ridge 不同,因為它對於被分為異常值的樣本應用了一個線性損失。如果這個樣品的絕對誤差小於某一閾值,樣品就被分為內圍值。 它不同於 TheilSenRegressor 和 RANSACRegressor ,因為它沒有忽略異常值的影響,並分配給它們較小的權重。
這個 HuberRegressor 最小化的損失函數是:
其中
建議設置參數 epsilon 為 1.35 以實現 95% 統計效率。
1.1.15.5. 注意HuberRegressor 與將損失設置為 huber 的 SGDRegressor 並不相同,體現在以下方面的使用方式上。
HuberRegressor 是標度不變性的. 一旦設置了 epsilon , 通過不同的值向上或向下縮放 X 和 y ,就會跟以前一樣對異常值產生同樣的魯棒性。相比 SGDRegressor 其中 epsilon 在 X 和 y 被縮放的時候必須再次設置。
HuberRegressor 應該更有效地使用在小樣本數據,同時 SGDRegressor 需要一些訓練數據的 passes 來產生一致的魯棒性。
示例:
參考文獻:
另外,這個估計是不同於 R 實現的 Robust Regression (http://www.ats.ucla.edu/stat/r/dae/rreg.htm) ,因為 R 實現加權最小二乘,權重考慮到每個樣本並基於殘差大於某一閾值的量。
1.1.16. 多項式回歸:用基函數展開線性模型機器學習中一種常見的模式,是使用線性模型訓練數據的非線性函數。這種方法保持了一般快速的線性方法的性能,同時允許它們適應更廣泛的數據範圍。
例如,可以通過構造係數的 polynomial features 來擴展一個簡單的線性回歸。在標準線性回歸的情況下,你可能有一個類似於二維數據的模型:
如果我們想把拋物面擬合成數據而不是平面,我們可以結合二階多項式的特徵,使模型看起來像這樣:
觀察到這 還是一個線性模型 (這有時候是令人驚訝的): 看到這個,想像創造一個新的變量
有了這些重新標記的數據,我們可以將問題寫成
我們看到,所得的 polynomial regression 與我們上文所述線性模型是同一類(即關於 是線性的),因此可以用同樣的方法解決。通過用這些基函數建立的高維空間中的線性擬合,該模型具有靈活性,可以適應更廣泛的數據範圍。
這裡是一個例子,使用不同程度的多項式特徵將這個想法應用於一維數據:
這個圖是使用 PolynomialFeatures 預創建。該預處理器將輸入數據矩陣轉換為給定度的新數據矩陣。使用方法如下:
>>>
>>> from sklearn.preprocessing import PolynomialFeatures>>> import numpy as np>>> X = np.arange(6).reshape(3, 2)>>> Xarray([[0, 1], [2, 3], [4, 5]])>>> poly = PolynomialFeatures(degree=2)>>> poly.fit_transform(X)array([[ 1., 0., 1., 0., 0., 1.], [ 1., 2., 3., 4., 6., 9.], [ 1., 4., 5., 16., 20., 25.]])
X 的特徵已經從 轉換到 , 並且現在可以用在任何線性模型。
這種預處理可以通過 Pipeline 工具進行簡化。可以創建一個表示簡單多項式回歸的單個對象,使用方法如下所示:
>>>
>>> from sklearn.preprocessing import PolynomialFeatures>>> from sklearn.linear_model import LinearRegression>>> from sklearn.pipeline import Pipeline>>> import numpy as np>>> model = Pipeline([('poly', PolynomialFeatures(degree=3)),... ('linear', LinearRegression(fit_intercept=False))])>>> # fit to an order-3 polynomial data>>> x = np.arange(5)>>> y = 3 - 2 * x + x ** 2 - x ** 3>>> model = model.fit(x[:, np.newaxis], y)>>> model.named_steps['linear'].coef_array([ 3., -2., 1., -1.])
利用多項式特徵訓練的線性模型能夠準確地恢復輸入多項式係數。
在某些情況下,沒有必要包含任何單個特徵的更高的冪,只需要相乘最多 個不同的特徵即可,所謂 interaction features(交互特徵) 。這些可通過設定 PolynomialFeatures 的 interaction_only=True 得到。
例如,當處理布爾屬性,對於所有 ,因此是無用的;但 代表兩布爾結合。這樣我們就可以用線性分類器解決異或問題:
>>>
>>> from sklearn.linear_model import Perceptron>>> from sklearn.preprocessing import PolynomialFeatures>>> import numpy as np>>> X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])>>> y = X[:, 0] ^ X[:, 1]>>> yarray([0, 1, 1, 0])>>> X = PolynomialFeatures(interaction_only=True).fit_transform(X).astype(int)>>> Xarray([[1, 0, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1]])>>> clf = Perceptron(fit_intercept=False, max_iter=10, tol=None,... shuffle=False).fit(X, y)
分類器的 「predictions」 是完美的:
>>>
>>> clf.predict(X)array([0, 1, 1, 0])>>> clf.score(X, y)1.0