信息:機器學習模型迭代方法(Python)
機器學習模型在實際應用的場景,通常要根據新增的數據下進行模型的迭代,常見的模型迭代方法有以下幾種:
1、全量數據重新訓練一個模型,直接合并歷史訓練數據與新增的數據,模型直接離線學習全量數據,學習得到一個全新的模型。優缺點:這也是實際最為常見的模型迭代方式,通常模型效果也是最好的,但這樣模型迭代比較耗時,資源耗費比較多,實時性較差,特別是在大數據場景更為困難;
2、模型融合的方法,將舊模型的預測結果作為一個新增特征,在新的數據上面訓練一個新的模型;優缺點:訓練耗時較短了,增加決策的復雜度,新增數據量要足夠多才能保證融合效果;
(資料圖片)
3、增量(在線)學習的方法,如sklearn中算法可調用partial_fit直接增量學習,可以直接利用新增的數據在原來的模型的基礎上做進一步更新。增量學習對于模型迭代是很有效率的(特別適用于神經網絡的學習,如 arxiv.org/abs/1711.03705)。實際使用中,在線學習和離線的全量學習經常是結合使用,比如離線以全量數據訓練一個復雜的模型,在線利用新增樣本進行微調。優缺點:對內存友好,模型迭代快且效率較高;
二、增量學習主流的幾種機器學習框架,已經實現了增量學習的功能,像sklearn可以直接調用partial_fit做增量學習,神經網絡增量學習也很方便,如下tensorflow.keras框架實現增量學習:
# tensorflow.keras增量學習model_path = "init.model" #加載線上的原模型loaded_model = tf.keras.models.load_model(model_path)# 新數據上接著訓練原模型history = loaded_model.fit(train_data_gen,epochs=epochs)
本文主要對樹模型的增量(在線)學習展開介紹,如下以樹模型lightgbm及xgboost增量學習金融違約的分類模型為例,驗證實際的效果。示例沿用之前文章的數據集:一文梳理金融風控建模全流程(Python))
開始之前,我們先把數據劃分為訓練集及測試集,測試集數據僅做評估。接著訓練數據再劃分為兩部分:舊訓練數據,新訓練數據集。以此驗證用增量學習方法進行學習新數據集的效果
# 劃分數據集:訓練集和測試集train_x, test_x, train_y, test_y = train_test_split(train_bank[num_feas + cate_feas], train_bank.isDefault,test_size=0.3, random_state=0)# 訓練集再劃分新舊的訓練集,新的訓練集用增量學習方法進行學習trainold_x, trainnew_x, trainold_y, trainnew_y = train_test_split(train_x, train_y,test_size=0.5, random_state=0)lgb_train = lgb.Dataset(trainold_x, trainold_y)lgb_newtrain = lgb.Dataset(trainnew_x, trainnew_y)lgb_eval = lgb.Dataset(test_x,test_y, reference=lgb_train)
訓練原始的lightgbm模型,評估模型效果還算不錯:train {"AUC": 0.8696629477540933, "KS": 0.6470059543871476}test {"AUC": 0.8458304576799567, "KS": 0.6284431987999525}
# 參數params = {"task": "train","boosting_type": "gbdt", # 設置提升類型"objective": "binary", # 目標函數"metric": {"l2", "auc"}, # 評估函數"num_leaves": 12, # 葉子節點數"learning_rate": 0.05, # 學習速率"feature_fraction": 0.9, # 建樹的特征選擇比例"bagging_fraction": 0.8, # 建樹的樣本采樣比例"verbose": 1 }# 模型訓練gbm = lgb.train(params, lgb_train, num_boost_round=1)print("train ",model_metrics(gbm,trainold_x, trainold_y))print("test ",model_metrics(gbm,test_x,test_y))# 樹模型決策的可視化# 需要先安裝https://graphviz.org/download/import osos.environ["PATH"] += os.pathsep + "D:/Program Files/Graphviz/bin/"for k in range(1):ax = lgb.plot_tree(gbm, tree_index=k, figsize=(30,20), show_info=["split_gain","internal_value","internal_count","internal_weight","leaf_count","leaf_weight","data_percentage"])plt.show()
打印出原始樹模型的結構如下:
接下來就是本文的重點了,增量學習新的lightgbm樹模型,我們在原有gbm模型的基礎上繼續更新模型為gbm2。
其實,lightgbm增量學習的更新方式其實就是原有模型的樹結構都不變的基礎上,繼續添加學習一些樹,比如如下代碼我們會繼續訓練出2棵新的樹,
num_boost_round = 2 # 繼續訓練2顆樹gbm2 = lgb.train(params,lgb_newtrain, #新的數據num_boost_round=num_boost_round ,init_model=gbm, #在原模型gbm的基礎上接著訓練verbose_eval=False,keep_training_booster=True) # 支持模型增量訓練
從增量學習后的樹模型的結構,可以看出原有樹模型gbm結構一點都沒有變,只是再后面更新了2棵新的樹。驗證增量學習更新后的模型效果,測試集的auc是有提升1%左右的(注:本例無考慮調參下的效果差異,僅從效果來看是還不錯的~)
這時就有個疑問了,樹模型的增量學習只有像類似“打補丁”的更新方式嗎,不能通過更新下舊模型的葉子節點的權重?
其實,這兩種增量學習方法,樹模型可以有的,但是對于lightgbm我沒有找到支持的方法,有興趣的同學可以再了解下。。如下為XGBOOST實現兩種增量學習的方法
### xgbooost 增量學習 https://xgboost.readthedocs.io/en/latest/parameter.htmlimport xgboost as xgbimport pprintxgb_params_01 = {}# 增量學習的方法一xgb_params_02 = {"process_type": "default", # default, update"refresh_leaf": True} # 當前迭代樹的結構不變,并在此增加新樹# 增量學習的方法二xgb_params_02 = {"process_type": "update", # default, update"updater": "refresh", # 也可以選擇再當前模型做剪枝"refresh_leaf": True} # 僅重新更新模型的葉節點權重,dtrain_2class = xgb.DMatrix(train_x[num_feas], label=train_y,enable_categorical=True)gbdt = xgb.train(xgb_params_01, dtrain_2class, num_boost_round=1) # 舊模型pprint.pprint(gbdt.get_dump())gbdt = xgb.train(xgb_params_02, dtrain_2class, num_boost_round=2, xgb_model=gbdt) # 更新模型pprint.pprint(gbdt.get_dump())
閱讀原文訪問文章代碼,歡迎點贊在看轉發三連!
相關閱讀
-
信息:機器學習模型迭代方法(Python)
一、模型迭代方法機器學習模型在實際應用的場景,通常要根據新增的... -
當前觀點:Gitlab安裝及使用
Gitlab是基于RubyonRails開源的項目管理和代碼托管平臺,可以很方便... -
記一次chrome插件調試
前言因為谷歌翻譯退出中國,導致翻譯不太好用了,所以去谷歌商店找... -
微速訊:冪等 —— 讓函數再次純潔
冪等——讓函數再次純潔純潔地做人,是一種美德。寫純函數,是程序... -
【第28題】console的異步性怎么理解?
面試題目(字節):console的異步性怎么理解?答案解析:console我一... -
當前快播:“趣味運動會項目”教學思路
說在前面浙教版《選擇性必修一數據和數據結構》第一章是全書的導論...