Kaggle知識點(diǎn):模型加權(quán)集成7種方法
Kaggle知識點(diǎn):模型加權(quán)集成7種方法
在競賽中如果對多個預(yù)測結(jié)果進(jìn)行集成,最方便的做法是直接對預(yù)測結(jié)果進(jìn)行加權(quán)求和。此時不同任務(wù),加權(quán)方法不同:
分類任務(wù):類別投票 & 概率值加權(quán) 回歸任務(wù):預(yù)測值加權(quán) 排序任務(wù):排序次序加權(quán) 目標(biāo)檢測任務(wù):預(yù)測結(jié)果NMS 語義分割任務(wù):像素類別投票 & 加權(quán)
在本文中我們將介紹最常見的分類 & 回歸任務(wù)的結(jié)果加權(quán)方法,也就是Blend操作。
多樣性 & 精度差異
在對結(jié)果進(jìn)行集成時需要考慮如下兩點(diǎn):
模型的多樣性: 模型的精度差異;
集成學(xué)習(xí)的精度收益是需要模型&預(yù)測結(jié)果的多樣性,如果多樣性不足,則最終預(yù)測結(jié)果和單個模型類似。
精度差異是指模型之間的精度差異,如果精度差異很大最終集成的效果也不會很好。如下情況2的模型精度差異就較大。
三個模型精度:[0.9, 0.92, 0.92]
三個模型精度:[0.9, 0.8, 0.7]
Out of fold
Out of fold又名袋外預(yù)測,是一個模型在交叉驗(yàn)證的過程中使用訓(xùn)練部分進(jìn)行訓(xùn)練,然后對驗(yàn)證集進(jìn)行預(yù)測,交替得到訓(xùn)練集和測試集預(yù)測結(jié)果。
如果我們擁有三個模型,通過交叉驗(yàn)證可以得到3個訓(xùn)練集預(yù)測結(jié)果和3個驗(yàn)證集預(yù)測結(jié)果。
如下展示的幾種方法,都需要訓(xùn)練集標(biāo)簽 與 訓(xùn)練集預(yù)測結(jié)果搜索得到參數(shù),然后將參數(shù)在測試集上進(jìn)行使用。
方法1:均值加權(quán)
原理:對所有模型的預(yù)測結(jié)果計(jì)算均值; 優(yōu)點(diǎn):簡單,過擬合可能性低; 缺點(diǎn):會受到模型原始精度差異的影響;
oof_preds = []
for col in oofCols:
oof_preds.append(oof_df[col])
y_avg = np.mean(np.array(oof_preds), axis=0)
方法2:權(quán)重加權(quán)
原理:對所有模型的預(yù)測結(jié)果加權(quán)求和; 優(yōu)點(diǎn):比均值更加可控; 缺點(diǎn):權(quán)重需人工設(shè)置,更容易過擬合;
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:排序加權(quán)
原理:對預(yù)測結(jié)果進(jìn)行排序,使用次序代替原始取值; 優(yōu)點(diǎn):適合分類任務(wù),對概率進(jìn)行集成; 缺點(diǎn):會受到模型原始精度差異的影響;
rankPreds = []
for i, col in enumerate(oofCols):
rankPreds.append(oof_df[col].rank().values)
y_rankavg = np.mean(np.array(rankPreds), axis=0)
方法4:排序權(quán)重加權(quán)
原理:對預(yù)測結(jié)果進(jìn)行排序,使用次序進(jìn)行加權(quán)求和; 優(yōu)點(diǎn):比均值更加可控; 缺點(diǎn):權(quán)重需人工設(shè)置,更容易過擬合;
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:爬山法加權(quán)
原理:權(quán)重進(jìn)行搜索,保留最優(yōu)的權(quán)重; 優(yōu)點(diǎn):可以自動權(quán)重權(quán)重大??; 缺點(diǎn):更容易過擬合;
for w1 in np.linspace(0, 1, 100):
for w2 in np.linspace(0, w2, 100):
w3 = 1 - w1 - w3
如果 w1, w2, w3取得更好的精度,保留權(quán)重
否則嘗試下一組權(quán)重組合
方法6:線性回歸加權(quán)
原理:使用線性回歸確定權(quán)重 優(yōu)點(diǎn):可以自動權(quán)重權(quán)重大??; 缺點(diǎn):需要額外訓(xùn)練,容易過擬合;
from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercept=False)
lr.fit(
三個模型對訓(xùn)練集預(yù)測結(jié)果,
訓(xùn)練集標(biāo)簽
)
lr.coef_ # 線性回歸的權(quán)重
方法7:參數(shù)優(yōu)化加權(quán)
原理:使用優(yōu)化方法搜索權(quán)重 優(yōu)點(diǎn):可以自動權(quán)重權(quán)重大??; 缺點(diǎn):需要額外訓(xùn)練,容易過擬合;
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])評論
圖片
表情
