<dl id="llxdb"></dl>
<video id="llxdb"><output id="llxdb"></output></video><dl id="llxdb"><output id="llxdb"></output></dl>
<output id="llxdb"></output>
<noframes id="llxdb"><dl id="llxdb"></dl>
<video id="llxdb"></video>
<output id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></output>
<video id="llxdb"></video><dl id="llxdb"><output id="llxdb"></output></dl>
<dl id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></dl><video id="llxdb"></video><dl id="llxdb"></dl><dl id="llxdb"><output id="llxdb"><font id="llxdb"></font></output></dl>
                          您的位置:首頁 >聚焦 >

                          信息:機器學習模型迭代方法(Python)

                          2022-10-27 22:16:00    來源:程序員客棧
                          一、模型迭代方法

                          機器學習模型在實際應用的場景,通常要根據新增的數據下進行模型的迭代,常見的模型迭代方法有以下幾種:

                          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())

                          閱讀原文訪問文章代碼,歡迎點贊在看轉發三連!

                          關鍵詞: 增量學習 的基礎上 機器學習

                          相關閱讀

                          Av久草
                          <dl id="llxdb"></dl>
                          <video id="llxdb"><output id="llxdb"></output></video><dl id="llxdb"><output id="llxdb"></output></dl>
                          <output id="llxdb"></output>
                          <noframes id="llxdb"><dl id="llxdb"></dl>
                          <video id="llxdb"></video>
                          <output id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></output>
                          <video id="llxdb"></video><dl id="llxdb"><output id="llxdb"></output></dl>
                          <dl id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></dl><video id="llxdb"></video><dl id="llxdb"></dl><dl id="llxdb"><output id="llxdb"><font id="llxdb"></font></output></dl>