1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【機器學(xué)習(xí)】機器學(xué)習(xí)模型迭代方法(Python)

        共 3900字,需瀏覽 8分鐘

         ·

        2022-11-01 12:36

        、模型迭代方法

        機器學(xué)習(xí)模型在實際應(yīng)用的場景,通常要根據(jù)新增的數(shù)據(jù)下進(jìn)行模型的迭代,常見的模型迭代方法有以下幾種:

        • 1、全量數(shù)據(jù)重新訓(xùn)練一個模型,直接合并歷史訓(xùn)練數(shù)據(jù)與新增的數(shù)據(jù),模型直接離線學(xué)習(xí)全量數(shù)據(jù),學(xué)習(xí)得到一個全新的模型。優(yōu)缺點:這也是實際最為常見的模型迭代方式,通常模型效果也是最好的,但這樣模型迭代比較耗時,資源耗費比較多,實時性較差,特別是在大數(shù)據(jù)場景更為困難;

        • 2、模型融合的方法,將舊模型的預(yù)測結(jié)果作為一個新增特征,在新的數(shù)據(jù)上面訓(xùn)練一個新的模型;優(yōu)缺點:訓(xùn)練耗時較短了,增加決策的復(fù)雜度,新增數(shù)據(jù)量要足夠多才能保證融合效果;

        • 3、增量(在線)學(xué)習(xí)的方法,如sklearn中算法可調(diào)用partial_fit直接增量學(xué)習(xí),可以直接利用新增的數(shù)據(jù)在原來的模型的基礎(chǔ)上做進(jìn)一步更新。增量學(xué)習(xí)對于模型迭代是很有效率的(特別適用于神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí),如 arxiv.org/abs/1711.03705)。實際使用中,在線學(xué)習(xí)和離線的全量學(xué)習(xí)經(jīng)常是結(jié)合使用,比如離線以全量數(shù)據(jù)訓(xùn)練一個復(fù)雜的模型,在線利用新增樣本進(jìn)行微調(diào)。優(yōu)缺點:對內(nèi)存友好,模型迭代快且效率較高;

        二、增量學(xué)習(xí)

        主流的幾種機器學(xué)習(xí)框架,已經(jīng)實現(xiàn)了增量學(xué)習(xí)的功能,像sklearn可以直接調(diào)用partial_fit做增量學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)增量學(xué)習(xí)也很方便,如下tensorflow.keras框架實現(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)

        本文主要對樹模型的增量(在線)學(xué)習(xí)展開介紹,如下以樹模型lightgbm及xgboost增量學(xué)習(xí)金融違約的分類模型為例,驗證實際的效果。示例沿用之前文章的數(shù)據(jù)集:一文梳理金融風(fēng)控建模全流程(Python)

        開始之前,我們先把數(shù)據(jù)劃分為訓(xùn)練集及測試集,測試集數(shù)據(jù)僅做評估。接著訓(xùn)練數(shù)據(jù)再劃分為兩部分:舊訓(xùn)練數(shù)據(jù),新訓(xùn)練數(shù)據(jù)集。以此驗證用增量學(xué)習(xí)方法進(jìn)行學(xué)習(xí)新數(shù)據(jù)集的效果

        # 劃分?jǐn)?shù)據(jù)集:訓(xùn)練集和測試集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模型,評估模型效果還算不錯: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'},  # 評估函數(shù)    'num_leaves': 12,  # 葉子節(jié)點數(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)如下:

        接下來就是本文的重點了,增量學(xué)習(xí)新的lightgbm樹模型,我們在原有g(shù)bm模型的基礎(chǔ)上繼續(xù)更新模型為gbm2。

        其實,lightgbm增量學(xué)習(xí)的更新方式其實就是原有模型的樹結(jié)構(gòu)都不變的基礎(chǔ)上,繼續(xù)添加學(xué)習(xí)一些樹,比如如下代碼我們會繼續(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)一點都沒有變,只是再后面更新了2棵新的樹。驗證增量學(xué)習(xí)更新后的模型效果,測試集的auc是有提升1%左右的(注:本例無考慮調(diào)參下的效果差異,僅從效果來看是還不錯的~)

        這時就有個疑問了,樹模型的增量學(xué)習(xí)只有像類似“打補丁”的更新方式嗎,不能通過更新下舊模型的葉子節(jié)點的權(quán)重?

        其實,這兩種增量學(xué)習(xí)方法,樹模型可以有的,但是對于lightgbm我沒有找到支持的方法,有興趣的同學(xué)可以再了解下。。如下為XGBOOST實現(xiàn)兩種增量學(xué)習(xí)的方法

        ###  xgbooost 增量學(xué)習(xí)  https://xgboost.readthedocs.io/en/latest/parameter.htmlimport xgboost as xgbimport pprint
        xgb_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é)點權(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())
        閱讀原文訪問文章代碼,歡迎點贊在看轉(zhuǎn)發(fā)三連!
        往期精彩回顧




        瀏覽 61
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美少妇做爱 | 91人人摸| www.无码高清 | 少妇无套进入大叫XXXX视频 | ヘンリー冢本xxxx中文字幕 | 中文字幕一区字幕二区三区四区五区 | 91无码视频 | 99视频精品全部免费看 | 美女张开腿让我了一夜 | 高潮是mamamama的韩文歌 |