python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings
1. pandas → 数据处理的 "Excel 神器"
- 核心作用:处理表格数据(CSV、Excel 文件),做数据清洗、筛选、统计、合并等,是数据分析的 "主力"。
- 可以把它理解成 Python 版的 Excel,而且功能强 100 倍。
- 常用场景:读文件、看数据、筛选数据、处理缺失值、统计指标。
python
# 1. 读入数据(比如你的信用评分数据集)
df = pd.read_csv("credit_data.csv") # 读csv文件
df = pd.read_excel("credit_data.xlsx") # 读excel文件
# 2. 看数据基本信息
print(df.head()) # 看前5行数据
print(df.info()) # 看列名、数据类型、缺失值
print(df.describe()) # 看数值列的统计(均值、最大/最小等)
# 3. 简单筛选和处理
print(df[df["age"] > 30]) # 筛选年龄大于30的用户
df.fillna(0, inplace=True) # 把缺失值用0填充
2. numpy → 数值计算的 "数学工具包"
- 核心作用:做高效的数值计算,尤其是数组、矩阵运算,很多其他库(pandas、sklearn)都依赖它。
- 可以把它理解成 Python 里的 "计算器 + 数组工具"。
- 常用场景:生成数据、数学运算、数组操作、和 pandas 配合处理数据。
python
import numpy as np
# 1. 生成数组
arr = np.array([1, 2, 3, 4, 5])
print(arr * 2) # 数组每个元素都乘2 → [2 4 6 8 10]
# 2. 常用数学计算
print(np.mean(arr)) # 平均值
print(np.max(arr)) # 最大值
print(np.min(arr)) # 最小值
print(np.log(10)) # 自然对数,评分卡公式里就用到了这个!
3. matplotlib.pyplot → 画图的 "基础画笔"
- 核心作用:Python 最基础的画图库,用来画各种图表(折线图、柱状图、散点图、直方图等),是所有可视化的 "地基"。
- 你可以把它理解成 Python 里的 "画板和画笔"。
- 常用场景:画基础图表、设置图的标题 / 坐标轴、保存图片。
python
import matplotlib.pyplot as plt
# 画一个简单的柱状图
x = ["A", "B", "C", "D"]
y = [10, 20, 15, 25]
plt.bar(x, y) # 画柱状图
plt.title("示例柱状图") # 设置标题
plt.xlabel("类别") # 设置x轴标签
plt.ylabel("数值") # 设置y轴标签
plt.show() # 显示图片
4. seaborn → 美化画图的 "高级画笔"
- 核心作用:基于 matplotlib 的高级可视化库,画出来的图更美观、更专业,而且画统计图表(比如箱线图、热力图、分布直方图)特别方便。
- 可以把它理解成 matplotlib 的 "美颜滤镜 + 高级模板"。
- 常用场景:EDA 里画分布、相关性热力图、箱线图,比 matplotlib 写起来更简单。
python
import seaborn as sns
# 画箱线图(看数据分布和异常值,风控里很常用)
sns.boxplot(x="target", y="age", data=df) # target是好坏用户标签
plt.show()
# 画相关性热力图(看变量之间的相关性)
corr = df.corr()
sns.heatmap(corr, cmap="coolwarm", annot=True)
plt.show()
- 用
pandas读入数据、清洗数据、处理缺失值 - 用
numpy做数值计算、统计指标 - 用
datetime处理数据里的时间字段 - 用
matplotlib和seaborn画各种图表,做可视化分析
什么是特征工程?
把手里的原始数据,加工成模型喜欢的 "好特征",让模型更容易学、学得更好
主要包括:
- 处理文本 / 类别数据(比如 "性别:男 / 女" 转成数字)
- 特征选择(挑出对模型有用的特征,去掉没用的)
- 特征缩放(把数值缩到同一个范围)
- 缺失值处理、异常值处理等
python
# 基础数据处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
from tqdm import tqdm # 进度条,让循环过程更直观
# 【核心特征工程相关】
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler
# 模型(后面建模用,和特征工程暂时无关)
import xgboost as xgb
import lightgbm as lgb
from catboost import CatBoostRegressor
# 模型评估与交叉验证
from sklearn.model_selection import StratifiedKFold, KFold
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score, log_loss
MinMaxScaler:把数值缩到 0~1 之间
很多数值特征的范围不一样,比如:
- 年龄:18~60
- 收入:3000~50000
模型训练时,数值大的特征会 "抢权重",比如收入的数值大,模型就会更关注收入,忽略年龄。MinMaxScaler 会把所有特征缩到 0~1 之间,消除数值范围的影响,让模型公平对待每个特征。
公式:
X_scaled = (X - X.min()) / (X.max() - X.min())
python
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data = pd.DataFrame({
"age": [20, 30, 40, 50],
"income": [3000, 8000, 15000, 30000]
})
scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
print(data_scaled)
# 输出结果:
# [[0. 0. ]
# [0.33333333 0.17241379]
# [0.66666667 0.4137931 ]
# [1. 1. ]]
3. SelectKBest + chi2:帮你挑出 "最有用" 的特征
有很多特征(比如几十上百个),里面有些特征对模型没什么用,甚至会干扰模型。SelectKBest 会根据指定的评分方法,帮你选出对目标变量(比如 "是否违约")最有用的前 K 个特征。chi2 是它的一种评分方法(卡方检验),专门用来衡量类别特征和类别目标变量之间的相关性,相关性越高,特征越有用。
python
from sklearn.feature_selection import SelectKBest, chi2
import pandas as pd
# 示例数据:特征 + 目标变量(0=不违约,1=违约)
X = pd.DataFrame({
"gender": [0,1,0,1,0,1],
"age": [20,30,40,50,25,35],
"useless_feature": [1,1,1,1,1,1] # 完全没用的特征
})
y = [0,0,1,1,0,1]
# 选前2个最好的特征
selector = SelectKBest(score_func=chi2, k=2)
X_new = selector.fit_transform(X, y)
# 查看哪些特征被选中了
print(selector.get_support()) # 输出:[ True True False ]
print(X.columns[selector.get_support()]) # 输出:Index(['gender', 'age'], dtype='object')
模型评估方法:
假设有一份1000 条用户数据(其中好用户 800 条,坏用户 200 条,比例 4:1),要训练一个信用评分模型,需要划分训练集和测试集。
① 留出法(Holdout)
核心思想:一刀切开,一分为二
- 训练集(用来教模型)
- 测试集(用来检验模型效果)
举个例子
我们按 8:2 划分:
- 训练集:800 条(其中好用户 640 条,坏用户 160 条,保持 4:1 的比例,这就是分层采样)
- 测试集:200 条(其中好用户 160 条,坏用户 40 条)
步骤拆解
- 按好 / 坏用户的比例,分层抽样,保证训练集和测试集的分布和原数据一致
- 用训练集训练模型
- 用测试集看模型效果(比如准确率、AUC)
优缺点
✅ 优点:简单粗暴,一次划分就能搞定,速度快❌ 缺点:只分一次,结果受划分影响大(比如刚好测试集里坏用户特别少,结果就不准)
② 交叉验证法(K 折交叉验证)
核心思想:反复切分,取平均
把数据分成 K 份,轮流拿其中 1 份当测试集,剩下的当训练集,重复 K 次,最后取平均结果。最常用的是 10 折交叉验证。
举个例子(10 折交叉验证)
还是那 1000 条数据,按好 / 坏用户分层,分成 10 份,每份 100 条(其中好用户 80 条,坏用户 20 条):
- 第 1 次:用第 1 份当测试集,剩下 9 份训练 → 得到第 1 个结果
- 第 2 次:用第 2 份当测试集,剩下 9 份训练 → 得到第 2 个结果
- ...
- 第 10 次:用第 10 份当测试集,剩下 9 份训练 → 得到第 10 个结果
- 最终:把 10 次的结果取平均值,就是模型的最终效果
留一法(K=1 的特殊情况)
如果数据特别少,比如只有 10 条数据:
- 每次拿 1 条当测试集,剩下 9 条训练,重复 10 次
- 特点:划分最公平,但数据量大的时候速度极慢,几乎不用
优缺点
✅ 优点:结果稳定,不容易被一次划分带偏,能更客观地评估模型❌ 缺点:要训练 K 次,速度比留出法慢很多
③ 自助法(Bootstrap)
核心思想:有放回抽样,数据少的时候用
从数据里有放回地抽样本,组成训练集,没被抽到的当测试集。
还是 1000 条数据:
- 有放回地抽 1000 次,每次抽 1 条,组成一个新的训练集
- 因为是有放回,有的样本会被抽中多次,有的一次都没被抽到
- 理论上,大约有 36.8% 的样本没被抽到(这就是测试集)
- 用抽到的样本训练模型
- 用没被抽到的样本测试模型
优缺点
✅ 优点:数据量特别少的时候也能用,不用硬切分❌ 缺点:训练集里有重复样本,会引入偏差,数据量充足时不推荐用
| 场景 | 推荐方法 |
|---|---|
| 数据量很大(比如上万条) | 留出法(8:2/7:3),速度快 |
| 数据量中等,想结果更稳定 | K 折交叉验证(常用 10 折) |
| 数据量特别少(比如几百条) | 自助法 或 留一法 |