返回学习地图
llmPhase B · 第 10

2.3 Scikit-learn

分类/回归/GBDT/SHAP:经典机器学习全流程,从数据到洞察的完整工具链

6 个章节·按类别展开/折叠
知识

Scikit-learn是什么?——经典机器学习的瑞士军刀

如果说深度学习(PyTorch/TensorFlow)是造船的木料,那Scikit-learn(简称sklearn)就是工具箱里最趁手的锤子和螺丝刀。它不搞花哨的深度学习,专注于经典机器学习——决策树、随机森林、支持向量机、梯度提升树等等。

可以这样理解:

深度学习 = 造火箭。需要大量数据、算力,适合图像识别、自然语言处理等复杂任务。

Scikit-learn = 开车。简单高效,适合结构化数据(如表格数据、Excel数据)上的分类、回归、聚类任务。

很多实际业务场景中,数据是结构化的Excel表格,行是样本,列是特征。这种场景下,sklearn的模型往往不比深度学习差,而且训练快、可解释性强。

sklearn的核心哲学:统一的API设计

所有模型都有相同的接口,学会一个就能用所有:

model.fit(X_train, y_train)          # 训练模型
y_pred = model.predict(X_test)       # 预测
score = model.score(X_test, y_test)  # 评估(分类=准确率,回归=R²)

不管底下的模型是决策树、随机森林还是SVM,这三行代码完全一样。这就是sklearn最漂亮的设计。

sklearn适合什么场景?

  • 表格数据(Excel/CSV格式)上的分类和回归预测
  • 客户流失预测、信用卡欺诈检测、房价预测、疾病诊断
  • 特征重要性分析——了解哪些因素对结果影响最大
  • Kaggle竞赛中的经典ML赛道(XGBoost常胜)
代码

机器学习全流程代码实战

知识

GBDT:Kaggle竞赛的王者算法

在深度学习流行之前(甚至现在),GBDT(梯度提升决策树)是结构化数据上表现最好的算法。Kaggle竞赛中,XGBoost(GBDT的一种实现)赢得最多的比赛。

GBDT的核心思想:一步一个小目标

想象你在预测房价。你的策略是:

第1步:猜一个数字600(所有房价的平均值)。→ 误差有些大

第2步:另一个人分析为什么错了,并预测"还需要加50"。修正 → 650

第3步:再来一个人看为什么还差一点,说"再减10"。修正 → 640

...重复很多次,每次都修正前一个人犯的错。

这就是GBDT!每棵决策树都试图修正前面所有树的错误。第一棵树输出初始预测,后续每棵树输出"错误修正量"。最终预测 = 所有树的输出相加。

GBDT有三个主流实现,各有特点:

XGBoost:最早广受欢迎的GBDT库,Kaggle竞赛常胜工具。平衡了速度和准确率。

LightGBM(微软):更快,能处理超大规模数据。使用基于直方图的算法。

CatBoost(Yandex):自动处理类别特征,不需要手动编码。对类别数据多时特别方便。

GBDT vs 深度学习什么时候用哪个?

用GBDT:数据是表格形式(结构化的Excel/CSV),特征数量<1000,样本量<100万。

用深度学习:数据是图像、文本、音频等非结构化数据。或特征极多、样本极多时。

知识

SHAP:用博弈论解释模型为什么这样预测

一个模型告诉你"这个客户会流失",但为什么?哪个因素促使模型做了这个判断?这在金融、医疗等场景非常重要。SHAP就是回答"为什么"的工具。

SHAP的全称是SHapley Additive exPlanations,它的理论基础来自博弈论中的Shapley值

Shapley值是什么?

想象三个人一起工作赚了1000元。如何公平分配这1000元?不能平均分——可能有人贡献大有人贡献小。Shapley值计算每个人的"边际贡献":每加入一个新成员,团队的收益增加了多少,按所有可能的加入顺序取平均。

把模型预测类比为团队合作:

团队成员 = 各个特征(年龄、收入、职业...)

团队产出 = 模型预测值

每个人的Shapley值 = 该特征对预测的贡献

SHAP的核心公式:

预测值 = 基准值 + Σ(每个特征的SHAP值)

基准值 = 所有样本的平均预测(比如平均房价=50万)

每个特征的SHAP值 = 该特征如何使预测偏离平均值

举个例子:预测某人的收入是8万。

基准值(平均收入)= 5万

"教育=硕士"的SHAP值 = +2万(教育高使预测增加2万)

"年龄=25"的SHAP值 = -1万(太年轻使预测降低1万)

"城市=北京"的SHAP值 = +2万(在一线城市使预测增加2万)

总预测 = 5万 + 2万 - 1万 + 2万 = 8万 ✓

每个贡献值直接可解释:为什么这个人是8万?因为学历高+在北京但比较年轻。

实例

实操案例:用随机森林+SHAP预测客户流失

实例

场景:电信公司要预测哪些客户会取消订阅。我们要用sklearn建模+SHAP解释。

# 假设我们有客户数据:tenure(月数), MonthlyCharges(月费),
# Contract(合同类型), TotalCharges(累计花费) 等

import pandas as pd
import shap
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

# 数据准备
df = pd.read_csv('customer_churn.csv')
le = LabelEncoder()
df['Contract'] = le.fit_transform(df['Contract'])
df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce')
df['TotalCharges'] = df['TotalCharges'].fillna(0)

# 特征和标签
features = ['tenure', 'MonthlyCharges', 'TotalCharges', 'Contract']
X = df[features]
y = df['Churn']

# 划分
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42)

# 训练
model = RandomForestClassifier(n_estimators=100, max_depth=6, random_state=42)
model.fit(X_train, y_train)

# SHAP解释
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)

# 分析特征重要性(SHAP版)
shap.summary_plot(shap_values[1], X_test, feature_names=features)
# 图中能看到:tenure(使用月数)最重要,使用越久越不易流失

# 分析单个客户
sample = X_test.iloc[0]  # 第一个客户
sample_shap = explainer.shap_values(sample)
shap.waterfall_plot(shap.Explanation(
    values=sample_shap[1],
    base_values=explainer.expected_value[1],
    data=sample.values,
    feature_names=features
))
# waterfall图显示每个特征如何推高或拉低该客户的流失概率

关键SHAP图解读:

每个点是一个样本。红色=特征值高,蓝色=特征值低。横轴=SHAP值(对预测的影响)。

如果red在右边:特征值越高越容易流失

如果blue在右边:特征值越低越容易流失

这直观地揭示了特征和结果的关系。

练习

练习题

练习

Q1:sklearn中fit、predict、score方法分别做什么?

Q2:train_test_split中的test_size=0.3、random_state=42各是什么意思?

Q3:为什么GBDT要"梯度提升"?和普通决策树有什么不同?

Q4:SHAP值的含义是什么?如果"tenure"的SHAP值是+0.3,什么意思?

Q5:为什么对测试集只能用transform而不能用fit_transform?

查看答案

A1:fit=训练模型(从数据中学习规律)。predict=预测(对新数据做判断)。score=评估分数(分类=准确率,回归=R²)。

A2:test_size=0.3表示30%的数据用作测试集。random_state=42是随机种子,保证每次划分结果相同。

A3:普通决策树一次建完整棵树。GBDT每次只建一棵小树来修正之前所有树的错误(用梯度下降的思想),最终是多棵决策树的加权和。这种"逐步修正"让GBDT比单棵决策树准确得多。

A4:+0.3表示这个特征让模型的预测值比平均预测高了0.3。如果预测的是"流失概率",tenure的SHAP值+0.3意味着tenure让流失概率增加了0.3(即该特征推动预测向"会流失"方向走)。

A5:fit_transform既计算参数(均值、标准差)又做变换。如果在测试集上也fit_transform,测试集会被"看到"并影响标准化参数,导致信息泄漏——训练时的标准化参数应该只用训练集的数据计算,测试时直接套用。