【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
生活随笔
收集整理的這篇文章主要介紹了
【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文是中國大學慕課《機器學習》的“集成學習”章節的課后代碼。
課程地址:
https://www.icourse163.org/course/WZU-1464096179
課程完整代碼:
https://github.com/fengdu78/WZU-machine-learning-course
代碼修改并注釋:黃海廣,haiguang2000@wzu.edu.cn
import?warnings warnings.filterwarnings("ignore") import?pandas?as?pd from?sklearn.model_selection?import?train_test_split生成數據
生成12000行的數據,訓練集和測試集按照3:1劃分
from?sklearn.datasets?import?make_hastie_10_2data,?target?=?make_hastie_10_2()X_train,?X_test,?y_train,?y_test?=?train_test_split(data,?target,?random_state=123) X_train.shape,?X_test.shape((9000, 10), (3000, 10))模型對比
對比六大模型,都使用默認參數,因為數據是
from?sklearn.linear_model?import?LogisticRegression from?sklearn.ensemble?import?RandomForestClassifier from?sklearn.ensemble?import?AdaBoostClassifier from?sklearn.ensemble?import?GradientBoostingClassifier from?xgboost?import?XGBClassifier from?lightgbm?import?LGBMClassifier from?sklearn.model_selection?import?cross_val_score import?timeclf1?=?LogisticRegression() clf2?=?RandomForestClassifier() clf3?=?AdaBoostClassifier() clf4?=?GradientBoostingClassifier() clf5?=?XGBClassifier() clf6?=?LGBMClassifier()for?clf,?label?in?zip([clf1,?clf2,?clf3,?clf4,?clf5,?clf6],?['Logistic?Regression',?'Random?Forest',?'AdaBoost',?'GBDT',?'XGBoost','LightGBM' ]):start?=?time.time()scores?=?cross_val_score(clf,?X_train,?y_train,?scoring='accuracy',?cv=5)end?=?time.time()running_time?=?end?-?startprint("Accuracy:?%0.8f (+/-?%0.2f),耗時%0.2f秒。模型名稱[%s]"?%(scores.mean(),?scores.std(),?running_time,?label))Accuracy: 0.47488889 (+/- 0.00),耗時0.04秒。模型名稱[Logistic Regression] Accuracy: 0.88966667 (+/- 0.01),耗時16.34秒。模型名稱[Random Forest] Accuracy: 0.88311111 (+/- 0.00),耗時3.39秒。模型名稱[AdaBoost] Accuracy: 0.91388889 (+/- 0.01),耗時13.14秒。模型名稱[GBDT] Accuracy: 0.92977778 (+/- 0.00),耗時3.60秒。模型名稱[XGBoost] Accuracy: 0.93188889 (+/- 0.01),耗時0.58秒。模型名稱[LightGBM]對比了六大模型,可以看出,邏輯回歸速度最快,但準確率最低。而LightGBM,速度快,而且準確率最高,所以,現在處理結構化數據的時候,大部分都是用LightGBM算法。
XGBoost的使用
1.原生XGBoost的使用
import?xgboost?as?xgb #記錄程序運行時間 import?timestart_time?=?time.time()#xgb矩陣賦值 xgb_train?=?xgb.DMatrix(X_train,?y_train) xgb_test?=?xgb.DMatrix(X_test,?label=y_test) ##參數 params?=?{'booster':?'gbtree', #?????'silent':?1,??#設置成1則沒有運行信息輸出,最好是設置為0.#'nthread':7,#?cpu?線程數?默認最大'eta':?0.007,??#?如同學習率'min_child_weight':?3,#?這個參數默認是?1,是每個葉子里面?h?的和至少是多少,對正負樣本不均衡時的?0-1?分類而言#,假設 h 在?0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100?個樣本。#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。'max_depth':?6,??#?構建樹的深度,越大越容易過擬合'gamma':?0.1,??#?樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。'subsample':?0.7,??#?隨機采樣訓練樣本'colsample_bytree':?0.7,??#?生成樹時進行的列采樣?'lambda':?2,??#?控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。#'alpha':0,?#?L1?正則項參數#'scale_pos_weight':1, #如果取值大于0的話,在類別樣本不平衡的情況下有助于快速收斂。#'objective':?'multi:softmax',?#多分類的問題#'num_class':10,?#?類別數,多分類與?multisoftmax?并用'seed':?1000,??#隨機種子#'eval_metric':?'auc' } plst?=?list(params.items()) num_rounds?=?500??#?迭代次數 watchlist?=?[(xgb_train,?'train'),?(xgb_test,?'val')]#訓練模型并保存 #?early_stopping_rounds?當設置的迭代次數較大時,early_stopping_rounds?可在一定的迭代次數內準確率沒有提升就停止訓練 model?=?xgb.train(plst,xgb_train,num_rounds,watchlist,early_stopping_rounds=100, ) #model.save_model('./model/xgb.model')?#?用于存儲訓練出的模型 print("best?best_ntree_limit",?model.best_ntree_limit) y_pred?=?model.predict(xgb_test,?ntree_limit=model.best_ntree_limit) print('error=%f'?%(sum(1for?i?in?range(len(y_pred))?if?int(y_pred[i]?>?0.5)?!=?y_test[i])?/float(len(y_pred)))) #?輸出運行時長 cost_time?=?time.time()?-?start_time print("xgboost?success!",?'\n',?"cost?time:",?cost_time,?"(s)......")[0] train-rmse:1.11000 val-rmse:1.10422 [1] train-rmse:1.10734 val-rmse:1.10182 [2] train-rmse:1.10465 val-rmse:1.09932 [3] train-rmse:1.10207 val-rmse:1.09694……
[497] train-rmse:0.62135 val-rmse:0.68680 [498] train-rmse:0.62096 val-rmse:0.68650 [499] train-rmse:0.62056 val-rmse:0.68624 best best_ntree_limit 500 error=0.826667 xgboost success! cost time: 3.5742645263671875 (s)......2.使用scikit-learn接口
會改變的函數名是:
eta -> learning_rate
lambda -> reg_lambda
alpha -> reg_alpha
from?sklearn.model_selection?import?train_test_split from?sklearn?import?metricsfrom?xgboost?import?XGBClassifierclf?=?XGBClassifier(#???? silent=0, ?#設置成1則沒有運行信息輸出,最好是設置為0.是否在運行升級時打印消息。#nthread=4,#?cpu?線程數?默認最大learning_rate=0.3,??#?如同學習率min_child_weight=1,#?這個參數默認是?1,是每個葉子里面?h?的和至少是多少,對正負樣本不均衡時的?0-1?分類而言#,假設 h 在?0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100?個樣本。#這個參數非常影響結果,控制葉子節點中二階導的和的最小值,該參數值越小,越容易 overfitting。max_depth=6,??#?構建樹的深度,越大越容易過擬合gamma=0,??#?樹的葉子節點上作進一步分區所需的最小損失減少,越大越保守,一般0.1、0.2這樣子。subsample=1,??#?隨機采樣訓練樣本?訓練實例的子采樣比max_delta_step=0,??#最大增量步長,我們允許每個樹的權重估計。colsample_bytree=1,??#?生成樹時進行的列采樣?reg_lambda=1,??#?控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。#reg_alpha=0,?#?L1?正則項參數#scale_pos_weight=1, #如果取值大于0的話,在類別樣本不平衡的情況下有助于快速收斂。平衡正負權重#objective=?'multi:softmax',?#多分類的問題?指定學習任務和相應的學習目標#num_class=10,?#?類別數,多分類與?multisoftmax?并用n_estimators=100,??#樹的個數seed=1000??#隨機種子#eval_metric=?'auc' ) clf.fit(X_train,?y_train)y_true,?y_pred?=?y_test,?clf.predict(X_test) print("Accuracy?:?%.4g"?%?metrics.accuracy_score(y_true,?y_pred))Accuracy : 0.936LIghtGBM的使用
1.原生接口
import?lightgbm?as?lgb from?sklearn.metrics?import?mean_squared_error #?加載你的數據 #?print('Load?data...') #?df_train?=?pd.read_csv('../regression/regression.train',?header=None,?sep='\t') #?df_test?=?pd.read_csv('../regression/regression.test',?header=None,?sep='\t') # #?y_train?=?df_train[0].values #?y_test?=?df_test[0].values #?X_train?=?df_train.drop(0,?axis=1).values #?X_test?=?df_test.drop(0,?axis=1).values#?創建成lgb特征的數據集格式 lgb_train?=?lgb.Dataset(X_train,?y_train)??#?將數據保存到LightGBM二進制文件將使加載更快 lgb_eval?=?lgb.Dataset(X_test,?y_test,?reference=lgb_train)??#?創建驗證數據#?將參數寫成字典下形式 params?=?{'task':?'train','boosting_type':?'gbdt',??#?設置提升類型'objective':?'regression',??#?目標函數'metric':?{'l2',?'auc'},??#?評估函數'num_leaves':?31,??#?葉子節點數'learning_rate':?0.05,??#?學習速率'feature_fraction':?0.9,??#?建樹的特征選擇比例'bagging_fraction':?0.8,??#?建樹的樣本采樣比例'bagging_freq':?5,??#?k?意味著每?k?次迭代執行bagging'verbose':?1??#?<0?顯示致命的,?=0?顯示錯誤?(警告),?>0?顯示信息 }print('Start?training...') #?訓練?cv?and?train gbm?=?lgb.train(params,lgb_train,num_boost_round=500,valid_sets=lgb_eval,early_stopping_rounds=5)??#?訓練數據需要參數列表和數據集print('Save?model...')gbm.save_model('model.txt')??#?訓練后保存模型到文件print('Start?predicting...') #?預測數據集 y_pred?=?gbm.predict(X_test,?num_iteration=gbm.best_iteration)??#如果在訓練期間啟用了早期停止,可以通過best_iteration方式從最佳迭代中獲得預測 #?評估模型 print('error=%f'?%(sum(1for?i?in?range(len(y_pred))?if?int(y_pred[i]?>?0.5)?!=?y_test[i])?/float(len(y_pred))))Start training... [LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000448 seconds. You can set `force_col_wise=true` to remove the overhead. [LightGBM] [Info] Total Bins 2550 [LightGBM] [Info] Number of data points in the train set: 9000, number of used features: 10 [LightGBM] [Info] Start training from score 0.012000 [1] valid_0's auc: 0.814399 valid_0's l2: 0.965563 Training until validation scores don't improve for 5 rounds [2] valid_0's auc: 0.84729 valid_0's l2: 0.934647 [3] valid_0's auc: 0.872805 valid_0's l2: 0.905265 [4] valid_0's auc: 0.884117 valid_0's l2: 0.877875 [5] valid_0's auc: 0.895115 valid_0's l2: 0.852189……
[191] valid_0's auc: 0.982783 valid_0's l2: 0.319851 [192] valid_0's auc: 0.982751 valid_0's l2: 0.319971 [193] valid_0's auc: 0.982685 valid_0's l2: 0.320043 Early stopping, best iteration is: [188] valid_0's auc: 0.982794 valid_0's l2: 0.319746 Save model... Start predicting... error=0.6640002.scikit-learn接口
from?sklearn?import?metrics from?lightgbm?import?LGBMClassifierclf?=?LGBMClassifier(boosting_type='gbdt',??#?提升樹的類型?gbdt,dart,goss,rfnum_leaves=31,??#樹的最大葉子數,對比xgboost一般為2^(max_depth)max_depth=-1,??#最大樹的深度learning_rate=0.1,??#學習率n_estimators=100,??#?擬合的樹的棵樹,相當于訓練輪數subsample_for_bin=200000,objective=None,class_weight=None,min_split_gain=0.0,??#?最小分割增益min_child_weight=0.001,??#?分支結點的最小權重min_child_samples=20,subsample=1.0,??#?訓練樣本采樣率?行subsample_freq=0,??#?子樣本頻率colsample_bytree=1.0,??#?訓練特征采樣率?列reg_alpha=0.0,??#?L1正則化系數reg_lambda=0.0,??#?L2正則化系數random_state=None,n_jobs=-1,silent=True, ) clf.fit(X_train,?y_train,?eval_metric='auc') #設置驗證集合?verbose=False不打印過程 clf.fit(X_train,?y_train)y_true,?y_pred?=?y_test,?clf.predict(X_test) print("Accuracy?:?%.4g"?%?metrics.accuracy_score(y_true,?y_pred))Accuracy : 0.927參考
1.https://xgboost.readthedocs.io/
2.https://lightgbm.readthedocs.io/
3.https://blog.csdn.net/q383700092/article/details/53763328?locationNum=9&fps=1
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載黃海廣老師《機器學習課程》視頻課黃海廣老師《機器學習課程》711頁完整版課件本站qq群955171419,加入微信群請掃碼:
總結
以上是生活随笔為你收集整理的【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何实现多路海康大华等RTSP数据转RT
- 下一篇: jeecg t:datagrid标签 每