【機(jī)器學(xué)習(xí)】機(jī)器學(xué)習(xí)模型迭代方法(Python)
、模型迭代方法
機(jī)器學(xué)習(xí)模型在實(shí)際應(yīng)用的場(chǎng)景,通常要根據(jù)新增的數(shù)據(jù)下進(jìn)行模型的迭代,常見的模型迭代方法有以下幾種:
1、全量數(shù)據(jù)重新訓(xùn)練一個(gè)模型,直接合并歷史訓(xùn)練數(shù)據(jù)與新增的數(shù)據(jù),模型直接離線學(xué)習(xí)全量數(shù)據(jù),學(xué)習(xí)得到一個(gè)全新的模型。優(yōu)缺點(diǎn):這也是實(shí)際最為常見的模型迭代方式,通常模型效果也是最好的,但這樣模型迭代比較耗時(shí),資源耗費(fèi)比較多,實(shí)時(shí)性較差,特別是在大數(shù)據(jù)場(chǎng)景更為困難;
2、模型融合的方法,將舊模型的預(yù)測(cè)結(jié)果作為一個(gè)新增特征,在新的數(shù)據(jù)上面訓(xùn)練一個(gè)新的模型;優(yōu)缺點(diǎn):訓(xùn)練耗時(shí)較短了,增加決策的復(fù)雜度,新增數(shù)據(jù)量要足夠多才能保證融合效果;
3、增量(在線)學(xué)習(xí)的方法,如sklearn中算法可調(diào)用partial_fit直接增量學(xué)習(xí),可以直接利用新增的數(shù)據(jù)在原來的模型的基礎(chǔ)上做進(jìn)一步更新。增量學(xué)習(xí)對(duì)于模型迭代是很有效率的(特別適用于神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí),如 arxiv.org/abs/1711.03705)。實(shí)際使用中,在線學(xué)習(xí)和離線的全量學(xué)習(xí)經(jīng)常是結(jié)合使用,比如離線以全量數(shù)據(jù)訓(xùn)練一個(gè)復(fù)雜的模型,在線利用新增樣本進(jìn)行微調(diào)。優(yōu)缺點(diǎn):對(duì)內(nèi)存友好,模型迭代快且效率較高;
二、增量學(xué)習(xí)
主流的幾種機(jī)器學(xué)習(xí)框架,已經(jīng)實(shí)現(xiàn)了增量學(xué)習(xí)的功能,像sklearn可以直接調(diào)用partial_fit做增量學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)增量學(xué)習(xí)也很方便,如下tensorflow.keras框架實(shí)現(xiàn)增量學(xué)習(xí):
# tensorflow.keras增量學(xué)習(xí)model_path = 'init.model' #加載線上的原模型loaded_model = tf.keras.models.load_model(model_path)# 新數(shù)據(jù)上接著訓(xùn)練原模型history = loaded_model.fit(train_data_gen,epochs=epochs)
本文主要對(duì)樹模型的增量(在線)學(xué)習(xí)展開介紹,如下以樹模型lightgbm及xgboost增量學(xué)習(xí)金融違約的分類模型為例,驗(yàn)證實(shí)際的效果。示例沿用之前文章的數(shù)據(jù)集:一文梳理金融風(fēng)控建模全流程(Python))
開始之前,我們先把數(shù)據(jù)劃分為訓(xùn)練集及測(cè)試集,測(cè)試集數(shù)據(jù)僅做評(píng)估。接著訓(xùn)練數(shù)據(jù)再劃分為兩部分:舊訓(xùn)練數(shù)據(jù),新訓(xùn)練數(shù)據(jù)集。以此驗(yàn)證用增量學(xué)習(xí)方法進(jìn)行學(xué)習(xí)新數(shù)據(jù)集的效果
# 劃分?jǐn)?shù)據(jù)集:訓(xùn)練集和測(cè)試集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)# 訓(xùn)練集再劃分新舊的訓(xùn)練集,新的訓(xùn)練集用增量學(xué)習(xí)方法進(jìn)行學(xué)習(xí)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)
訓(xùn)練原始的lightgbm模型,評(píng)估模型效果還算不錯(cuò):train {'AUC': 0.8696629477540933, 'KS': 0.6470059543871476} test {'AUC': 0.8458304576799567, 'KS': 0.6284431987999525}
# 參數(shù)params = {'task': 'train','boosting_type': 'gbdt', # 設(shè)置提升類型'objective': 'binary', # 目標(biāo)函數(shù)'metric': {'l2', 'auc'}, # 評(píng)估函數(shù)'num_leaves': 12, # 葉子節(jié)點(diǎn)數(shù)'learning_rate': 0.05, # 學(xué)習(xí)速率'feature_fraction': 0.9, # 建樹的特征選擇比例'bagging_fraction': 0.8, # 建樹的樣本采樣比例'verbose': 1}# 模型訓(xùn)練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()
打印出原始樹模型的結(jié)構(gòu)如下:
接下來就是本文的重點(diǎn)了,增量學(xué)習(xí)新的lightgbm樹模型,我們?cè)谠術(shù)bm模型的基礎(chǔ)上繼續(xù)更新模型為gbm2。
其實(shí),lightgbm增量學(xué)習(xí)的更新方式其實(shí)就是原有模型的樹結(jié)構(gòu)都不變的基礎(chǔ)上,繼續(xù)添加學(xué)習(xí)一些樹,比如如下代碼我們會(huì)繼續(xù)訓(xùn)練出2棵新的樹,
num_boost_round = 2 # 繼續(xù)訓(xùn)練2顆樹gbm2 = lgb.train(params,lgb_newtrain, #新的數(shù)據(jù)num_boost_round=num_boost_round ,init_model=gbm, #在原模型gbm的基礎(chǔ)上接著訓(xùn)練verbose_eval=False,keep_training_booster=True) # 支持模型增量訓(xùn)練

從增量學(xué)習(xí)后的樹模型的結(jié)構(gòu),可以看出原有樹模型gbm結(jié)構(gòu)一點(diǎn)都沒有變,只是再后面更新了2棵新的樹。驗(yàn)證增量學(xué)習(xí)更新后的模型效果,測(cè)試集的auc是有提升1%左右的(注:本例無考慮調(diào)參下的效果差異,僅從效果來看是還不錯(cuò)的~)
這時(shí)就有個(gè)疑問了,樹模型的增量學(xué)習(xí)只有像類似“打補(bǔ)丁”的更新方式嗎,不能通過更新下舊模型的葉子節(jié)點(diǎn)的權(quán)重?
其實(shí),這兩種增量學(xué)習(xí)方法,樹模型可以有的,但是對(duì)于lightgbm我沒有找到支持的方法,有興趣的同學(xué)可以再了解下。。如下為XGBOOST實(shí)現(xiàn)兩種增量學(xué)習(xí)的方法
### xgbooost 增量學(xué)習(xí) https://xgboost.readthedocs.io/en/latest/parameter.htmlimport xgboost as xgbimport pprintxgb_params_01 = {}# 增量學(xué)習(xí)的方法一xgb_params_02 = {'process_type': 'default', # default, update'refresh_leaf': True} # 當(dāng)前迭代樹的結(jié)構(gòu)不變,并在此增加新樹# 增量學(xué)習(xí)的方法二xgb_params_02 = {'process_type': 'update', # default, update'updater': 'refresh', # 也可以選擇再當(dāng)前模型做剪枝'refresh_leaf': True} # 僅重新更新模型的葉節(jié)點(diǎn)權(quán)重,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())
往期精彩回顧
適合初學(xué)者入門人工智能的路線及資料下載 (圖文+視頻)機(jī)器學(xué)習(xí)入門系列下載 機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印 《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 機(jī)器學(xué)習(xí)交流qq群955171419,加入微信群請(qǐng)掃碼
