生活随笔
收集整理的這篇文章主要介紹了
模型融合方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
GBDT模型
folds
= StratifiedKFold
(n_splits
=5, shuffle
=True, random_state
=2018)
oof_gbr_263
= np
.zeros
(train_shape
)
predictions_gbr_263
= np
.zeros
(len(X_test_263
))for fold_
, (trn_idx
, val_idx
) in enumerate(folds
.split
(X_train_263
, y_train
)):print("fold n°{}".format(fold_
+1))tr_x
= X_train_263
[trn_idx
]tr_y
= y_train
[trn_idx
]gbr_263
= gbr
(n_estimators
=400, learning_rate
=0.01,subsample
=0.65,max_depth
=7, min_samples_leaf
=20,max_features
=0.22,verbose
=1)gbr_263
.fit
(tr_x
,tr_y
)oof_gbr_263
[val_idx
] = gbr_263
.predict
(X_train_263
[val_idx
])predictions_gbr_263
+= gbr_263
.predict
(X_test_263
) / folds
.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error
(oof_gbr_263
, target
)))
XGB模型
xgb_263_params
= {'eta': 0.02, 'max_depth': 6, 'min_child_weight':3,'gamma':0, 'subsample': 0.7, 'colsample_bytree': 0.3, 'lambda':2,'objective': 'reg:linear', 'eval_metric': 'rmse', 'silent': True, 'nthread': -1}folds
= StratifiedKFold
(n_splits
=5, shuffle
=True, random_state
=2019)
oof_xgb_263
= np
.zeros
(len(X_train_263
))
predictions_xgb_263
= np
.zeros
(len(X_test_263
))for fold_
, (trn_idx
, val_idx
) in enumerate(folds
.split
(X_train_263
, y_train
)):print("fold n°{}".format(fold_
+1))trn_data
= xgb
.DMatrix
(X_train_263
[trn_idx
], y_train
[trn_idx
])val_data
= xgb
.DMatrix
(X_train_263
[val_idx
], y_train
[val_idx
])watchlist
= [(trn_data
, 'train'), (val_data
, 'valid_data')]xgb_263
= xgb
.train
(dtrain
=trn_data
, num_boost_round
=3000, evals
=watchlist
, early_stopping_rounds
=600, verbose_eval
=500, params
=xgb_263_params
)oof_xgb_263
[val_idx
] = xgb_263
.predict
(xgb
.DMatrix
(X_train_263
[val_idx
]), ntree_limit
=xgb_263
.best_ntree_limit
)predictions_xgb_263
+= xgb_263
.predict
(xgb
.DMatrix
(X_test_263
), ntree_limit
=xgb_263
.best_ntree_limit
) / folds
.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error
(oof_xgb_263
, target
)))
隨機森林模型
folds
= KFold
(n_splits
=5, shuffle
=True, random_state
=2019)
oof_rfr_263
= np
.zeros
(len(X_train_263
))
predictions_rfr_263
= np
.zeros
(len(X_test_263
))for fold_
, (trn_idx
, val_idx
) in enumerate(folds
.split
(X_train_263
, y_train
)):print("fold n°{}".format(fold_
+1))tr_x
= X_train_263
[trn_idx
]tr_y
= y_train
[trn_idx
]rfr_263
= rfr
(n_estimators
=1600,max_depth
=9, min_samples_leaf
=9, min_weight_fraction_leaf
=0.0,max_features
=0.25,verbose
=1,n_jobs
=-1)
rfr_263
.fit
(tr_x
,tr_y
)oof_rfr_263
[val_idx
] = rfr_263
.predict
(X_train_263
[val_idx
])predictions_rfr_263
+= rfr_263
.predict
(X_test_263
) / folds
.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error
(oof_rfr_263
, target
)))
LightGBM
lgb_263_param
= {
'num_leaves': 7,
'min_data_in_leaf': 20,
'objective':'regression',
'max_depth': -1,
'learning_rate': 0.003,
"boosting": "gbdt",
"feature_fraction": 0.18,
"bagging_freq": 1,
"bagging_fraction": 0.55,
"bagging_seed": 14,
"metric": 'mse',
"lambda_l1": 0.1,
"lambda_l2": 0.2,
"verbosity": -1}
folds
= StratifiedKFold
(n_splits
=5, shuffle
=True, random_state
=4)
oof_lgb_263
= np
.zeros
(len(X_train_263
))
predictions_lgb_263
= np
.zeros
(len(X_test_263
))for fold_
, (trn_idx
, val_idx
) in enumerate(folds
.split
(X_train_263
, y_train
)):print("fold n°{}".format(fold_
+1))trn_data
= lgb
.Dataset
(X_train_263
[trn_idx
], y_train
[trn_idx
])val_data
= lgb
.Dataset
(X_train_263
[val_idx
], y_train
[val_idx
])num_round
= 10000lgb_263
= lgb
.train
(lgb_263_param
, trn_data
, num_round
, valid_sets
= [trn_data
, val_data
], verbose_eval
=500, early_stopping_rounds
= 800)oof_lgb_263
[val_idx
] = lgb_263
.predict
(X_train_263
[val_idx
], num_iteration
=lgb_263
.best_iteration
)predictions_lgb_263
+= lgb_263
.predict
(X_test_263
, num_iteration
=lgb_263
.best_iteration
) / folds
.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error
(oof_lgb_263
, target
)))
極端隨機森林回歸
folds
= KFold
(n_splits
=5, shuffle
=True, random_state
=13)
oof_etr_263
= np
.zeros
(train_shape
)
predictions_etr_263
= np
.zeros
(len(X_test_263
))for fold_
, (trn_idx
, val_idx
) in enumerate(folds
.split
(X_train_263
, y_train
)):print("fold n°{}".format(fold_
+1))tr_x
= X_train_263
[trn_idx
]tr_y
= y_train
[trn_idx
]etr_263
= etr
(n_estimators
=1000,max_depth
=8, min_samples_leaf
=12, min_weight_fraction_leaf
=0.0,max_features
=0.4,verbose
=1,n_jobs
=-1)etr_263
.fit
(tr_x
,tr_y
)oof_etr_263
[val_idx
] = etr_263
.predict
(X_train_263
[val_idx
])predictions_etr_263
+= etr_263
.predict
(X_test_263
) / folds
.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error
(oof_etr_263
, target
)))
Bagging方法
投票法是一種遵循少數服從多數原則的集成學習模型,通過多個模型的集成降低方差,從而提高模型的魯棒性。在理想情況下,投票法的預測效果應當優于任何一個基模型的預測效果。
投票法在回歸模型與分類模型上均可使用:
回歸投票法:預測結果是所有模型預測結果的平均值。
分類投票法:預測結果是所有模型種出現最多的預測結果。
分類投票法又可以被劃分為硬投票與軟投票:
硬投票:預測結果是所有投票結果最多出現的類。
軟投票:預測結果是所有投票結果中概率加和最大的類。
Boosting方法
Boosting方法是使用同一組數據集進行反復學習,得到一系列簡單模型,然后組合這些模型構成一個預測性能十分強大的機器學習模型。顯然,Boosting思想提高最終的預測效果是通過不斷減少偏差的形式,與Bagging有著本質的不同。在Boosting這一大類方法中,主要介紹兩類常用的Boosting方式:Adaptive Boosting 和 Gradient Boosting 以及它們的變體Xgboost、LightGBM以及Catboost。
Stacking方法
Stacking,這個集成方法在比賽中被稱為“懶人”算法,因為它不需要花費過多時間的調參就可以得到一個效果不錯的算法,同時,這種算法也比前兩種算法容易理解的多,因為這種集成學習的方式不需要理解太多的理論,只需要在實際中加以運用即可。 stacking嚴格來說并不是一種算法,而是精美而又復雜的,對模型集成的一種策略。Stacking集成算法可以理解為一個兩層的集成,第一層含有多個基礎分類器,把預測的結果(元特征)提供給第二層, 而第二層的分類器通常是邏輯回歸,他把一層分類器的結果當做特征做擬合輸出預測結果。在介紹Stacking之前,我們先來對簡化版的Stacking進行討論,也叫做Blending,接著我們對Stacking進行更深入的討論。
Blending方法
下面我們來詳細討論下這個Blending集成學習方式:
(1) 將數據劃分為訓練集和測試集(test_set),其中訓練集需要再次劃分為訓練集(train_set)和驗證集(val_set);
(2) 創建第一層的多個模型,這些模型可以使同質的也可以是異質的;
(3) 使用train_set訓練步驟2中的多個模型,然后用訓練好的模型預測val_set和test_set得到val_predict, test_predict1;
(4) 創建第二層的模型,使用val_predict作為訓練集訓練第二層的模型;
(5) 使用第二層訓練好的模型對第二層測試集test_predict1進行預測,該結果為整個測試集的結果。
總結
以上是生活随笔為你收集整理的模型融合方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。