摘要
本教程将完整实现一个分类项目:
- 数据探索:分析特征分布与缺失值特征工程:处理离散变量与数值标准化模型训练:比较随机森林/XGBoost性能模型解释:SHAP值可视化关键特征部署准备:生成Pipelines与模型持久化
数据集:银行客户流失预测(Kaggle数据集
目录
- 项目背景与数据理解数据清洗的五个关键步骤特征工程的三大武器模型训练与调参实战模型解释与业务应用部署准备与自动化Pipeline
1. 项目背景与数据理解
数据集概览
import pandas as pddf = 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 - Q1df = df[~((df['tenure'] < (Q1 - 1.5*IQR)) | (df['tenure'] > (Q3 + 1.5*IQR)))]
3. 特征工程的三大武器
(1)类别变量编码
from sklearn.preprocessing import OneHotEncoder# 对低基数类别变量做One-Hotencoder = OneHotEncoder(sparse=False, handle_unknown='ignore')encoded_features = encoder.fit_transform(df[['gender', 'Partner']])
(2)数值变量标准化
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaled_features = scaler.fit_transform(df[['tenure', 'MonthlyCharges']])
(3)特征组合
# 创建新特征:平均每月消费df['AvgMonthlySpend'] = df['TotalCharges'] / df['tenure']
4. 模型训练与调参实战
(1)基准模型比较
from sklearn.ensemble import RandomForestClassifierfrom xgboost import XGBClassifierfrom sklearn.model_selection import cross_val_scoremodels = { "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 GridSearchCVparam_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 shapexplainer = 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 Pipelinefrom sklearn.compose import ColumnTransformerpreprocessor = ColumnTransformer( transformers=[ ('num', StandardScaler(), ['tenure', 'MonthlyCharges']), ('cat', OneHotEncoder(), ['gender', 'Partner']) ])pipeline = Pipeline(steps=[ ('preprocessor', preprocessor), ('classifier', XGBClassifier())])# 模型持久化import joblibjoblib.dump(pipeline, 'churn_model.pkl')
下一篇预告
Day 6:深度学习入门——神经网络基本原理
"抛开复杂公式!用Keras搭建你的第一个神经网络!"
关键检查清单
✅ 数据探索:缺失值/异常值/分布分析
✅ 特征工程:编码/缩放/特征创造
✅ 模型选择:多算法对比验证
✅ 模型解释:SHAP/LIME可解释性分析
✅ 部署准备:Pipeline封装与持久化
需要补充模型监控部分的实现吗?或者增加Flask部署的示例代码?