☰
信用风险预测模型实战:从标签定义、WOE特征工程到评分卡转换
2026/10/12 0:32:14 网站建设 项目流程

简介:这份PDF是一篇基于机器学习算法的商业银行信用风险预测模型研究论文,适合金融科技、风控建模方向的从业者、研究生及竞赛选手参考。文章从信用风险研究的现实背景切入,系统梳理了多元判别分析、Logistic回归等传统统计方法,以及SVM、BP神经网络与PCA降维结合等前沿探索,并回顾了土耳其35家银行和我国144家沪深上市公司的对比研究。随后以新网银行竞赛脱敏数据为案例,针对高维稀疏、好坏样本比例达21:1等难点,完整呈现缺失值处理、均值填充与归一化、随机森林特征排序、TOP25特征选取,以及Logistic、决策树、Adaboost、GBDT、LGB五种模型的AUC对比,得出LGB表现最佳的结论。资源为单篇PDF文件,大小1.5MB,已有538人学习浏览,对需要快速把握信用风险建模全流程与模型选型思路的读者具有较高参考价值。

1. 信用风险预测,不是“调一个模型”这么简单

「基于机器学习算法的信用风险预测模型研究.pdf」这个标题,我在金融风控圈子里看过很多次——课程设计、毕业设计、初入行的算法工程师练手项目,都爱用这个名字。它描述的事情说穿了不复杂:给定一个信贷申请人的历史数据,预测他未来会不会违约、逾期多久、损失多少,然后决定批不批、给多少额度、定多少利率。但真正按这个标题把项目做完、投到线上的人都知道,难点从来不在“跑通一个机器学习算法”,而在样本怎么切、坏客户怎么定义、特征怎么编码、模型怎么在业务里活下来。这篇文章我会沿着一条完整的落地路径走一遍:先立住指标体系,再做特征工程,再对比建模方案,最后把回避不了的坑和上线后的评分卡转换讲清楚。适合三类人读:准备拿这个选题做机器学习课程设计的在校生、刚进风控数据分析岗的新人,以及想把手头“只跑通离线实验”的模型推进到可交付状态的一线工程师。

2. 先定义什么是“违约”:样本、标签与评估口径

信用风险预测模型最常见的翻车方式不是模型训练失败,而是标签定义错了。很多新手拿到一批信贷数据,看到“是否逾期”这一列就直接当 Y 用,结果 AUC 高得离谱,上线后一塌糊涂。原因很简单:逾期不等于违约,逾期 1 天和逾期 90 天对资金损失的影响差两个数量级,而机器学习算法只能学到你喂给它的定义。

2.1 Y 的定义:观察期、表现期与坏客户窗口

从业界常用的口径来看,信用评分模型会把样本切成一个时间轴:观察点(表现起始日)之前的历史行为作为特征 X,观察点之后的一段固定时间长度作为表现期,用来判断 Y 是好还是坏。我这里有一个团队常用的划分逻辑:观察点设在放款日或某个固定日期,表现期长度为 6~12 个月,表现期内出现连续逾期 90 天以上(或 M3+)的客户定义为坏客户,逾期 30 天内且没有二次逾期定义为好客户,中间模糊地带直接剔除,不参与建模。

import pandas as pd # df 必须包含四列:客户ID、观察点日期、表现期内最大逾期天数、逾期持续月数 # 规则:表现期 12 个月,坏客户=最大逾期天数 >= 90 天或 M3+;好客户=最大逾期天数 <= 29 天 def make_label(df, obs_col='obs_date', max_dpd_col='max_dpd', months_col='mob'): df = df.copy() # 表现期不足 12 个月的样本先筛掉,避免“还没坏”被误判成好客户 df = df[df[months_col] >= 12].copy() df['label'] = 0 df.loc[df[max_dpd_col] >= 90, 'label'] = 1 # 30~89 天的中间带直接剔除,不参与训练 df = df[(df[max_dpd_col] <= 29) | (df[max_dpd_col] >= 90)] return df[['customer_id', 'label']]

这段代码的关键在于df[df[months_col] >= 12]这一句。真实业务环境里,最近 3 个月内新放的款、新注册的用户并没有走完一个完整表现期,它们的“未逾期”不代表“不会逾期”,直接进训练集会严重稀释坏样本比例。我在实际项目里还遇到过另一个衍生问题:如果把观察点定得太靠近放款日,首期还款压力还没释放,模型学到的其实是“首期就还不上的极端客户”,对长周期风险评估帮助有限。常见做法是把观察点往历史回拨 3 到 6 个月,让表现期覆盖足够完整的还款行为。

2.2 指标选择:KS、AUC、Lift 与 IV 各管一段

模型训练完最怕只盯一个 AUC。在信贷领域,AUC 衡量的是“随机抽一个好客户和随机抽一个坏客户,模型把坏客户排前面的概率”,它反映排序能力但不反映业务意义。实际交付时我一般同时看四个数:AUC 看整体区分度,KS 看好坏样本累计分布的最大差距,Lift 看在头部 10% 的群体里坏客户浓度能提升多少倍,IV 看每个特征对 Y 的预测能力。后面三个直接决定模型能不能用:AUC 0.75 的模型在好人堆里区分度尚可,但 KS 如果低于 0.3,策略团队大概率不会采纳。

from sklearn.metrics import roc_auc_score, roc_curve import numpy as np def compute_ks(y_true, y_pred): fpr, tpr, _ = roc_curve(y_true, y_pred) ks = max(tpr - fpr) # 业务惯例:KS < 0.2 认为区分度不足,0.3~0.5 为可用,>0.7 先怀疑目标泄漏 return ks auc = roc_auc_score(y_true, y_pred) ks = compute_ks(y_true, y_pred) print(f'AUC={auc:.4f}, KS={ks:.4f}')

运行之后先别高兴。KS 高到 0.7 以上的模型,在信贷数据里基本意味着 Y 泄漏——某个特征隐含了已经发生逾期的信息,比如把“当前欠款金额”放进特征。正常授信评估场景,模型是在放款前做决策的,放款那一刻之后的信息(账单金额、还款行为、催收记录)一概不能进特征。这个问题几乎没有例外,每批新人都要踩一遍。

2.3 数据来源:征信字段、自有交易数据与三方数据的拼接

做这个课题能拿到的数据通常分三档:央行征信报告的衍生变量、平台自有交易/还款行为数据、三方数据机构提供的多头借贷和黑名单分数。传统评分卡主要用征信里的逾期历史、查询次数、负债收入比;机器学习模型则可以把自有数据里更细粒度的行为变量加进来,如夜间交易占比、提前还款频率、额度使用率的变化斜率。特征不是越多越好,而是要考虑业务可解释性和数据更新时间。我见过不少课题组的特征表里塞了 800 多个变量,最后模型上线连上线审批都过不了。

3. 特征工程是信用模型的胜负手:从分箱到 WOE/IV

把课程设计级别的评分卡项目和真正能上线的机器学习模型区分开来的,往往不是用了多高级的算法,而是特征工程做到什么程度。信用数据里大量变量是重度偏态的连续值,比如总收入、授信额度、近 6 个月查询次数,裸奔进模型之后归一化都困难;更麻烦的是缺失率极高、异常值极多。所以这个领域有一套通用做法:先分箱,再算 WOE,再筛 IV。这套流程本身就是“基于机器学习算法的信用风险预测模型研究”这个标题下最值得写进论文、也最值得复现的部分。

3.1 连续变量分箱:等频、等距与最优分箱

分箱就是把连续变量切成几段,每段一个离散取值。常见做法有三种:等频分箱(每箱样本量差不多)、等距分箱(每箱区间宽度一样)、最优分箱(依据目标变量做卡方合并或决策树分箱)。信用风险建模里我一般不用等距分箱,因为数据集中在低值区,等距切出来低值区间可能挤了几万个样本,高值区间只有几个人,稳定性很差。等频分箱是稳妥起点,但会导致敏感边界值(比如查询 6 次和 7 次)跨箱分裂,对单调性不友好。

import pandas as pd import numpy as np def woe_iv_bin(df, feature, target, bins=10): # 等频分箱:按分位数切,bad_rate 是每箱坏客户占比 df = df[[feature, target]].copy() df['bin'] = pd.qcut(df[feature], q=bins, duplicates='drop') grouped = df.groupby('bin', as_index=False)[target].agg( total='count', bad='sum') grouped['good'] = grouped['total'] - grouped['bad'] # WOE 公式:ln(坏分布/好分布),分子分母都做平滑防除零 total_bad = grouped['bad'].sum() total_good = grouped['good'].sum() grouped['bad_dist'] = grouped['bad'] / total_bad grouped['good_dist'] = grouped['good'] / total_good grouped['woe'] = np.log((grouped['bad_dist'] + 1e-6) / (grouped['good_dist'] + 1e-6)) # IV = (坏分布 - 好分布) * WOE,度量该变量区分度 grouped['iv_part'] = (grouped['bad_dist'] - grouped['good_dist']) * grouped['woe'] iv = grouped['iv_part'].sum() return grouped, iv

WOE 编码的本质是把“每箱内坏客户相对浓度”替换原始数值,它让变量与 Y 的关系在箱级别上变成近似单调的,这对逻辑回归尤其重要。代码里的1e-6平滑项就是处理某一箱全是好客户或全是坏客户的情况;不加这个,good_dist等于 0 时对数直接算成负无穷,整个 IV 就算废了。实际建模中,如果某个变量的 IV 超过了 0.5,先别高兴——它很有可能命中了我上一章提到的目标泄漏,需要回头查一遍特征时间口径。

3.2 IV 值筛选:保留哪些特征有行业惯例

IV 值的行业经验值大致是这样:小于 0.02 的变量基本没有预测力,直接丢;0.02 到 0.1 属于弱变量,在大样本模型里可以留一部分;0.1 到 0.3 是主力特征区间,大部分优质变量落在这里;超过 0.5 就要排查泄漏。我在离线实验里见过的实际数据,贷款金额、年龄、性别这类变量的 IV 通常很低(0.01 上下),而历史逾期次数 M2+、最近 3 个月查询次数、负债收入比的 IV 普遍在 0.1 以上。筛选的时候不要只看单变量 IV,还要跑一遍相关性矩阵——两个 IV 都是 0.2 的变量如果相关系数 0.9,留下一个就够了,都留进模型只会放大共线性,影响线性模型的可解释性。

# 对所有特征跑完 woe_iv_bin 后,按 IV 值排序+相关性去重 iv_dict = {} for col in feature_cols: _, iv = woe_iv_bin(df, col, df['label'], bins=10) iv_dict[col] = iv iv_series = pd.Series(iv_dict).sort_values(ascending=False) selected = list(iv_series[iv_series >= 0.02].index) # 相关性去重:两两相关 > 0.8 时保留 IV 更高的一侧 corr_matrix = df[selected].corr().abs() drop_set = set() for i in range(len(selected)): for j in range(i + 1, len(selected)): if corr_matrix.iloc[i, j] > 0.8: if iv_series[selected[i]] >= iv_series[selected[j]]: drop_set.add(selected[j]) else: drop_set.add(selected[i]) selected = [c for c in selected if c not in drop_set]

这套筛选流程跑完后,变量数量一般会从几百个压到 30~80 个。注意上界:信用模型特征数量太少(比如低于 15 个)会导致区分度不足,尤其梯度提升树类算法需要足够的特征多样性来切分空间;特征太多(超过 200 个)又会带来线上数据缺失率管理的噩梦——每次模型上线都要给特征表里的每个字段写数据质量监控,成本很高。

3.3 缺失值与异常值:信用数据的“不回答本身也是信息”

信用数据里缺失值最特别。一个人的征信报告里某些字段没有记录,不一定代表他没有这回事,可能代表他从未使用过相应信贷产品,也可能代表数据源没覆盖到。实践中我见过一个真实例子:“月收入”缺失的人群违约率反而比填了低收入的人更低——因为这部分人大多从没在银行系统里留下收入信息,自然也没有过度负债的记录。所以信用模型处理缺失值的首选方案不是删除样本,而是单独拆出一个缺失分箱,让模型学着区分“缺失”和“有取值”两种情况。WOE 分箱代码里对应的方法很简单:分箱前先给缺失值打一个特殊标签,再放进groupby一起算,缺失箱的 WOE 就能体现出这个信息。

异常值处理也同理,不要轻易把“月收入 50 万”当成脏数据删掉——很多小企业主、自由职业者的真实收入结构就是大额波动。正确做法是分箱时让高分箱自然吸收尾部,或者用分位数截断到 99.9% 分位,保留信息但削弱极端值对整个统计量的干扰。这里有个血泪经验:千万不要在建模前用全局均值填充缺失后再归一化,那会让缺失模式完全消失,模型等于丢了一个隐形的强特征。

4. 建模对比:逻辑回归、XGBoost 与融合模型的实际表现

特征工程做完,就到了“基于机器学习算法的信用风险预测模型”最核心的部分:算法选型和训练评估。这个环节最常见的新手误区是直接上 XGBoost 然后到处调参,调不动了就认为是数据问题。实际上,逻辑回归在这个领域活了这么多年,不是因为简单,而是因为稳定、可解释、易监控、线上消耗低。梯度提升树类算法则强在能自动捕捉非线性关系和特征交互。两者不是替代关系,而是互补关系。

4.1 基线模型必须从逻辑回归开始

我建议所有信用风险预测课题先把逻辑回归跑通,作为全项目的基线。逻辑回归对经过 WOE 编码的特征几乎“即插即用”,因为 WOE 编码后的特征与 Y 的关系已经被改造成接近线性单调,逻辑回归只需学一组系数即可。另一个直接理由是风控业务对可解释性的要求:策略团队需要知道“为什么拒绝这个客户”(分数低、命中高负债比、最近查询次数多),线性模型可以直接解释每个特征的边际贡献;而树模型给出的 SHAP 解释需要额外维护一套输出逻辑。

from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( df[selected], df['label'], test_size=0.3, random_state=42) lr = LogisticRegression(C=1.0, class_weight='balanced', max_iter=200) lr.fit(X_train, y_train) # C 是正则化强度的倒数,越小正则越强;信用数据特征间相关性强,C 设太小会压垮权重 # class_weight='balanced' 让坏样本的权重按比例增大,专门对抗类别不平衡

逻辑回归的参数里最值得花时间的是 C 值。信用特征经过 WOE 编码之后,特征量纲基本一致,但共线性仍然存在;C 设得太大(比如 10)会让系数过度膨胀,训练集表现好看、测试集方差大;C 设得太小(比如 0.01)又会让模型过于保守,把特征都压到零附近,区分度下降。我一般用网格搜索在 0.01~10 之间按对数间隔扫,以验证集 KS 为优化目标。max_iter不用卡在默认值,50 万样本级别逻辑回归往往需要 200 次以上迭代才收敛。

4.2 XGBoost 的调参:先调树结构,再调正则,最后调学习率

逻辑回归跑出基线后,再用 XGBoost 或者 LightGBM 去挑战这个基线。梯度提升树的训练流程和调参顺序是有讲究的:第一步把n_estimators放到 500 以上、learning_rate设为 0.05 左右,先固定这两项,然后调max_depth和min_child_weight(控制树复杂度),再调subsample和colsample_bytree(控制采样随机性),最后回头调n_estimators配合早停。顺序错了会非常浪费时间——先调学习率而树的深度没过关,你会在一个错误的结构上反复横跳。

import xgboost as xgb dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) params = { 'objective': 'binary:logistic', 'eval_metric': 'auc', 'max_depth': 4, # 信用数据特征多且弱相关,树太深容易记住异常组合 'min_child_weight': 50, # 鼓励每个叶子至少有足够样本量,防止过拟合稀疏样本 'subsample': 0.8, 'colsample_bytree': 0.8, 'eta': 0.05, 'lambda': 1.0, 'scale_pos_weight': 30, # 坏:好 ≈ 1:30 时,用该参数给坏样本加权 } model = xgb.train(params, dtrain, num_boost_round=500, evals=[(dtest, 'test')], early_stopping_rounds=50, verbose_eval=50)

这段代码里scale_pos_weight=30是最关键的一行。信用风险数据坏样本比例通常只有 1%~5%,XGBoost 默认会把所有样本一视同仁,结果就是模型学会“全部预测为好客户”,AUC 虽然还能维持在 0.5 以上但毫无区分度。scale_pos_weight设置为负样本量与正样本量的比值是常用的经验值,但具体效果要看 KS;我一般从 10 开始试,往上调到 50,观察验证集 KS 的峰值,而不是机械地用比例值。

要特别警惕的是:树模型不需要 WOE 编码,直接用原始分箱后的数值(或干脆原始连续值)效果通常更好。因为树模型自己会找切分点,WOE 编码反而把变量分布压得太规则,丢失了分箱内部的细微差异。所以完整的特征是两套并存:一套 WOE 后的特征喂给逻辑回归,另一套原始(或分箱后)的特征喂给树模型。这也是为什么实际项目里特征存储要比单模型方案多出一倍的字段。

4.3 融合方案:逻辑回归兜底,树模型做补充

上线做融合时,我见过比较稳妥的做法是逻辑回归输出为 A 分数,XGBoost/LightGBM 输出为 B 分数,再用一个简单的加权和(或者在逻辑回归层再做一次 Stacking)合成最终决策分数。不要把两个模型分数简单相加了事——两个分数在量纲和分布上都不一样,而且逻辑回归和树模型在处理缺失箱时的行为不同。可以先把两者各自排序分成 10 档,再对档位做加权,这样能避免一个模型因为分值绝对水平高而垄断决策。

from scipy.special import logit import numpy as np # 假设 lr_prob 和 xgb_prob 都来自同一验证集 rank_lr = pd.qcut(lr_prob, 10, labels=False) # 排序分档,消除量纲差异 rank_xgb = pd.qcut(xgb_prob, 10, labels=False) blend = 0.6 * rank_lr + 0.4 * rank_xgb # 实际权重要通过简单网格搜索确定,0.6/0.4 只是通用起点

融合的价值不在“分数更高”,而在于稳定性和可解释性。逻辑回归对线性主效应刻画清晰,但学不到深层的特征交互;树模型擅长交互却很难向业务解释“为什么 A 客户比 B 客户高 3 分”。融合之后,策略团队可以用逻辑回归部分做准入规则的刚性拦截,用树模型部分做额度差异化定价的软性排序。

5. 避坑:从训练集好看到线上漂移的常见问题

这个章节我要写 4 个反复出现的坑,每一个都对应真实项目里踩过的血泪经验,而且大多不会出现在教科书和课程设计验收要求里。

5.1 现象:训练集 KS 0.45,验证集 KS 0.42,上线两周后掉到 0.25

原因不是过拟合,是时间穿越。模型训练用了包含未来信息的特征,最典型的样本是:观察点设置在 2024 年 6 月,但特征里有一个“近 3 个月逾期次数”的字段,这个字段在线上预测时只能取到 2024 年 6 月之前的数据,而训练时如果特征表和标签表来自同一份事后导出的数据,近 3 个月就会把标签发生期间的数据也卷进来。解决方法是做特征回溯:每个样本只允许使用观察点之前的数据来生成特征。实现上我一般把特征计算从样本表里拆出来,每个特征单独按“观察点 + 时间窗口”回拨重算。

5.2 现象:坏样本占比只有 0.8%,树模型迭代 100 轮后全部预测为好客户

原因不是模型 bug,而是默认目标函数和样本权重不匹配。我在第 4 章已经用scale_pos_weight处理过,这里补充一个细节:在sklearn的 XGBoost 接口里这个参数叫scale_pos_weight,在LightGBM里叫is_unbalance或scale_pos_weight,叫法不同但原理一致。如果加权之后坏样本召回率还是过低,下一个手段是做欠采样或 SMOTE 过采样,但切记:SMOTE 生成的新样本是插值出来的,在信贷数据里它会创造出现实中不存在的客户组合(比如“高收入+超高负债+零逾期”),这会误导树模型的边界。实际项目里我不会对信用数据使用 SMOTE,加权已经够了,顶多配合欠采样把好样本压到坏样本的 5~10 倍。

5.3 现象:验证集 KS 0.5,回放历史一个月,审批通过率比原策略低了一半

原因是用 KS 选阈值而不是用业务成本选阈值。KS 的最优点对应的是“把好坏客户区分得最开”的切分,但真实审批要考虑通过率和坏账率的平衡。通常做法是画出坏账率和通过率的曲线,由风控负责人给出一个“每拒绝 100 个好客户能拦住多少个坏客户”的接受阈值。模型只在“排序”上是主角,“切分”要听业务策略的。我在这个问题上翻过车:一版模型 KS 比旧模型高 0.1,结果 0.4 的通过率意味着月进件量直接蒸发 6 成,最后回退重新调阈值。

5.4 现象:模型上线后模型分数分布向左偏移,PSI 连续两周超过 0.1

原因大多数情况不是模型失效,而是客群结构变了或业务方改了入口流量策略。举个例子:某平台从只做白领客群调整为也接受蓝领客群,进件人群的年龄、收入、职业属性分布整体移动,模型还是按老客群学到的规律打分,分数自然偏移。这时应先做分层监控:按渠道、按产品、按客群分别跑 PSI,定位是哪一层的分布变了,再决定是重新训练、局部调阈值还是做策略开关。不要一看到 PSI 超了就急着重训模型——重训成本高且可能引入新的不稳定。模型监控阶段最好每个模型固定一个参考分布(建模时的验证集分布),每周更新一组线上分布对比图,变成常规动作。

6. 从模型分数到业务动作:评分卡转换、额度映射与模型维护

模型在离线验证集上表现稳定之后,还没到交付终点。风控部门实际消费的不是概率、不是 KS 值,而是一个“一眼能看懂”的分数——这在全行业有一个几乎是标准答案的做法:把模型输出概率映射到 300~900 分的信用分区间。逻辑回归系的 WOE 模型有历史悠久的评分卡公式可以直接换算;树模型输出的概率则做排序分档后映射。不管用哪种,刚从模型切换过来的团队都低估了这层转换的工作量。

6.1 将模型概率换算成信用分的标准公式

逻辑回归的评分卡公式基于“每增加一定分数,好坏比翻倍”的思想。假设基准分为 600 分,基准好坏比(odds)为 50:1,每升高 20 分好坏比翻一倍。换算成代码就三行:

factor = 20 / np.log(2) # 好坏比翻倍对应的分数增量除以 ln2 offset = 600 - factor * np.log(50) # 基准分校准偏移量 score = offset + factor * np.log(odds) # odds = p / (1 - p),即模型预测概率折算好坏比 # 注意:写大公式时直接把偏移和因子乘进去,不要用循环,几千行直接向量化算

参数里20和50都是可调的——按业务容忍度不同,分差跨度可以从 10 分调到 30 分,基准好坏比从 20:1 调到 100:1。业务侧要的是一个“分数下降 30 分,坏账概率大约翻几倍”的直观感受,因此完成分数换算后必须配套一张对照说明表,写清楚 550 分以下拒绝、550~620 分人工审核、620 分以上自动通过的大致分层,而不是让策略团队直接拿分去找阈值。

6.2 上线后的模型监测与重训周期

模型上线后我一般维护三张报表:按周看的分数分布直方图、按渠道拆分的 PSI 趋势、按月看的新老客群 KS 衰减曲线。第一年通常每月评估一次,如果 PSI 连续 4 周超过阈值就启动重训流程;第二年如果客群稳定,可以放宽到季度评估。重训时有个细节:不要全量重训丢弃旧模型,而是先在旧模型基础上增量训练一个候选模型,用近 6 个月的新数据做回放对比,确认 KS、通过率、坏账率三项指标都没有恶化再切换。切换时要保留旧模型一周的共跑数据作为后盾,这是唯一靠谱的“后悔药”机制。

6.3 这个方向值不值得做:成本收益与未来演进

对个人学习来说,这个方向很值得做。信用风险预测是少数几个“既有业务深度又有算法复杂度、还不需要专属硬件就能复现”的机器学习方向,一套 5 万行样本量级的信贷数据,一台普通笔记本完全跑得动,特征工程方法论可以直接迁移到反欺诈、客户流失预测等相邻领域。课程设计选题如果选这个,答辩时把 WOE/IV 流程和上面避坑章节里的标签定义讲清楚,就能和只会调 XGBoost 的同学拉开明显差距。对企业投入来说,只要业务方有稳定的进件流量和至少一年的历史表现数据,搭建这条流程的边际成本并不高;但如果只有几万条样本、标签还没有时间窗口,先别上机器学习——用一套专家规则评分卡处置半天内能解决的问题,比养一个看起来高级的模型更划算。

最后补一个我的个人习惯:每次建模完工后,我会把当时定义的观察期、表现期、标签口径、IV 筛选阈值、模型参数全部以 JSON 文件存档,并在文件名里加上日期。这个习惯救过我至少三次——三个月后模型表现下滑,回去查参数时才发现当时的scale_pos_weight是 40,而记录里写的是 30。存档不花时间,重训模型时翻旧账才花时间。希望这个习惯和上面这些过程细节,能帮你把这套流程一次跑通,少走几段我走过的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询