文章目錄[隱藏]
在競賽中如果對多個(ge) 預測結果進行集成,最方便的做法是直接對預測結果進行加權求和。此時不同任務,加權方法不同:
- 分類任務:類別投票 & 概率值加權
- 回歸任務:預測值加權
- 排序任務:排序次序加權
- 目標檢測任務:預測結果NMS
- 語義分割任務:像素類別投票 & 加權
在本文中我們(men) 將介紹最常見的分類 & 回歸任務的結果加權方法,也就是Blend操作。
多樣性 & 精度差異
在對結果進行集成時需要考慮如下兩(liang) 點:
- 模型的多樣性:
- 模型的精度差異;
集成學習(xi) 的精度收益是需要模型&預測結果的多樣性,如果多樣性不足,則最終預測結果和單個(ge) 模型類似。
精度差異是指模型之間的精度差異,如果精度差異很大最終集成的效果也不會(hui) 很好。如下情況2的模型精度差異就較大。
三個(ge) 模型精度:[0.9, 0.92, 0.92] 三個(ge) 模型精度:[0.9, 0.8, 0.7]
Out of fold
Out of fold又名袋外預測,是一個(ge) 模型在交叉驗證的過程中使用訓練部分進行訓練,然後對驗證集進行預測,交替得到訓練集和測試集預測結果。
如果我們(men) 擁有三個(ge) 模型,通過交叉驗證可以得到3個(ge) 訓練集預測結果和3個(ge) 驗證集預測結果。
如下展示的幾種方法,都需要訓練集標簽 與(yu) 訓練集預測結果搜索得到參數,然後將參數在測試集上進行使用。
方法1:均值加權
- 原理:對所有模型的預測結果計算均值;
- 優點:簡單,過擬合可能性低;
- 缺點:會受到模型原始精度差異的影響;
oof_preds = [] for col in oofCols: oof_preds.append(oof_df[col])y_avg = np.mean(np.array(oof_preds), axis=0)
方法2:權重加權
- 原理:對所有模型的預測結果加權求和;
- 優(you) 點:比均值更加可控;
- 缺點:權重需人工設置,更容易過擬合;
weights = [1,2,3]
y_wtavg = np.zeros(len(oof_df)) for wt, col in zip(weights, oofCols):
y_wtavg += (wt*oof_df[col])y_wtavg = y_wtavg / sum(weights)
方法3:排序加權
- 原理:對預測結果進行排序,使用次序代替原始取值;
- 優(you) 點:適合分類任務,對概率進行集成;
- 缺點:會(hui) 受到模型原始精度差異的影響;
rankPreds = [] for i, col in enumerate(oofCols):
rankPreds.append(oof_df[col].rank().values)y_rankavg = np.mean(np.array(rankPreds), axis=0)
方法4:排序權重加權
- 原理:對預測結果進行排序,使用次序進行加權求和;
- 優(you) 點:比均值更加可控;
- 缺點:權重需人工設置,更容易過擬合;
rankPreds = []
weights = [1,2,3] for i, col in enumerate(oofCols):
rankPreds.append(oof_df[col].rank().values * weights[i])
y_rankavg = np.mean(np.array(rankPreds), axis=0)
方法5:爬山法加權
- 原理:權重進行搜索,保留最優(you) 的權重;
- 優(you) 點:可以自動權重權重大小;
- 缺點:更容易過擬合;
for w1 in np.linspace(0, 1, 100):
for w2 in np.linspace(0, w2, 100):
w3 = 1 - w1 - w3
如果 w1, w2, w3取得更好的精度,保留權重
否則嚐試下一組權重組合
方法6:線性回歸加權
- 原理:使用線性回歸確定權重
- 優(you) 點:可以自動權重權重大小;
- 缺點:需要額外訓練,容易過擬合;
from sklearn.linear_model import LinearRegressionlr = LinearRegression(fit_intercept=False)
lr.fit(
三個(ge) 模型對訓練集預測結果,
訓練集標簽
)lr.coef_ # 線性回歸的權重
方法7:參數優(you) 化加權
- 原理:使用優(you) 化方法搜索權重
- 優(you) 點:可以自動權重權重大小;
- 缺點:需要額外訓練,容易過擬合;
def f(x):
return x[0]2 + x[1]2 + (5 - x[0] - x[1])
from scipy import optimize
minimum = optimize.fmin(f, [1, 1])
評論已經被關(guan) 閉。