scikit-learn 入门指南
scikit-learn 是 Python 传统机器学习的”标准库”——从数据预处理到模型评估,一条统一的 API 贯穿百种算法。本页带你从安装到上手完整建模流程。前置阅读:NumPy 科学计算入门、数据预处理。
这个库是什么
Section titled “这个库是什么”scikit-learn(简称 sklearn)是一个开源 Python 机器学习库,覆盖分类、回归、聚类、降维、模型选择、数据预处理等几乎所有传统机器学习任务。它构建在 NumPy(数值计算)、SciPy(科学计算)和 joblib(并行)之上,2007 年由法国 INRIA 团队发起,如今是数据科学领域使用最广的 ML 库。
它的核心魅力在于一致的 API 设计:无论你用逻辑回归、随机森林还是 SVM,调用方式永远是 fit() 训练、predict() 预测、transform() 转换。学会一种算法,迁移到其他算法几乎零成本——这就像一套通用的”驾驶舱”,换了车型也不必重新学操作。
2025-2026 最新进展(v1.9)
Section titled “2025-2026 最新进展(v1.9)”scikit-learn 在 2026 年 6 月发布了 1.9.0 版本,带来了一系列重要更新:
- Narwhals 依赖:引入了 Narwhals 库——一个轻量级的 DataFrame 抽象层,让 sklearn 能原生支持 pandas、polars 等多种 DataFrame 格式。以前用 polars DataFrame 需要
set_output(transform="polars")配置,现在由 Narwhals 统一处理,更稳定可靠。 - Callback API(重大新特性):引入全新的回调函数机制,让你在训练过程中插入自定义逻辑。内置了
ProgressBar(进度条显示训练进度)和ScoringMonitor(每轮迭代后计算并打印评分指标)。目前支持 LogisticRegression、GridSearchCV、Pipeline、StandardScaler 等常用估计器。 - 稀疏数组接口:新增
sparse_interface配置项,支持从 SciPy 稀疏矩阵(sparse matrix)迁移到稀疏数组(sparse array)——这是 SciPy 生态正在进行的现代化迁移的一部分。 - Array API 扩展:更多估计器支持 Array API 标准输入,这意味着 sklearn 正在逐步支持 GPU 数组(如 CuPy)、JAX 数组等——虽然目前仍是实验性功能,但方向令人兴奋。
- HTML 可视化增强:估计器的 HTML 表示现在会显示已拟合属性(以
_结尾的属性)和输出特征名,在 Jupyter 中查看模型结构更直观。 - 决策树缺失值支持:
DecisionTreeRegressor的criterion="absolute_error"等所有准则现在都支持缺失值处理,无需预先填充。 - SVC probability 参数弃用:由于线程安全问题,
SVC和NuSVC的probability参数已弃用,推荐用CalibratedClassifierCV替代。
安装与环境配置
Section titled “安装与环境配置”# 方式一:pip 安装(推荐)pip install scikit-learn
# 方式二:随数据科学全家桶安装pip install numpy scipy pandas matplotlib scikit-learn
# 方式三:conda 安装(适合 Anaconda/Miniconda 用户)conda install -c conda-forge scikit-learn
# 验证安装python -c "import sklearn; print(sklearn.__version__)"版本要求:scikit-learn 1.9 要求 Python 3.11+、NumPy 1.24.1+、SciPy 1.10.0+,以及新增的 Narwhals 2.0.1+ 依赖。
scikit-learn 无需 GPU、无需编译,Windows / macOS / Linux 开箱即用。导入约定写为 import sklearn,但实际使用时一般直接导入具体模块,例如 from sklearn.linear_model import LogisticRegression。模型持久化推荐用 joblib(sklearn 的官方推荐方式)。
统一 API:estimator 接口
Section titled “统一 API:estimator 接口”scikit-learn 里所有模型都实现同一套接口,称为 estimator(估计器)。把它想象成一台”通用的学习机器”:你把数据喂进去(fit),它学会规律;你把新数据喂进去(predict),它给出预测。无论是分类器、回归器还是聚类器,操作面板完全一致。
fit(X, y):从训练数据中学习模型参数。这是”学习”的发生点。predict(X):用学到的模型对新数据做预测。transform(X):数据预处理器的转换接口(如标准化、降维)。fit_transform(X):先拟合再转换的快捷方式(等价于先fit再transform,但可能更高效)。score(X, y):返回模型在给定数据上的评估分数(分类为准确率,回归为 )。
Pipeline:把流程串成管道
Section titled “Pipeline:把流程串成管道”真实建模往往包含多步:缺失值填充 → 标准化 → 特征选择 → 模型训练。如果分开写,代码零散且容易在训练/测试集间造成数据泄露(data leakage,即测试集的信息泄漏到训练过程中,导致评估结果过于乐观)。Pipeline 把这些步骤串成一条流水线,像工厂的传送带——原料进去,成品出来,中间环节自动衔接,且交叉验证时各步骤只在训练折上拟合,杜绝泄露。
数据集划分与交叉验证
Section titled “数据集划分与交叉验证”评估模型绝不能用训练数据——那等于让学生考试做平时做过的题。标准做法是把数据分成训练集和测试集;更严谨则用交叉验证(k-fold cross-validation,把数据分成 k 份,轮流用 k-1 份训练、1 份验证,重复 k 次取平均)来减少单次划分的偶然性。sklearn 的 train_test_split 和 cross_val_score 一行搞定。
Callback:训练过程监控(v1.9 新增)
Section titled “Callback:训练过程监控(v1.9 新增)”scikit-learn 1.9 引入了全新的 Callback API,让你可以在估计器拟合过程中插入自定义行为——比如实时显示进度条、每轮迭代后计算评分指标等。这填补了 sklearn 长期以来缺乏训练过程可视化能力的空白。
架构与工作流
Section titled “架构与工作流”例 1:加载数据与训练第一个分类器
Section titled “例 1:加载数据与训练第一个分类器”from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score
# 加载内置鸢尾花数据集(150 个样本,4 个特征,3 类)# 鸢尾花是机器学习的 "Hello World" 数据集X, y = load_iris(return_X_y=True)
# 划分训练集与测试集(80% 训练,20% 测试)# random_state 确保每次划分结果相同,方便复现X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 三行代码完成训练与评估——这就是统一 API 的魅力clf = RandomForestClassifier(random_state=42) # 创建模型(随机森林:多棵决策树投票)clf.fit(X_train, y_train) # 训练:模型从训练集学习pred = clf.predict(X_test) # 预测:对测试集做预测print(f"准确率: {accuracy_score(y_test, pred):.3f}") # 1.000例 2:用 Pipeline 串联预处理与模型
Section titled “例 2:用 Pipeline 串联预处理与模型”from sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.impute import SimpleImputerfrom sklearn.linear_model import LogisticRegression
# 把"缺失值填充 → 标准化 → 逻辑回归"串成一条流水线# fit 时只在训练数据上拟合,杜绝数据泄露pipe = Pipeline([ ("imputer", SimpleImputer(strategy="mean")), # 缺失值用均值填充 ("scaler", StandardScaler()), # 标准化到零均值单位方差 ("clf", LogisticRegression(max_iter=200)), # 逻辑回归分类器])
pipe.fit(X_train, y_train) # 一次性训练整条管道print(f"流水线准确率: {pipe.score(X_test, y_test):.3f}")# 对新数据直接 predict,预处理会自动复用训练时的参数
# v1.9 新增:Pipeline 现在也支持 Callbackfrom sklearn.callback import ProgressBarpipe_with_cb = Pipeline([ ("scaler", StandardScaler()), ("clf", LogisticRegression(max_iter=200, callback=ProgressBar())),])例 3:交叉验证与模型选择
Section titled “例 3:交叉验证与模型选择”from sklearn.model_selection import cross_val_score, GridSearchCVfrom sklearn.svm import SVC
# 5 折交叉验证:数据分成 5 份,轮流用 4 份训练、1 份验证model = SVC(random_state=42)scores = cross_val_score(model, X_train, y_train, cv=5) # 返回 5 个折的得分print(f"各折得分: {scores}")print(f"平均准确率: {scores.mean():.3f} ± {scores.std():.3f}")
# 网格搜索:自动尝试所有超参数组合,选出最优# 超参数是模型外部可调的配置(如正则化强度 C、核函数 kernel),# 不是模型从数据中学到的参数grid = GridSearchCV( SVC(), {"C": [0.1, 1, 10], "kernel": ["linear", "rbf"]}, # 参数搜索空间 cv=5, verbose=1, # v1.9 配合 Callback 可显示进度条)grid.fit(X_train, y_train)print(f"最优参数: {grid.best_params_}, 验证准确率: {grid.best_score_:.3f}")例 4:无监督学习——聚类与降维
Section titled “例 4:无监督学习——聚类与降维”from sklearn.cluster import KMeansfrom sklearn.decomposition import PCA
# PCA 降维:把 4 维特征压缩到 2 维,方便可视化# PCA(主成分分析)找到数据方差最大的方向,投影到低维空间pca = PCA(n_components=2)X_2d = pca.fit_transform(X)print(f"降维后形状: {X_2d.shape}, 保留方差比: {pca.explained_variance_ratio_.sum():.3f}")
# K-Means 聚类:在无标签情况下把样本分成 3 簇# K-Means 反复执行两步:1) 将每个样本分配到最近的中心 2) 更新中心位置kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)labels = kmeans.fit_predict(X)print(f"聚类中心形状: {kmeans.cluster_centers_.shape}")print(f"各簇样本数: {[sum(labels == i) for i in range(3)]}")例 5:完整建模流程——从数据到评估
Section titled “例 5:完整建模流程——从数据到评估”下面演示一个更贴近实际的完整建模流程,包含分类报告和混淆矩阵:
from sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn.metrics import classification_report, confusion_matriximport numpy as np
# 加载乳腺癌数据集(二分类:恶性 / 良性)X, y = load_breast_cancer(return_X_y=True)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建流水线:标准化 + 梯度提升树# 梯度提升树(Gradient Boosting):逐步训练多棵决策树,# 每棵新树纠正前面树的错误,是表格数据的强力模型pipe = Pipeline([ ("scaler", StandardScaler()), ("clf", GradientBoostingClassifier(random_state=42)),])pipe.fit(X_train, y_train)y_pred = pipe.predict(X_test)
# 分类报告:精确率、召回率、F1 值# 精确率(Precision):预测为正的样本中,真正为正的比例# 召回率(Recall):真正为正的样本中,被正确预测的比例# F1 值:精确率和召回率的调和平均print(classification_report(y_test, y_pred, target_names=["恶性", "良性"]))
# 混淆矩阵:直观展示各类别的预测情况print("混淆矩阵:")print(confusion_matrix(y_test, y_pred))常用 API 速查
Section titled “常用 API 速查”| API | 用途 | 示例 |
|---|---|---|
train_test_split(X, y) | 划分训练集与测试集 | train_test_split(X, y, test_size=0.2) |
Pipeline(steps) | 串联预处理与模型 | Pipeline([("scaler", ...), ("clf", ...)]) |
StandardScaler() | 标准化(零均值单位方差) | scaler.fit_transform(X) |
SimpleImputer() | 缺失值填充 | SimpleImputer(strategy="mean") |
OneHotEncoder() | 类别特征独热编码 | OneHotEncoder(handle_unknown="ignore") |
cross_val_score(model, X, y) | k 折交叉验证 | cross_val_score(clf, X, y, cv=5) |
GridSearchCV(model, params) | 网格搜索超参数 | GridSearchCV(clf, {"C":[1,10]}, cv=5) |
RandomizedSearchCV(model, params) | 随机搜索超参数 | RandomizedSearchCV(clf, dist, n_iter=50) |
accuracy_score(y_true, y_pred) | 分类准确率 | accuracy_score(y_test, pred) |
classification_report(...) | 分类完整报告 | classification_report(y_test, pred) |
confusion_matrix(...) | 混淆矩阵 | confusion_matrix(y_test, pred) |
mean_squared_error(...) | 回归均方误差 | mean_squared_error(y_test, pred) |
callback.ProgressBar() | 进度条回调(v1.9) | LogisticRegression(callback=ProgressBar()) |
callback.ScoringMonitor() | 评分监控回调(v1.9) | ScoringMonitor(scoring="accuracy") |
joblib.dump(model, path) | 保存模型 | joblib.dump(clf, "model.joblib") |
各算法模块导入路径速记:
| 类型 | 模块 | 代表算法 |
|---|---|---|
| 分类 / 回归 | sklearn.linear_model | 逻辑回归、岭回归、Lasso |
| 分类 / 回归 | sklearn.ensemble | 随机森林、梯度提升树 |
| 分类 / 回归 | sklearn.svm | SVC、SVR |
| 分类 / 回归 | sklearn.neighbors | KNN(K 近邻) |
| 聚类 | sklearn.cluster | KMeans、DBSCAN |
| 降维 | sklearn.decomposition | PCA、NMF |
| 朴素贝叶斯 | sklearn.naive_bayes | 高斯 NB、多项式 NB |
| 神经网络 | sklearn.neural_network | MLPClassifier、MLPRegressor |
- 防止数据泄露:所有预处理(标准化、填充、编码)必须在训练集上
fit,再transform测试集——切勿在整个数据集上fit。用Pipeline是最稳妥的做法,交叉验证会自动只在训练折拟合。 - 标准化与算法的关系:SVM、KNN、逻辑回归、神经网络等基于距离或梯度的算法对量纲敏感(特征尺度差异大会导致大尺度特征主导模型),必须先标准化;树模型(随机森林、梯度提升)则不需要,因为树的分裂与特征尺度无关。
- 类别不平衡:当正负样本比例悬殊时,准确率会失真(95% 是负样本,全猜负也能 95% 准确率)。改用
class_weight="balanced"、过采样(SMOTE,合成少数类样本)或换 F1 / AUC 指标。详见类别不平衡问题。 - 模型选择优先简单:先跑通基线(逻辑回归 / 随机森林),再尝试复杂模型。盲目上深度学习往往是浪费——结构化数据上梯度提升树至今仍是王者。详见集成学习。
- 超参数调优:搜索空间小用
GridSearchCV(穷举),空间大用RandomizedSearchCV(随机采样,效率更高)。务必只交叉验证训练集,测试集留到最后做一次最终评估。 - 持久化用 joblib:
joblib.dump比pickle更高效,且能正确处理 sklearn 模型中的大型 NumPy 数组。注意保存与加载的 sklearn 版本要一致,否则可能报错。 - Polars 用户福音:v1.9 通过 Narwhals 原生支持 polars DataFrame 输入输出,无需先转成 pandas。
set_output(transform="polars")让 Pipeline 输出 polars DataFrame,与你的 polars 数据管道无缝衔接。
典型应用场景
Section titled “典型应用场景”- 结构化数据的分类与回归:金融风控、销售预测、用户分群等表格数据任务,梯度提升树与随机森林是首选。详见监督学习概览。
- 数据预处理流水线:特征工程的标准化、编码、缺失值处理,sklearn 提供了完整的预处理组件。详见数据预处理。
- 模型评估与选择:交叉验证、混淆矩阵、学习曲线,所有评估工具一应俱全。详见模型评估与交叉验证。
- 降维与可视化:PCA 把高维特征压缩到 2-3 维,方便可视化与加速后续模型。详见降维方法。
- 无监督聚类发现群体:用户画像分群、异常检测,KMeans 与 DBSCAN 开箱即用。详见聚类分析。
与同类工具对比
Section titled “与同类工具对比”| 特性 | scikit-learn | XGBoost / LightGBM | PyTorch / TensorFlow | Spark MLlib |
|---|---|---|---|---|
| 定位 | 传统机器学习全家桶 | 高性能梯度提升树 | 深度学习框架 | 分布式机器学习 |
| API 一致性 | 极强(统一 estimator 接口) | 兼容 sklearn 接口 | 训练循环需手写 | 类似 sklearn |
| 算法覆盖 | 极广(百种算法) | 专精树模型 | 专注神经网络 | 分布式算法 |
| 深度学习 | 仅 MLP | 不支持 | 原生支持 | 不支持 |
| GPU 加速 | 不支持(CPU 为主) | 支持 | 原生支持 | 支持 |
| DataFrame 支持 | pandas / polars(v1.9 Narwhals) | pandas | 需转换 | Spark DataFrame |
| 适用规模 | 中小规模(单机) | 中大规模 | 任意规模 | 超大规模集群 |
| 最佳场景 | 快速建模 / 基线 / 预处理 | 表格数据竞赛冠军 | 图像 / 文本 / 序列 | 工业级大数据 |
关键洞察:sklearn 适合快速建模与建立基线,XGBoost/LightGBM 是表格数据竞赛冠军,深度学习则交给 PyTorch/TensorFlow。三者互补,实际项目常组合使用——用 sklearn 预处理,用 XGBoost 建模。
- scikit-learn 官方文档:scikit-learn.org — 业内公认的”教科书级”文档,每个算法都配有选择指南、示例代码和数学原理,是学习机器学习的最佳入口。
- scikit-learn 1.9 Release Highlights:scikit-learn.org/stable/whats_new/v1.9.html — 查看 Callback API、Narwhals 集成、稀疏数组支持等新特性的官方说明。
- Aurélien Géron,「Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow」:机器学习实战圣经,前半部分用 sklearn 从头讲完整个建模流程,配有完整项目代码。
- Andreas Müller & Sarah Guido,「Introduction to Machine Learning with Python」:sklearn 核心贡献者编写,从零基础到掌握 sklearn 全部常用功能,语言平易近人。
- sklearn 官方示例库:scikit-learn.org/stable/auto_examples — 数百个可运行示例,覆盖从基础分类到流形学习的各种任务,是最好的仿写素材。