Title: 机器学习模型迭代方法(总结) · Issue #60 · aialgorithm/Blog · GitHub
Open Graph Title: 机器学习模型迭代方法(总结) · Issue #60 · aialgorithm/Blog
X Title: 机器学习模型迭代方法(总结) · Issue #60 · aialgorithm/Blog
Description: 模型迭代方法 机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种: 1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。 优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难; 2、模型融合的方法,将旧模型的预测结果作为一个新增特征,在新的数据上面训练一个新的模型;优缺点:...
Open Graph Description: 模型迭代方法 机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种: 1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。 优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难; 2、模型融合的方...
X Description: 模型迭代方法 机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种: 1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。 优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难; 2、模型融合的方...
Opengraph URL: https://github.com/aialgorithm/Blog/issues/60
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"机器学习模型迭代方法(总结)","articleBody":"## 模型迭代方法\r\n机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种:\r\n\r\n- 1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。 优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难;\r\n\r\n- 2、模型融合的方法,将旧模型的预测结果作为一个新增特征,在新的数据上面训练一个新的模型;优缺点:训练耗时较短了,增加决策的复杂度,新增数据量要足够多才能保证融合效果;\r\n\r\n- 3、增量(在线)学习的方法,如sklearn中算法可调用partial_fit直接增量学习,可以直接利用新增的数据在原来的模型的基础上做进一步更新。增量学习对于模型迭代是很有效率的(特别适用于神经网络的学习,如 arxiv.org/abs/1711.03705)。实际使用中,在线学习和离线的全量学习经常是结合使用,比如离线以全量数据训练一个复杂的模型,在线利用新增样本进行微调。优缺点:对内存友好,模型迭代快且效率较高;\r\n\r\n## 二、增量学习\r\n主流的几种机器学习框架,已经实现了增量学习的功能,像sklearn可以直接调用partial_fit做增量学习,神经网络增量学习也很方便,如下tensorflow.keras框架实现增量学习:\r\n```\r\n# tensorflow.keras增量学习\r\nmodel_path = 'init.model' #加载线上的原模型\r\nloaded_model = tf.keras.models.load_model(model_path)\r\n# 新数据上接着训练原模型\r\nhistory = loaded_model.fit(\r\n train_data_gen,\r\n epochs=epochs\r\n)\r\n```\r\n本文主要对树模型的增量(在线)学习展开介绍,如下以树模型lightgbm及xgboost增量学习金融违约的分类模型为例,验证实际的效果。\r\n示例沿用之前文章的数据集:[一文梳理金融风控建模全流程(Python)](https://mp.weixin.qq.com/s?__biz=MzI4MDE1NjExMQ==\u0026mid=2247489574\u0026idx=1\u0026sn=98ca40dd2775428963b50a05e3a1f06c\u0026chksm=ebbd9a86dcca1390c85fe18b330db1f8c0458a783a8d327c65a74fbcb38f2b72390dc64c4fe2\u0026scene=178\u0026cur_album_id=1986073923821551618#rd))\r\n\r\n开始之前,我们先把数据划分为训练集及测试集,测试集数据仅做评估。接着训练数据再划分为两部分:旧训练数据,新训练数据集。以此验证用增量学习方法进行学习新数据集的效果\r\n\r\n```\r\n# 划分数据集:训练集和测试集\r\ntrain_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)\r\n\r\n# 训练集再划分新旧的训练集,新的训练集用增量学习方法进行学习\r\ntrainold_x, trainnew_x, trainold_y, trainnew_y = train_test_split(train_x, train_y,test_size=0.5, random_state=0)\r\n\r\nlgb_train = lgb.Dataset(trainold_x, trainold_y)\r\nlgb_newtrain = lgb.Dataset(trainnew_x, trainnew_y)\r\nlgb_eval = lgb.Dataset(test_x,test_y, reference=lgb_train)\r\n\r\n```\r\n\r\n\r\n训练原始的lightgbm模型,评估模型效果还算不错:train {'AUC': 0.8696629477540933, 'KS': 0.6470059543871476}\r\ntest {'AUC': 0.8458304576799567, 'KS': 0.6284431987999525}\r\n```\r\n# 参数\r\nparams = {\r\n 'task': 'train',\r\n 'boosting_type': 'gbdt', # 设置提升类型\r\n 'objective': 'binary', # 目标函数\r\n 'metric': {'l2', 'auc'}, # 评估函数\r\n 'num_leaves': 12, # 叶子节点数\r\n 'learning_rate': 0.05, # 学习速率\r\n 'feature_fraction': 0.9, # 建树的特征选择比例\r\n 'bagging_fraction': 0.8, # 建树的样本采样比例\r\n 'verbose': 1 \r\n}\r\n \r\n# 模型训练\r\ngbm = lgb.train(params, lgb_train, num_boost_round=1)\r\n\r\nprint('train ',model_metrics(gbm,trainold_x, trainold_y))\r\nprint('test ',model_metrics(gbm,test_x,test_y))\r\n# 树模型决策的可视化\r\n\r\n\r\n# 需要先安装https://graphviz.org/download/\r\nimport os\r\nos.environ[\"PATH\"] += os.pathsep + 'D:/Program Files/Graphviz/bin/'\r\n\r\nfor k in range(1):\r\n 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'])\r\nplt.show()\r\n\r\n```\r\n打印出原始树模型的结构如下:\r\n\r\n\r\n接下来就是本文的重点了,增量学习新的lightgbm树模型,我们在原有gbm模型的基础上继续更新模型为gbm2。\r\n\r\n其实,lightgbm增量学习的更新方式其实就是原有模型的树结构都不变的基础上,继续添加学习一些树,比如如下代码我们会继续训练出2棵新的树,\r\n```\r\nnum_boost_round = 2 # 继续训练2颗树\r\ngbm2 = lgb.train(params,\r\n lgb_newtrain, #新的数据\r\n num_boost_round=num_boost_round ,\r\n init_model=gbm, #在原模型gbm的基础上接着训练\r\n verbose_eval=False,\r\n keep_training_booster=True) # 支持模型增量训练\r\n\r\n```\r\n\r\n\r\n\r\n从增量学习后的树模型的结构,可以看出原有树模型gbm结构一点都没有变,只是再后面更新了2棵新的树。验证增量学习更新后的模型效果,测试集的auc是有提升1%左右的(注:本例无考虑调参下的效果差异,仅从效果来看是还不错的~)\r\n\r\n\r\n这时就有个疑问了,树模型的增量学习只有像类似“打补丁”的更新方式吗,不能通过更新下旧模型的叶子节点的权重?\r\n\r\n其实,这两种增量学习方法,树模型可以有的,但是对于lightgbm我没有找到支持的方法,有兴趣的同学可以再了解下。。如下为XGBOOST实现两种增量学习的方法\r\n```\r\n### xgbooost 增量学习 https://xgboost.readthedocs.io/en/latest/parameter.html\r\nimport xgboost as xgb\r\nimport pprint\r\n\r\nxgb_params_01 = {}\r\n# 增量学习的方法一\r\nxgb_params_02 = {'process_type': 'default', # default, update\r\n 'refresh_leaf': True} # 当前迭代树的结构不变,并在此增加新树\r\n# 增量学习的方法二\r\nxgb_params_02 = {'process_type': 'update', # default, update\r\n 'updater': 'refresh', # 也可以选择再当前模型做剪枝\r\n 'refresh_leaf': True} # 仅重新更新模型的叶节点权重,\r\n\r\ndtrain_2class = xgb.DMatrix(train_x[num_feas], label=train_y,enable_categorical=True)\r\ngbdt = xgb.train(xgb_params_01, dtrain_2class, num_boost_round=1) # 旧模型\r\npprint.pprint(gbdt.get_dump())\r\ngbdt = xgb.train(xgb_params_02, dtrain_2class, num_boost_round=2, xgb_model=gbdt) # 更新模型\r\npprint.pprint(gbdt.get_dump())\r\n```\r\n\r\n\r\n\r\n\r\n\r\n","author":{"url":"https://github.com/aialgorithm","@type":"Person","name":"aialgorithm"},"datePublished":"2022-11-02T03:39:08.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/60/Blog/issues/60"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:e5316397-c344-5f85-9fe0-fac762606260 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D6B8:2F31CD:9B5E02:D6126C:6969EC7D |
| html-safe-nonce | 6b507bf3293a582f0ad7333f7350880c5792fb784f9138975ebd75bfafce7a1c |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJENkI4OjJGMzFDRDo5QjVFMDI6RDYxMjZDOjY5NjlFQzdEIiwidmlzaXRvcl9pZCI6IjY3NDUxNjU5ODMxNjE5MDQyNTMiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 330a0ec30ee635f63363d537a58c1e61d2abb05065b3b7e625b0fb7bb8f5b78e |
| hovercard-subject-tag | issue:1432431374 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/aialgorithm/Blog/60/issue_layout |
| twitter:image | https://opengraph.githubassets.com/e622c553d5c61efa3697474582e394ea81da5bc1c80813481113ca8e9d2a4cfb/aialgorithm/Blog/issues/60 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/e622c553d5c61efa3697474582e394ea81da5bc1c80813481113ca8e9d2a4cfb/aialgorithm/Blog/issues/60 |
| og:image:alt | 模型迭代方法 机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种: 1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。 优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难; 2、模型融合的方... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | aialgorithm |
| hostname | github.com |
| expected-hostname | github.com |
| None | 7b32f1c7c4549428ee399213e8345494fc55b5637195d3fc5f493657579235e8 |
| turbo-cache-control | no-preview |
| go-import | github.com/aialgorithm/Blog git https://github.com/aialgorithm/Blog.git |
| octolytics-dimension-user_id | 33707637 |
| octolytics-dimension-user_login | aialgorithm |
| octolytics-dimension-repository_id | 147093233 |
| octolytics-dimension-repository_nwo | aialgorithm/Blog |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 147093233 |
| octolytics-dimension-repository_network_root_nwo | aialgorithm/Blog |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | bdde15ad1b403e23b08bbd89b53fbe6bdf688cad |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width