Day 5:实战!用Scikit-learn完成你的第一个分类模型

172 阅读3分钟

摘要

本教程将完整实现一个分类项目:

  1. 数据探索:分析特征分布与缺失值
  2. 特征工程:处理离散变量与数值标准化
  3. 模型训练:比较随机森林/XGBoost性能
  4. 模型解释:SHAP值可视化关键特征
  5. 部署准备:生成Pipelines与模型持久化
    数据集:银行客户流失预测(Kaggle数据集

目录

  1. 项目背景与数据理解
  2. 数据清洗的五个关键步骤
  3. 特征工程的三大武器
  4. 模型训练与调参实战
  5. 模型解释与业务应用
  6. 部署准备与自动化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部署的示例代码?