AI信贷审批系统搭建与调优实战100例 - 第4节

4. 特征工程

案例 4:数据标准化(Z-score)——消除量纲影响

目标:在信贷审批模型中,特征如“年收入(元)”与“信用分(300~850)”量纲差异巨大。若不处理,距离类模型(如KNN)或正则化模型(如Lasso)会偏向高数值特征。本案例使用 StandardScaler 实现Z-score标准化,使每个特征均值为0、标准差为1,消除量纲影响。

技术焦点:sklearn.preprocessing.StandardScaler 的 fit / transform / fit_transform 用法,以及标准化对模型系数的实际影响。

原始数据(量纲差异大) 年收入 信用分 σ≈20000 σ≈50 Z-score标准化后(均值0,标准差1) 年收入 信用分 σ≈1 μ≈0

核心代码

import numpy as np
from sklearn.preprocessing import StandardScaler

# 模拟信贷审批特征:年收入(元),信用分(300-850),负债率(0-1)
X = np.array([
    [85000, 720, 0.35],
    [42000, 610, 0.62],
    [120000, 780, 0.28],
    [31000, 540, 0.80],
    [65000, 690, 0.45]
])

# 1. 创建标准化器
scaler = StandardScaler()

# 2. 拟合并转换(Z-score)
X_scaled = scaler.fit_transform(X)

# 3. 查看标准化后的均值和标准差(近似0和1)
print("标准化后均值:", X_scaled.mean(axis=0).round(6))
print("标准化后标准差:", X_scaled.std(axis=0).round(6))

# 4. 关键参数:均值与标准差(用于新数据转换)
print("训练集均值:", scaler.mean_)
print("训练集标准差:", scaler.scale_)

# 5. 新样本(如新申请客户)使用同一scaler转换
new_customer = np.array([[90000, 700, 0.40]])
new_customer_scaled = scaler.transform(new_customer)
print("新客户标准化后:", new_customer_scaled)

# 6. 对比:标准化前Lasso系数偏向高量纲特征,标准化后系数更均衡
from sklearn.linear_model import Lasso
y = np.array([1, 0, 1, 0, 1])  # 是否批准(示例标签)

# 未标准化
lasso_raw = Lasso(alpha=0.01).fit(X, y)
print("未标准化系数:", lasso_raw.coef_)

# 标准化后
lasso_scaled = Lasso(alpha=0.01).fit(X_scaled, y)
print("标准化后系数:", lasso_scaled.coef_)

验证路径与预期现象

  • 验证1:运行代码后,输出“标准化后均值”接近 [0,0,0](误差<1e-6),标准差接近 [1,1,1]。
  • 验证2:对比Lasso系数:未标准化时,年收入 的系数值远大于 信用分(因为数值大);标准化后,各特征系数量级接近,模型不再被高数值特征主导。
  • 验证3:新客户 [90000,700,0.4] 标准化后,各特征值均落在约 [-1,1] 区间,说明已消除量纲影响。

迁移要点:在信贷审批流水线中,StandardScaler 必须在训练集上 fit,然后对验证集/测试集仅做 transform,避免数据泄露。对于树模型(如XGBoost)标准化非必需,但对线性模型、SVM、KNN和神经网络至关重要。