Skip to content

scikit-learn 入门指南

scikit-learn 是 Python 传统机器学习的”标准库”——从数据预处理到模型评估,一条统一的 API 贯穿百种算法。本页带你从安装到上手完整建模流程。前置阅读:NumPy 科学计算入门、数据预处理。

scikit-learn(简称 sklearn)是一个开源 Python 机器学习库,覆盖分类、回归、聚类、降维、模型选择、数据预处理等几乎所有传统机器学习任务。它构建在 NumPy(数值计算)、SciPy(科学计算)和 joblib(并行)之上,2007 年由法国 INRIA 团队发起,如今是数据科学领域使用最广的 ML 库。

它的核心魅力在于一致的 API 设计:无论你用逻辑回归、随机森林还是 SVM,调用方式永远是 fit() 训练、predict() 预测、transform() 转换。学会一种算法,迁移到其他算法几乎零成本——这就像一套通用的”驾驶舱”,换了车型也不必重新学操作。

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 替代。
Terminal window
# 方式一: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 的官方推荐方式)。

scikit-learn 里所有模型都实现同一套接口,称为 estimator(估计器)。把它想象成一台”通用的学习机器”:你把数据喂进去(fit),它学会规律;你把新数据喂进去(predict),它给出预测。无论是分类器、回归器还是聚类器,操作面板完全一致。

  • fit(X, y):从训练数据中学习模型参数。这是”学习”的发生点。
  • predict(X):用学到的模型对新数据做预测。
  • transform(X):数据预处理器的转换接口(如标准化、降维)。
  • fit_transform(X):先拟合再转换的快捷方式(等价于先 fit 再 transform,但可能更高效)。
  • score(X, y):返回模型在给定数据上的评估分数(分类为准确率,回归为 R2R^2)。

真实建模往往包含多步:缺失值填充 → 标准化 → 特征选择 → 模型训练。如果分开写,代码零散且容易在训练/测试集间造成数据泄露(data leakage,即测试集的信息泄漏到训练过程中,导致评估结果过于乐观)。Pipeline 把这些步骤串成一条流水线,像工厂的传送带——原料进去,成品出来,中间环节自动衔接,且交叉验证时各步骤只在训练折上拟合,杜绝泄露。

评估模型绝不能用训练数据——那等于让学生考试做平时做过的题。标准做法是把数据分成训练集和测试集;更严谨则用交叉验证(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 长期以来缺乏训练过程可视化能力的空白。

例 1:加载数据与训练第一个分类器

Section titled “例 1:加载数据与训练第一个分类器”
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from 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 Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from 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 现在也支持 Callback
from sklearn.callback import ProgressBar
pipe_with_cb = Pipeline([
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=200, callback=ProgressBar())),
])
from sklearn.model_selection import cross_val_score, GridSearchCV
from 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 KMeans
from 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_cancer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report, confusion_matrix
import 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用途示例
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.svmSVC、SVR
分类 / 回归sklearn.neighborsKNN(K 近邻)
聚类sklearn.clusterKMeans、DBSCAN
降维sklearn.decompositionPCA、NMF
朴素贝叶斯sklearn.naive_bayes高斯 NB、多项式 NB
神经网络sklearn.neural_networkMLPClassifier、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 数据管道无缝衔接。
  • 结构化数据的分类与回归:金融风控、销售预测、用户分群等表格数据任务,梯度提升树与随机森林是首选。详见监督学习概览。
  • 数据预处理流水线:特征工程的标准化、编码、缺失值处理,sklearn 提供了完整的预处理组件。详见数据预处理。
  • 模型评估与选择:交叉验证、混淆矩阵、学习曲线,所有评估工具一应俱全。详见模型评估与交叉验证。
  • 降维与可视化:PCA 把高维特征压缩到 2-3 维,方便可视化与加速后续模型。详见降维方法。
  • 无监督聚类发现群体:用户画像分群、异常检测,KMeans 与 DBSCAN 开箱即用。详见聚类分析。
特性scikit-learnXGBoost / LightGBMPyTorch / TensorFlowSpark 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 — 数百个可运行示例,覆盖从基础分类到流形学习的各种任务,是最好的仿写素材。