2. 环境准备与数据加载

在正式进入评分卡自动建模之前,环境准备与数据加载是决定后续流程能否顺畅复现的基础环节。很多初学者在建模阶段遇到报错,根源往往不在算法本身,而在于Python版本、依赖包冲突或数据读取方式不当。本章将围绕环境配置、scorecardpy安装、内置数据集结构以及数据初步探索四个部分展开,帮助你搭建一个稳定、可复用的建模起点。

一、核心原理:为什么环境与数据加载如此关键

scorecardpy 是一个面向信用评分卡开发的轻量级Python库,它封装了分箱、WOE转换、IV筛选、逻辑回归建模和评分卡刻度转换等常用功能。它的设计目标是让分析师用少量代码完成从原始数据到标准评分卡的完整链路。但正因为它依赖 pandas、numpy、scikit-learn、matplotlib 等基础库,环境版本不匹配时极易出现“函数存在但参数不兼容”或“绘图后端报错”等问题。

此外,评分卡建模对数据的结构有隐含要求:通常需要包含一个二分类目标变量(如 creditability,取值0/1)和若干特征变量。数据加载阶段若未正确识别缺失值、异常类型或目标变量分布,后续分箱和WOE计算就会产生偏差。因此,环境准备和数据加载不是“走过场”,而是建模质量的第一道防线。

核心原则:环境可复现、数据可追溯、目标变量可解释。三者缺一不可。

二、方法流程:从零搭建可运行环境

推荐使用 Anaconda 或 Miniconda 创建独立虚拟环境,避免污染系统Python。以下命令适用于 Windows、macOS 和 Linux 的终端或 Anaconda Prompt。

# 创建名为 scorecard 的虚拟环境,指定 Python 3.9
conda create -n scorecard python=3.9 -y

# 激活环境
conda activate scorecard

# 安装 scorecardpy 及其核心依赖
pip install scorecardpy pandas numpy scikit-learn matplotlib seaborn

# 验证安装是否成功
python -c "import scorecardpy as sc; print(sc.__version__)"

如果网络较慢,可以使用国内镜像源加速:

pip install scorecardpy -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,建议在Jupyter Notebook或VS Code中运行以下代码,确认核心功能可用:

import scorecardpy as sc
import pandas as pd
import numpy as np

# 加载内置数据集
data = sc.germancredit()
print(data.shape)
print(data.head())

三、内置数据集介绍:germancredit 的结构与含义

scorecardpy 内置了经典的德国信用数据集(German Credit Data),共1000条样本、21列。其中 creditability 是目标变量,1表示“好客户”(按时还款),0表示“坏客户”(违约)。其余20个变量涵盖账户状态、贷款期限、信用历史、贷款用途、储蓄账户、就业年限、年龄、住房等维度。

变量名类型含义典型取值
creditability二分类信用好坏标签0/1
account.balance分类账户状态1-4
duration.of.credit数值贷款期限(月)4-72
credit.history分类信用历史0-4
purpose分类贷款用途0-10
credit.amount数值贷款金额250-18424
savings.account.bonds分类储蓄账户1-5
present.employment.since分类当前就业年限1-5
age.in.years数值年龄19-75
housing分类住房情况1-3

该数据集的特点是:特征以分类变量为主,数值变量较少,且部分分类变量已经用数字编码,但数字大小并不代表顺序关系。这一点在后续分箱和WOE转换时需要特别注意。

四、数据读取与初步探索方法

加载数据后,第一步是查看数据概况,包括形状、类型、缺失值和目标变量分布。以下代码展示了标准的初步探索流程:

# 查看数据基本信息
data.info()

# 查看描述性统计
data.describe()

# 检查缺失值
print(data.isnull().sum())

# 查看目标变量分布
print(data['creditability'].value_counts())
print(data['creditability'].value_counts(normalize=True))

如果目标变量严重不平衡(例如坏样本占比低于5%),后续建模需要考虑采样策略或调整评分卡刻度。对于德国信用数据集,坏样本占比约为30%,属于相对均衡的场景。

接下来,可以使用 scorecardpy 提供的 sc.var_filter 进行初步变量筛选,或直接绘制变量分布图:

# 绘制目标变量分布
import matplotlib.pyplot as plt
data['creditability'].value_counts().plot(kind='bar')
plt.title('Creditability Distribution')
plt.show()

# 查看分类变量与目标变量的关系
for col in ['account.balance', 'credit.history', 'purpose']:
    print(pd.crosstab(data[col], data['creditability'], normalize='index'))

实用技巧:在Jupyter中,使用 %matplotlib inline 确保图形内嵌显示;若使用VS Code,建议安装Jupyter插件并选择对应的虚拟环境内核。

五、常见误区与复盘

  • 误区一:直接使用系统Python安装scorecardpy。系统环境往往已安装多个版本的pandas或numpy,容易导致依赖冲突。务必使用虚拟环境。
  • 误区二:忽略目标变量编码。scorecardpy默认目标变量中“1”代表好客户,“0”代表坏客户。如果原始数据中标签含义相反,需要在建模前翻转,否则WOE方向会完全颠倒。
  • 误区三:把分类变量当数值变量处理。德国信用数据集中很多变量用数字编码,但它们是分类变量。直接放入逻辑回归会导致模型错误地认为“4比1大”,必须通过分箱或WOE转换处理。
  • 误区四:不检查缺失值就进入分箱。scorecardpy的分箱函数对缺失值有专门处理,但若缺失值被错误标记为特殊值(如-999),会影响分箱结果。建议在加载后统一替换为 np.nan。

复盘建议:每次新建项目时,先运行 sc.germancredit() 确认库功能正常,再加载自己的数据。这样可以将“环境问题”和“数据问题”快速分离,减少排查时间。