当前位置:首页>python>QIAN数据:Python信用评分卡模型的数学应用

QIAN数据:Python信用评分卡模型的数学应用

  • 2026-07-03 07:59:10
QIAN数据:Python信用评分卡模型的数学应用

QIAN

数据

5

25

2026年

    信用评分卡是金融风控最经典的模型之一,也是银行、消费金融、互联网金融领域最广泛使用的量化风控工具。申请评分卡(A卡,Application Scorecard)、行为评分卡(B卡,Behavior Scorecard)、催收评分卡(C卡,Collection Scorecard),覆盖了信贷全生命周期——贷前审批、贷中监控、贷后催收。三张卡背后都是同一套数学框架:WOE编码 + IV变量筛选 + Logistic回归 + 分数映射。这套框架之所以经久不衰,是因为它兼顾了统计可解释性和业务可操作性——每个变量对最终分数的贡献都是透明、可追溯的,这对金融行业的合规审计至关重要。

本文用German Credit数据,手写一遍完整流程,从WOE/IV计算到模型训练再到分数映射,并在最后讨论模型上线后的稳定性监控与cutoff决策。


一、WOE与IV:从信息论到特征工程

WOE(Weight of Evidence)衡量每个分箱中"好客户 vs 坏客户"的分布差异。其思想源于信息论中的证据权重:如果一个分组中好客户的占比显著高于坏客户,则该组对"好"标签提供了正向证据。

定义:

好客户占比 p_good_i = n_good_i / N_good_total

坏客户占比 p_bad_i = n_bad_i / N_bad_total

WOE_i = ln( p_good_i / p_bad_i )

IV = Σ (p_good_i - p_bad_i) × WOE_i

WOE > 0 表示该分组好客户占比更高(加分项),WOE < 0 表示风险更高(扣分项)。WOE的绝对值越大,该分箱的区分能力越强。

IV衡量特征整体区分能力:

IV < 0.02 → 无预测力,弃用

0.02 ~ 0.10 → 弱

0.10 ~ 0.30 → 中等

> 0.30 → 强

注意:IV是WOE的加权和,权重为p_good - p_bad。这意味着即使某个分箱WOE绝对值很大,如果该分箱样本占比很小,对IV的贡献也有限。


二、Logistic回归:从概率到分数

逻辑回归建模违约概率:

ln( p / (1-p) ) = β₀ + β₁x₁ + β₂x₂ + ... + βₖxₖ

其中 p = P(违约=1)。注意评分卡中通常将WOE值作为x输入,而非原始变量。这样做的好处是:WOE已经完成了变量从原始值到风险度量单位的标准化,使得不同量纲的变量可以在同一尺度上进行比较。

评分卡分数通过线性变换得到:

Score = A - B × ln( p / (1-p) )

A和B由两个业务参数确定:

PDO(Points to Double Odds):odds每翻倍,分数增加多少

BaseOdds:基准odds对应的分数BaseScore

代入得:

B = PDO / ln(2)

A = BaseScore - B × ln(BaseOdds)

最终每个变量的得分 = -B × βᵢ × WOEᵢ + 常数分摊。其中常数分摊项是 -B × β₀ / k(k为变量个数),保证所有变量得分加上常数等于总分。


三、Python实现:完整代码

下面用German Credit数据跑通全流程。数据包含1000条样本,20个变量(7个数值+13个分类),目标变量good=1/bad=2。

# 导入必备库import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_auc_score, roc_curvefrom scipy.stats import chi2_contingencyimport warningswarnings.filterwarnings('ignore')# 中文显示设置plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falsetoday = '2026-05-25'

# ---------- 1. 加载German Credit数据 ----------# UCI Statlog数据集,用空格分隔,无headerurl = 'https://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data'cols = [    'checking_status', 'duration', 'credit_history', 'purpose',    'credit_amount', 'savings', 'employment', 'installment_rate',    'personal_status', 'other_debtors', 'residence_since',    'property', 'age', 'other_installment', 'housing',    'existing_credits', 'job', 'dependents', 'telephone', 'foreign_worker',    'target']df = pd.read_csv(url, sep=' ', header=None, names=cols)# German Credit: 1=good, 2=bad → 转成 0=good, 1=baddf['target'] = df['target'].map({1: 0, 2: 1})print(f'样本量: {len(df)}, 好客户: {(df.target==0).sum()}, 坏客户: {(df.target==1).sum()}')

预期输出:样本量 1000,好客户 700,坏客户 300(好:坏 ≈ 7:3,存在一定不平衡)。


# ---------- 2. WOE与IV计算函数 ----------def calc_woe_iv_continuous(df, feature, target='target', bins=10):    """连续变量:等频分箱后计算WOE/IV"""    df_ = df[[feature, target]].copy()    # qcut等频分箱,duplicates='drop'自动合并边界重复    df_['bin'] = pd.qcut(df_[feature], q=bins, duplicates='drop', labels=False)    grouped = df_.groupby('bin')[target].agg(['count', 'sum'])    grouped.columns = ['total', 'bad']    grouped['good'] = grouped['total'] - grouped['bad']    total_good = grouped['good'].sum()    total_bad = grouped['bad'].sum()    grouped['p_good'] = grouped['good'] / total_good    grouped['p_bad'] = grouped['bad'] / total_bad    # 处理极端值:clip加极小量避免ln(0)或除以零    eps = 1e-6    grouped['p_good'] = grouped['p_good'].clip(lower=eps)    grouped['p_bad'] = grouped['p_bad'].clip(lower=eps)    grouped['WOE'] = np.log(grouped['p_good'] / grouped['p_bad'])    grouped['IV'] = (grouped['p_good'] - grouped['p_bad']) * grouped['WOE']    return grouped, grouped['IV'].sum()def calc_woe_iv_categorical(df, feature, target='target'):    """分类变量:直接按原始类别计算WOE/IV"""    grouped = df.groupby(feature)[target].agg(['count', 'sum'])    grouped.columns = ['total', 'bad']    grouped['good'] = grouped['total'] - grouped['bad']    total_good = grouped['good'].sum()    total_bad = grouped['bad'].sum()    eps = 1e-6    grouped['p_good'] = grouped['good'] / total_good    grouped['p_bad'] = grouped['bad'] / total_bad    grouped['p_good'] = grouped['p_good'].clip(lower=eps)    grouped['p_bad'] = grouped['p_bad'].clip(lower=eps)    grouped['WOE'] = np.log(grouped['p_good'] / grouped['p_bad'])    grouped['IV'] = (grouped['p_good'] - grouped['p_bad']) * grouped['WOE']    return grouped, grouped['IV'].sum()

# ---------- 3. 计算全部变量的IV并排名 ----------num_features = ['duration', 'credit_amount', 'installment_rate',                'residence_since', 'age', 'existing_credits', 'dependents']cat_features = [c for c in cols[:-1] if c not in num_features]iv_results = []for feat in num_features:    _, iv = calc_woe_iv_continuous(df, feat)    iv_results.append((feat, iv, 'num'))for feat in cat_features:    _, iv = calc_woe_iv_categorical(df, feat)    iv_results.append((feat, iv, 'cat'))iv_df = pd.DataFrame(iv_results, columns=['feature', 'IV', 'type'])iv_df = iv_df.sort_values('IV', ascending=False)print('\n变量IV排名 (Top 10):')print(iv_df.head(10).to_string(index=False))

预期输出:

变量IV排名 (Top 10):         feature       IV typechecking_status  0.666012  cat credit_history  0.293234  cat       duration  0.246542  num        savings  0.196010  cat        purpose  0.169195  cat  credit_amount  0.113637  num       property  0.112638  cat            age  0.100622  num     employment  0.086434  cat        housing  0.083293  cat

可以看到checking_status的IV超过0.30,属于强预测力变量。


# ---------- 4. WOE替换 + Logistic回归建模 ----------def woe_transform_continuous(df, feature, target='target', bins=10):    """连续变量:用分箱WOE值替换原始值"""    df_ = df[[feature, target]].copy()    df_['bin'] = pd.qcut(df_[feature], q=bins, duplicates='drop', labels=False)    woe_map = calc_woe_iv_continuous(df, feature, target)[0]['WOE'].to_dict()    return df_['bin'].map(woe_map)# 选IV > 0.02的变量进入模型(剔除无预测力的特征)selected = iv_df[iv_df['IV'] > 0.02]['feature'].tolist()print(f'\n入选变量 ({len(selected)}个): {selected}')# 构建WOE特征矩阵X_woe = pd.DataFrame()for feat in selected:    if feat in num_features:        X_woe[feat] = woe_transform_continuous(df, feat)    else:        grp, _ = calc_woe_iv_categorical(df, feat)        woe_map = grp['WOE'].to_dict()        X_woe[feat] = df[feat].map(woe_map)y = df['target'].valuesX_train, X_test, y_train, y_test = train_test_split(    X_woe, y, test_size=0.3, random_state=42, stratify=y)# 带L2正则的逻辑回归,防止过拟合lr = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs', max_iter=500)lr.fit(X_train, y_train)y_pred = lr.predict_proba(X_test)[:, 1]auc = roc_auc_score(y_test, y_pred)print(f'\nAUC = {auc:.4f}')print(f'模型系数: {dict(zip(selected, lr.coef_[0]))}')

预期输出:AUC约0.83。每个变量的系数符号应与WOE的经济含义一致——WOE越高(好客户占比高)的变量,系数均为负(降低违约概率),符合业务逻辑。


# ---------- 5. 评分卡分数映射 ----------# 业务参数设定(由金融机构风控政策决定)PDO = 50          # odds每翻一倍,分数增加50base_odds = 50    # 基准odds = 50:1(即每50个好客户有1个坏客户)base_score = 600  # 基准odds对应的分数# 计算A、B参数B = PDO / np.log(2)A = base_score - B * np.log(base_odds)print(f'\nA = {A:.2f}, B = {B:.2f}')print(f'分数公式: Score = {A:.2f} - {B:.2f} × ln(odds)')# 计算每个变量每单位WOE对应的分数变化intercept = lr.intercept_[0]scores = {}for i, feat in enumerate(selected):    beta = lr.coef_[0][i]    scores[feat] = -B * beta  # 变量每增加1单位WOE的分数变化print('\n变量分数权重(绝对值越大,该变量对最终分数影响越大):')for feat, s in sorted(scores.items(), key=lambda x: abs(x[1]), reverse=True):    print(f'  {feat}: {s:.2f} 分/单位WOE')

预期输出:

A = 317.81, B = 72.13Score = 317.81 - 72.13 × ln(odds)变量分数权重:  installment_rate: 95.64 分/单位WOE  foreign_worker: 67.95 分/单位WOE  other_installment: 65.49 分/单位WOE  savings: 62.52 分/单位WOE  personal_status: 57.40 分/单位WOE  employment: 54.49 分/单位WOE  checking_status: 53.48 分/单位WOE  duration: 47.04 分/单位WOE  ...

# ---------- 6. PSI群体稳定性指标计算 ----------# PSI衡量模型评分在不同时间/样本上的分布偏移# PSI = Σ (实际占比 - 预期占比) × ln(实际占比 / 预期占比)def calc_psi(score_actual, score_expected, bins=10):    """计算评分卡分数的PSI"""    # 以预期样本的分位点为锚点分箱    _, bin_edges = pd.qcut(score_expected, q=bins, retbins=True, duplicates='drop')    # 对实际样本应用同样的切分点    actual_bins = pd.cut(score_actual, bins=bin_edges, include_lowest=True)    expected_bins = pd.cut(score_expected, bins=bin_edges, include_lowest=True)    actual_pct = pd.Series(actual_bins).value_counts(normalize=True).sort_index().values    expected_pct = pd.Series(expected_bins).value_counts(normalize=True).sort_index().values    # 处理零占比:用极小值代替    eps = 1e-4    actual_pct = np.clip(actual_pct, eps, None)    expected_pct = np.clip(expected_pct, eps, None)    psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))    return psi# 模拟:用测试集作为"实际"分布,训练集作为"预期"分布# 实际业务中,预期分布来自模型开发时的基准样本log_odds_train = lr.decision_function(X_train)score_train = A - B * log_odds_trainlog_odds_test = lr.decision_function(X_test)score_test = A - B * log_odds_testpsi_value = calc_psi(score_test, score_train)print(f'\nPSI (测试集 vs 训练集) = {psi_value:.4f}')# PSI判定标准if psi_value < 0.1:    print('✅ PSI < 0.1:稳定性良好,无需干预')elif psi_value < 0.25:    print('⚠️ PSI 0.1~0.25:轻度偏移,需关注并及时监控')else:    print('❌ PSI > 0.25:严重偏移,建议重新开发模型')

预期输出:PSI (测试集 vs 训练集) ≈ 0.07~0.08。由于训练集和测试集来自同一分布,PSI很小,验证了模型在分布一致时的稳定性。


# ---------- 7. 可视化(5张图) ----------fig, axes = plt.subplots(2, 3, figsize=(18, 10))fig.suptitle(f'QIAN DATA: {today} — 信用评分卡全流程分析', fontsize=16, y=0.98)# 图1:Top 8变量IV柱状图top8 = iv_df.head(8)colors = ['skyblue' if t == 'num' else 'slateblue' for t in top8['type']]ax1 = axes[0, 0]bars = ax1.barh(top8['feature'], top8['IV'], color=colors, edgecolor='gray')ax1.axvline(0.02, color='red', ls='--', alpha=0.5, label='IV=0.02(剔除线)')ax1.axvline(0.10, color='orange', ls='--', alpha=0.5, label='IV=0.10(弱)')ax1.axvline(0.30, color='green', ls='--', alpha=0.5, label='IV=0.30(强)')ax1.set_xlabel('IV')ax1.set_title('QIAN DATA: 变量IV排名')ax1.invert_yaxis()ax1.legend(fontsize=8)# 图2:WOE分布(以duration为例)——展示单调性grp_dur, _ = calc_woe_iv_continuous(df, 'duration')ax2 = axes[0, 1]x_idx = np.arange(len(grp_dur))ax2.bar(x_idx - 0.2, grp_dur['p_good'], 0.3, color='skyblue',        label='好客户占比', alpha=0.8)ax2.bar(x_idx + 0.2, grp_dur['p_bad'], 0.3, color='slateblue',        label='坏客户占比', alpha=0.8)ax2_twin = ax2.twinx()ax2_twin.plot(x_idx, grp_dur['WOE'], 'ro-', markersize=5, label='WOE')ax2.set_xticks(x_idx)ax2.set_xticklabels([f'箱{i+1}' for i in range(len(grp_dur))], fontsize=8)ax2.set_title('QIAN DATA: duration变量WOE单调性检验')ax2.legend(loc='upper left', fontsize=8)ax2_twin.legend(loc='upper right', fontsize=8)# 图3:ROC曲线fpr, tpr, _ = roc_curve(y_test, y_pred)ax3 = axes[0, 2]ax3.plot(fpr, tpr, 'b-', lw=2, label=f'AUC = {auc:.3f}')ax3.plot([0, 1], [0, 1], 'k--', alpha=0.5)ax3.fill_between(fpr, tpr, alpha=0.15, color='skyblue')ax3.set_xlabel('假正率 (FPR)')ax3.set_ylabel('真正率 (TPR)')ax3.set_title('QIAN DATA: ROC曲线')ax3.legend(loc='lower right')# 图4:分数分布 + cutoff分析log_odds_all = lr.decision_function(X_woe)scores_all = A - B * log_odds_all# 基于实际分数分布动态计算cutoff参考线cutoff_low = np.percentile(scores_all, 25)cutoff_high = np.percentile(scores_all, 75)ax4 = axes[1, 0]ax4.hist(scores_all[y == 0], bins=30, alpha=0.6, color='skyblue',         label='好客户', density=True)ax4.hist(scores_all[y == 1], bins=30, alpha=0.6, color='salmon',         label='坏客户', density=True)ax4.axvline(base_score, color='gray', ls='--', alpha=0.7, label=f'基准分{base_score}')ax4.axvline(cutoff_low, color='red', ls=':', alpha=0.5, label=f'P25 cutoff={cutoff_low:.0f}')ax4.axvline(cutoff_high, color='green', ls=':', alpha=0.5, label=f'P75 cutoff={cutoff_high:.0f}')ax4.set_xlabel('评分卡分数')ax4.set_ylabel('密度')ax4.set_title('QIAN DATA: 评分卡分数分布与cutoff示意')ax4.legend(fontsize=8)# 图5:PSI分布对比(测试集 vs 训练集)ax5 = axes[1, 1]ax5.hist(score_train, bins=20, alpha=0.6, color='steelblue',         label='训练集(预期)', density=True)ax5.hist(score_test, bins=20, alpha=0.6, color='coral',         label='测试集(实际)', density=True)ax5.axvline(np.mean(score_train), color='steelblue', ls='--', alpha=0.7)ax5.axvline(np.mean(score_test), color='coral', ls='--', alpha=0.7)ax5.set_xlabel('评分卡分数')ax5.set_ylabel('密度')ax5.set_title(f'QIAN DATA: PSI稳定性监控 (PSI={psi_value:.3f})')ax5.legend(fontsize=8)# 图6:通过率与坏账率权衡曲线(cutoff决策辅助)# 使用测试集计算(模型未见过),避免训练集偏差log_odds_test = lr.decision_function(X_test)scores_test_k = A - B * log_odds_testcutoff_min = int(np.floor(np.percentile(scores_test_k, 10) / 10) * 10)cutoff_max = int(np.ceil(np.percentile(scores_test_k, 95) / 10) * 10)cutoffs = np.arange(cutoff_min, cutoff_max + 1, 10)pass_rates = []bad_rates = []for cutoff in cutoffs:    pred_approve = (scores_test_k >= cutoff).astype(int)    pass_rate = pred_approve.mean()    approved = pred_approve == 1    if approved.sum() > 0:        bad_rate = y_test[approved].mean()    else:        bad_rate = 0    pass_rates.append(pass_rate)    bad_rates.append(bad_rate)ax6 = axes[1, 2]ax6_twin = ax6.twinx()ax6.plot(cutoffs, pass_rates, 'b-', lw=2, label='通过率')ax6_twin.plot(cutoffs, bad_rates, 'r-', lw=2, label='坏账率')ax6.axvline(base_score, color='gray', ls='--', alpha=0.5, label=f'基准分{base_score}')ax6.set_xlabel('Cutoff分数')ax6.set_ylabel('通过率', color='b')ax6_twin.set_ylabel('坏账率', color='r')ax6.set_title('QIAN DATA: 通过率与坏账率权衡')ax6.legend(loc='upper left', fontsize=8)ax6_twin.legend(loc='upper right', fontsize=8)plt.tight_layout(rect=[0, 0, 1, 0.95])plt.savefig('credit_scorecard_viz.png', dpi=150, bbox_inches='tight')plt.show()

注意:此处从2×2布局改为2×3布局(6张子图),涵盖IV排名、WOE单调性、ROC、分数分布、PSI对比和cutoff权衡。


四、结果分析与业务解读

1. 变量筛选

信用历史(checking_status)、存款(savings)、贷款目的(purpose)、贷款金额(credit_amount)的IV最高,是风控的核心变量。年龄(age)IV很低,说明年龄本身对违约的区分能力有限(但分段交叉后可能有效)。实际业务中,建议保留IV > 0.02的变量,但对IV在0.02~0.10之间的弱变量,可以结合业务经验判断是否保留。

2. WOE单调性诊断

WOE的单调性是评分卡质量的重要检验标准。以duration为例,理想情况下,贷款期限越长WOE应单调递减(风险递增)。判断方法:

- 视觉检查——WOE折线图是否呈单调上升或下降趋势

- 相邻箱WOE差值符号是否一致——计算 $\Delta WOE_i = WOE_{i+1} - WOE_i$,检查所有差值是否同号

- 单调性指数(Monotonicity Index)——相邻箱WOE符号一致的占比,1.0为完全单调

出现非单调WOE时的处理方法:

合并相邻箱:将WOE趋势相反的相邻箱合并,重新计算(最常用且有效)

调整分箱数:减少分箱数(如从10箱减至5箱),通常能改善单调性

使用单调分箱算法:如Monotonic Binning(基于决策树或MIP优化),强制分箱满足单调约束。Python的scipy.optimizemonotonic_binning包可实现

变量变换:对原始变量做log、sqrt、平方等变换后再分箱,有时能恢复单调关系

业务合并:按业务含义手动定义分箱边界(如贷款期限按<12月、12-24月、24-48月、>48月分组),而非依赖等频分箱

在German Credit数据中,duration的WOE大体呈单调递减趋势(箱1→箱4WOE从正转负),说明分箱基本合理。如果某个变量的WOE完全没有单调性,建议剔除该变量或重新分箱。需要注意的是,WOE完全单调并非绝对强制——业务可解释性更重要。如果某个分箱的WOE反常但样本量极小(如<5%),可接受;但如果核心变量的WOE明显违反业务常识(如金额越高反而WOE越高),则必须排查。

此外,WOE的绝对值大小同样重要。WOE绝对值过小(如|WOE|<0.1)的分箱区分力有限;WOE绝对值过大(如|WOE|>5)说明该箱样本极端稀疏,训练集和测试集可能不一致,容易过拟合。

3. AUC ~ 0.83

在仅用少量变量、WOE替换+简单逻辑回归的情况下,区分度已经不错。实际生产中还会加入特征交叉、样本权重、拒绝推断等优化。对于评分卡,AUC在0.75以上即可投入初步使用,0.80以上为良好。

4. 分数分布与cutoff设定

这是评分卡落地最关键的决策之一。通过绘制"通过率-坏账率权衡曲线"(代码图6),业务方可以综合评估:

保守策略:设置高cutoff(如650),通过率低但坏账率也低,适合经济下行期

激进策略:设置低cutoff(如500),通过率高但坏账率上升,适合市场扩张期

平衡点选择:找到通过率与坏账率的交叉点或利润最大化点

具体操作步骤:

1. 计算每个cutoff下的累计通过率(分数≥cutoff的客户占比)

2. 计算对应坏账率(通过客户中实际违约的比例)

3. 结合获客成本和违约损失,计算每个cutoff的预期利润

4. 选择利润最大化或满足风控要求的cutoff作为审批阈值

利润估算示例(代码可扩展):

```

假设:每笔贷款平均金额10,000元,利息收入1,200元,违约损失率80%

违约成本 = 10,000 × 80% = 8,000元/笔

净利润 = 通过客户数 × 1,200 - 违约客户数 × 8,000

cutoff=550时:通过率85%,坏账率8%

预期利润 = 1000×85%×(92%×1200 - 8%×8000) ≈ 拾万元级

cutoff=600时:通过率70%,坏账率5%

预期利润 = 1000×70%×(95%×1200 - 5%×8000) ≈ 同等量级

```

实际业务中需要通过蒙特卡洛模拟或历史数据校准这些参数。不同业务场景下最优点差异很大:现金贷的cutoff通常较低(追求通过率),抵押贷的cutoff较高(控制坏账率)。

在实际业务中,还会考虑拒绝推断(Reject Inference)——被拒绝的客户没有标签,需要用模型推算其违约概率,否则通过率-坏账率曲线会存在偏差(选择性偏差)。常用的拒绝推断方法包括简单扩充法(Simple Augmentation)、模糊增强(Fuzzy Augmentation)、以及Heckman两步法。

5. PSI群体稳定性监控

评分卡上线后,需要持续监控模型评分分布是否发生偏移。PSI(Population Stability Index)是最常用的指标:

其中 $A_i$ 为实际分布在第i个分箱的占比,$E_i$ 为预期分布占比。PSI的本质是衡量两个分布的差异程度,取值越大说明分布偏移越严重。

PSI判定标准:

- PSI < 0.10:分布稳定,模型正常运行

- 0.10 ≤ PSI < 0.25:轻度偏移,需排查原因(客群变化?宏观经济变化?数据采集问题?)

- PSI ≥ 0.25:严重偏移,建议重新标定或重建模型

除了全量PSI,还建议监控每个变量的特征PSI——即每个变量单独计算分布偏移。如果全量PSI正常但某个特征的PSI偏高,说明该变量上游数据可能存在问题。

引起PSI上升的常见原因:

客群结构变化:获客渠道调整导致客群画像偏移。例如从线上获客转向线下,客户年龄、收入分布都会不同

宏观环境变化:经济周期、政策调整影响客户还款能力。例如疫情期间整体违约率上升

数据质量问题:上游数据源变更、特征缺失率上升、取值逻辑修改

评分卡老化:模型随时间推移区分能力自然衰减。通常评分卡有效期为1-3年,超过后建议重新开发

评分卡被博弈:客户或中介发现评分逻辑后针对性优化申请材料,导致变量分布偏移

建议建立PSI定期监控报表(月度/季度),设定预警阈值。同时监控各个分箱的WOE变化,定位漂移来源。如果发现某段时间PSI突然跳升,应回查该时间段内的业务变更和数据变更日志。

在代码示例中,测试集与训练集来自同一分布,PSI ≈ 0.07~0.08,属于稳定区间。但在真实生产环境中,PSI会随着时间推移逐渐上升,监控的目的就是在PSI超过阈值时及时预警。


五、注意事项

1. 分箱过细 vs 过粗

分箱过细(如bins=20)会导致部分箱样本极少,WOE估计不稳定,IV虚高(因为每个箱的p_good-p_bad被WOE放大)。分箱过粗(如bins=3)会损失区分信息,导致IV偏低,模型区分能力下降。建议连续变量初始分箱5~10箱,再根据业务含义和WOE单调性合并。一个经验法则:每个分箱至少包含5%的样本(即1000条样本中至少50条)和至少1个坏客户。如果某个分箱坏客户数为0,该箱WOE趋于+∞,应直接合并到相邻箱。

2. WOE极端值处理

当某个分箱中好客户或坏客户数量为零时,p_good或p_bad为零,导致ln(0)无穷大。常用的处理方法有:(a)加极小量平滑(如1e-6),(b)合并到相邻箱,(c)使用贝叶斯平滑(WOE = ln((good+0.5)/(bad+0.5) × (total_bad/total_good)))。在生产系统中,建议用方法(b)或(c),方法(a)可能导致WOE值不稳定且不同平滑量下结果差异大。另外,WOE绝对值超过5的分箱应视为异常,需要排查样本量是否过少。

3. 样本不平衡

German Credit的好:坏 = 7:3,属于中等不平衡。如果数据极度不平衡(如好:坏 = 99:1),WOE计算中p_good和p_bad的差异会被稀释,IV值偏低。此时建议:(a)对多数类进行下采样(随机删除部分好客户),(b)使用SMOTE等过采样方法合成少数类样本,(c)在逻辑回归中设置class_weight='balanced'自动调整样本权重。注意:评分卡场景下,下采样比过采样更常见,因为合成样本可能引入噪声。

4. 变量相关性

如果两个高相关变量同时入模,会导致系数不稳定、符号反转(多重共线性)。建议先做相关性分析(皮尔逊相关系数或VIF方差膨胀因子),对高度相关的变量(|r| > 0.7 或 VIF > 10)只保留IV较高的一个。评分卡更看重稳定性和可解释性,宁可损失一点区分度,也要保证系数的业务合理性。在German Credit数据中,credit_amount和duration的相关系数约0.6(金额越大、期限越长),属于中等相关,可以同时入模但需关注系数符号。

5. 拒绝推断(Reject Inference)

评分卡开发基于"已通过"客户的数据,这些客户本身就是经过历史评分卡筛选的。开发集的样本有偏,会导致评分卡对全量申请人的预测有偏。常用的拒绝推断方法包括:两阶段模型(Heckman校正)、模糊增强(Fuzzy Augmentation — 用模型预测被拒客户的标签概率并加权入模)、包裹法(Reclassification — 放宽审批标准重新获取部分被拒客户的标签)。在消费金融领域,拒绝推断可提升评分卡在低分段的表现(提升KS约3~8个百分点)。

6. 评分卡刻度验证

上线前,需要验证分数刻度是否准确——即PDO和基准分的设定是否正确。验证方法:将测试集按分数分组(如每50分一组),计算每组实际违约率(Bad Rate),再反向推导odds,检查odds翻倍是否对应PDO分差。例如,600分对应odds=50:1,650分对应odds=100:1,差值为50分(PDO),说明刻度正确。如果刻度偏差超过10%,需要检查得分映射逻辑。

7. 缺失值处理

生产数据中变量缺失是常态。评分卡对缺失值需要有明确的处理策略:(a)将缺失作为一个单独的分箱参与WOE计算,WOE值反映缺失样本的风险水平;(b)用均值/中位数填充,但会低估缺失的预测信息;(c)用模型预测填充。方法(a)最常用,因为缺失本身可能包含信息(如某些银行不提供某类贷款说明客户风险较高)。

8. 模型文档与合规

金融机构对评分卡有严格的合规要求(如巴塞尔协议、银保监会指引)。每个评分卡都需要完整的模型文档,包括:变量选择理由、分箱逻辑、WOE/IV分析、模型系数、KS/AUC验证结果、PSI监控计划、cutoff决策依据。模型文档不仅要供内部风控审批,还需要经得起外部审计和监管检查。


关键要点回顾:

WOE=ln(好占比/坏占比),正值代表加分,负值代表扣分

IV=Σ(p_good-p_bad)×WOE,衡量变量区分能力

WOE单调性是评分卡质量的核心检验标准,非单调时需重新分箱

Score=A-B×ln(odds),A和B由PDO和基准分确定

模型用的是WOE值而非原始值,保证每个变量对分数的贡献线性可比

Cutoff设定需权衡通过率与坏账率,不同的业务周期选择不同的策略

PSI用于监控评分卡上线后的稳定性,PSI<0.10为良好

分箱、极端值、不平衡、相关性、拒绝推断——每个环节都影响模型最终效果

推荐阅读

R语言 | 利用scorecard包实现信用风险评分卡

R | logistic回归分析(一)

© QianStat_data

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 09:40:25 HTTP/2.0 GET : https://f.mffb.com.cn/a/495460.html
  2. 运行时间 : 0.364242s [ 吞吐率:2.75req/s ] 内存消耗:4,711.13kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=e90ec4474dee1235b8bdf3862212aeaf
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000995s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001378s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.024805s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.004340s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001883s ]
  6. SELECT * FROM `set` [ RunTime:0.000680s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.002068s ]
  8. SELECT * FROM `article` WHERE `id` = 495460 LIMIT 1 [ RunTime:0.043396s ]
  9. UPDATE `article` SET `lasttime` = 1783042825 WHERE `id` = 495460 [ RunTime:0.012038s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000655s ]
  11. SELECT * FROM `article` WHERE `id` < 495460 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.027200s ]
  12. SELECT * FROM `article` WHERE `id` > 495460 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006671s ]
  13. SELECT * FROM `article` WHERE `id` < 495460 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.041406s ]
  14. SELECT * FROM `article` WHERE `id` < 495460 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.019679s ]
  15. SELECT * FROM `article` WHERE `id` < 495460 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.018642s ]
0.365729s