
使用這些基本 REST API 最佳實踐構建出色的 API
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())
本文章轉載微信公眾號@算法進階