libsvm回归参数寻优cgp_【lightgbm/xgboost/nn代码整理二】xgboost做二分类,多分类以及回归任务...
1.簡(jiǎn)介
該部分是代碼整理的第二部分,為了方便一些初學(xué)者調(diào)試代碼,作者已將該部分代碼打包成一個(gè)工程文件,包含簡(jiǎn)單的數(shù)據(jù)處理、xgboost配置、五折交叉訓(xùn)練和模型特征重要性打印四個(gè)部分。數(shù)據(jù)處理部分參考:代碼整理一,這里只介紹不同的部分。本文主要是介紹一些重點(diǎn)的參數(shù)部分,一是方便自己以后再次查詢,也希望幫助一些初學(xué)者快速的使用該項(xiàng)目,應(yīng)用到自己的工程或者比賽中。如果只是想要閱讀代碼,可直接移步到尾部鏈接。
2. 數(shù)據(jù)處理
data = pd.concat([train_data, test_data]) cate_feature = ['gender', 'cell_province', 'id_province', 'id_city', 'rate', 'term'] for item in cate_feature:data[item] = LabelEncoder().fit_transform(data[item])item_dummies = pd.get_dummies(data[item])item_dummies.columns = [item + str(i + 1) for i in range(item_dummies.shape[1])]data = pd.concat([data, item_dummies], axis=1) data.drop(cate_feature,axis=1,inplace=True)該部分在lightgbm中只進(jìn)行了labelEncoder編碼處理,然后通過(guò)categorical_feature變量處理,在lightgbm中使用了類別特征的最優(yōu)切分進(jìn)行了處理,具體詳情參考:柯國(guó)霖大佬的回答。xgboost中沒(méi)有對(duì)類別特征做處理,這里對(duì)其進(jìn)行了onehot編碼處理。而在工程中,如果類別過(guò)多,我一般會(huì)放棄進(jìn)行onehot,主要是由于進(jìn)行onehot會(huì)導(dǎo)致特征過(guò)于稀疏,運(yùn)算速度變慢,嚴(yán)重影響模型的迭代速度,并且最終對(duì)結(jié)果提升很有限,我通常只會(huì)進(jìn)行l(wèi)abelEncoder, 也可以對(duì)特征進(jìn)行embeding處理。
3.模型
3.1 參數(shù)
和lightgbm一樣,xgboost也是使用key-value字典的方式存儲(chǔ)參數(shù),下面給出的事二分類的參數(shù)
params = {'booster': 'gbtree','objective': 'binary:logistic','eval_metric': 'auc','gamma': 0.1,'max_depth': 8,'alpha': 0,'lambda': 0,'subsample': 0.7,'colsample_bytree': 0.5,'min_child_weight': 3,'silent': 0,'eta': 0.03,'nthread': -1,'seed': 2019, }- objective:目標(biāo)函數(shù)
- 二分類:常用的是binary:logistic
- 多分類:multi:softmax,當(dāng)是多分類任務(wù)時(shí)需要指定類別數(shù)量,eg:'num_class':33;
- 回歸任務(wù):reg:linear
- eval_metric:評(píng)價(jià)函數(shù),如果該參數(shù)沒(méi)有指定,缺省值是通過(guò)目標(biāo)函數(shù)來(lái)做匹配,
- 二分類:常用auc和logloss
- 多分類:mlogloss
- 回歸任務(wù):均方誤差:mse,均方根誤差:rmse, 平均絕對(duì)值誤差:mae
- gamma:用于控制是否后剪枝的參數(shù),越大越保守,一般0.1、0.2這樣子
- max_depth:樹(shù)的深度,對(duì)結(jié)果影響較大,越深越容易過(guò)擬合
- alpha:L1正則,樹(shù)的深度過(guò)大時(shí),可以適大該參數(shù)
- lambda:L2正則
- subsample:隨機(jī)采樣的比率,通俗理解就是選多少樣本做為訓(xùn)練集,選擇小于1的比例可以減少方差,即防止過(guò)擬合
- colsample_bytree:這里是選擇多少列作為訓(xùn)練集,具體的理解就是選擇多少特征
- min_child_weight:決定最小葉子節(jié)點(diǎn)樣本權(quán)重和。當(dāng)它的值較大時(shí),可以避免模型學(xué)習(xí)到局部的特殊樣本。但如果這個(gè)值過(guò)高,會(huì)導(dǎo)致欠擬合
- eta:學(xué)習(xí)率
- silent: 是否打印訓(xùn)練過(guò)程中的信息,0表示打印,1反之
- nthread:運(yùn)行的線程數(shù),-1所有線程,該值需要根據(jù)具體情況調(diào)整,線程對(duì)最終結(jié)果有一點(diǎn)影響,曾今測(cè)試,線程越多,結(jié)果會(huì)變差一丟丟
- seed:這個(gè)隨機(jī)指定一個(gè)常數(shù),防止每次結(jié)果不一致
3.2 五折交叉
folds = KFold(n_splits=5, shuffle=True, random_state=2019)采用五折交叉統(tǒng)計(jì)實(shí)際就是訓(xùn)練多個(gè)模型和平均值融合,如果時(shí)間允許的情況下10折交叉會(huì)好于5折。5折交叉還可以采用StratifiedKFold做切分。
3.3 數(shù)據(jù)加載
XGBoost可以加載多種數(shù)據(jù)格式的訓(xùn)練數(shù)據(jù):libsvm 格式的文本數(shù)據(jù)、Numpy 的二維數(shù)組、XGBoost 的二進(jìn)制的緩存文件。加載的數(shù)據(jù)存儲(chǔ)在對(duì)象 DMatrix 中,而llightgbm是存儲(chǔ)在Dataset中
trn_data = xgb.DMatrix(train_x.iloc[trn_idx], label=train_y[trn_idx]) val_data = xgb.DMatrix(train_x.iloc[val_idx], label=train_y[val_idx])3.4 訓(xùn)練和預(yù)測(cè)
##訓(xùn)練部分 watchlist = [(trn_data, 'train'), (val_data, 'valid')] clf = xgb.train(params, trn_data, num_round, watchlist, verbose_eval=200, early_stopping_rounds=200)##預(yù)測(cè)部分 test_pred_prob += clf.predict(xgb.DMatrix(test), ntree_limit=clf.best_ntree_limit) / folds.n_splits- params:參數(shù)字典
- trn_data :訓(xùn)練的數(shù)據(jù)
- num_round:迭代次數(shù)
- watchlist:這是一個(gè)列表,用于對(duì)訓(xùn)練過(guò)程中進(jìn)行評(píng)估列表中的元素。形式是evals =[(dtrain,’train’),(dval,’val’)]或者是evals =[(dtrain,’train’)],對(duì)于第一種情況,它使得我們可以在訓(xùn)練過(guò)程中觀察驗(yàn)證集的效果。
- verbose_eval: 如果為True ,則對(duì)evals中元素的評(píng)估結(jié)果會(huì)輸出在結(jié)果中;如果輸入數(shù)字,假設(shè)為5,則每隔5個(gè)迭代輸出一次。
- ntree_limit:驗(yàn)證集中最好的結(jié)果做預(yù)測(cè)
4.模型重要性
模型重要性是根據(jù)樹(shù)模型中該特征的分裂次數(shù)做統(tǒng)計(jì)的,可以基于此重要性來(lái)判斷特種的重要程度,深入的挖掘特征,具體代碼如下:
##保存特征重要性 fold_importance_df = pd.DataFrame() fold_importance_df["Feature"] = clf.get_fscore().keys() fold_importance_df["importance"] = clf.get_fscore().values() fold_importance_df["fold"] = fold_ + 1 feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)##特征重要性顯示 ## plot feature importance cols = (feature_importance_df[["Feature", "importance"]] .groupby("Feature").mean().sort_values(by="importance", ascending=False).index) best_features = feature_importance_df.loc[feature_importance_df.Feature.isin(cols)].sort_values(by='importance',ascending=False) plt.figure(figsize=(8, 15)) sns.barplot(y="Feature", x="importance",data=best_features.sort_values(by="importance", ascending=False)) plt.title('LightGBM Features (avg over folds)') plt.tight_layout() plt.savefig('../../result/xgb_importances.png')在lightgbm中對(duì)應(yīng)的事clf.feature_importance()函數(shù),而在xgboost中對(duì)應(yīng)的是clf.get_fscore()函數(shù)。如果特征過(guò)多無(wú)法完成顯示,可以只取topN顯示,如只顯示top5
cols = (feature_importance_df[["Feature", "importance"]].groupby("Feature").mean().sort_values(by="importance", ascending=False)[:5].index)5.小總結(jié)
xgboost和lightgbm對(duì)比,它的速度會(huì)慢很多,使用也沒(méi)有l(wèi)ighgbm方便,但是可以將xgboost訓(xùn)練的結(jié)果和lightgbm做融合,提升最終的結(jié)果。
代碼地址:data_mining_models
. 寫在最后
歡迎關(guān)注作者和專欄,和作者一塊成長(zhǎng):ML與DL成長(zhǎng)之路,
推薦關(guān)注公眾號(hào):AI成長(zhǎng)社,ML與DL的成長(zhǎng)圣地。
同時(shí)推薦魚(yú)佬專欄,學(xué)習(xí)更對(duì)競(jìng)賽知識(shí),機(jī)器學(xué)習(xí)理論與數(shù)據(jù)競(jìng)賽實(shí)戰(zhàn)
推薦閱讀
【lightgbm/xgboost/nn代碼整理一】lightgbm做二分類,多分類以及回歸任務(wù)
【lightgbm/xgboost/nn代碼整理三】keras做二分類,多分類以及回歸任務(wù)
【lightgbm/xgboost/nn代碼整理四】pytorch做二分類,多分類以及回歸任務(wù)
總結(jié)
以上是生活随笔為你收集整理的libsvm回归参数寻优cgp_【lightgbm/xgboost/nn代码整理二】xgboost做二分类,多分类以及回归任务...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux历史性能数据,Linux平台下
- 下一篇: 自己动手写cpu 光盘_自己动手写CPU