摘要
本教程将完整实现一个分类项目:
- 数据探索:分析特征分布与缺失值
- 特征工程:处理离散变量与数值标准化
- 模型训练:比较随机森林/XGBoost性能
- 模型解释:SHAP值可视化关键特征
- 部署准备:生成Pipelines与模型持久化
数据集:银行客户流失预测(Kaggle数据集
目录
- 项目背景与数据理解
- 数据清洗的五个关键步骤
- 特征工程的三大武器
- 模型训练与调参实战
- 模型解释与业务应用
- 部署准备与自动化Pipeline
1. 项目背景与数据理解
数据集概览
import pandas as pd
df = pd.read_csv('telco_churn.csv')
print(df.shape) # (7043, 21)
print(df.columns.tolist()[:5]) # ['customerID', 'gender', 'SeniorCitizen', 'Partner', 'Dependents']
关键字段说明:
| 字段名 | 类型 | 说明 |
|---|---|---|
| tenure | 数值 | 客户在网月数 |
| Contract | 类别 | 合约类型(Month-to-month等) |
| TotalCharges | 数值 | 总消费金额 |
| Churn | 布尔 | 是否流失(目标变量) |
2. 数据清洗的五个关键步骤
(1)处理缺失值
# 检查缺失值
print(df.isnull().sum())
# 填充数值型缺失值
df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan).astype(float)
df['TotalCharges'].fillna(df['TotalCharges'].median(), inplace=True)
(2)处理异常值
# 检测数值字段异常值
sns.boxplot(x=df['tenure'])
plt.show()
# 使用IQR方法处理
Q1 = df['tenure'].quantile(0.25)
Q3 = df['tenure'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['tenure'] < (Q1 - 1.5*IQR)) | (df['tenure'] > (Q3 + 1.5*IQR)))]
3. 特征工程的三大武器
(1)类别变量编码
from sklearn.preprocessing import OneHotEncoder
# 对低基数类别变量做One-Hot
encoder = OneHotEncoder(sparse=False, handle_unknown='ignore')
encoded_features = encoder.fit_transform(df[['gender', 'Partner']])
(2)数值变量标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df[['tenure', 'MonthlyCharges']])
(3)特征组合
# 创建新特征:平均每月消费
df['AvgMonthlySpend'] = df['TotalCharges'] / df['tenure']
4. 模型训练与调参实战
(1)基准模型比较
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
models = {
"RandomForest": RandomForestClassifier(),
"XGBoost": XGBClassifier()
}
for name, model in models.items():
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='f1')
print(f"{name}平均F1分数:{scores.mean():.3f}")
(2)网格搜索调参
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [100, 200],
'max_depth': [3, 5, None]
}
grid = GridSearchCV(RandomForestClassifier(), param_grid, cv=3)
grid.fit(X_train, y_train)
print("最佳参数:", grid.best_params_)
5. 模型解释与业务应用
SHAP值可视化
import shap
explainer = shap.TreeExplainer(grid.best_estimator_)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
业务洞察:
- 高月费客户更容易流失
- 签订长期合约的客户更稳定
6. 部署准备与自动化Pipeline
创建完整Pipeline
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), ['tenure', 'MonthlyCharges']),
('cat', OneHotEncoder(), ['gender', 'Partner'])
])
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', XGBClassifier())
])
# 模型持久化
import joblib
joblib.dump(pipeline, 'churn_model.pkl')
下一篇预告
Day 6:深度学习入门——神经网络基本原理
"抛开复杂公式!用Keras搭建你的第一个神经网络!"
关键检查清单
✅ 数据探索:缺失值/异常值/分布分析
✅ 特征工程:编码/缩放/特征创造
✅ 模型选择:多算法对比验证
✅ 模型解释:SHAP/LIME可解释性分析
✅ 部署准备:Pipeline封装与持久化
需要补充模型监控部分的实现吗?或者增加Flask部署的示例代码?