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 os
os.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.html
import xgboost as xgb
import pprint

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

本文章轉載微信公眾號@算法進階

上一篇:

全面解析Kmeans聚類算法(Python)

下一篇:

Python特征選擇(全)
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費