跳到主要内容

Scikit-learn 介绍

Scikit-learn(简称 sklearn)是 Python 生态系统中最流行的机器学习库,它构建在 NumPy、SciPy 和 matplotlib 之上,提供了简洁高效的工具用于数据挖掘和数据分析。无论是机器学习初学者还是经验丰富的数据科学家,sklearn 都是一个值得掌握的核心工具。

官方文档参考

本文档内容基于 scikit-learn 官方文档 编写。建议在学习过程中配合官方文档查阅更多细节。

为什么选择 Scikit-learn?

Python 机器学习生态系统中有很多优秀的库,比如 TensorFlow、PyTorch、XGBoost 等。那么为什么 sklearn 仍然是最受欢迎的选择之一?

统一的 API 设计。sklearn 的最大优势之一是一致的接口设计。几乎所有的算法都遵循相同的模式:创建模型对象、调用 fit() 训练、调用 predict() 预测。学会一个算法的使用方式,就等于学会了所有算法。

完整的工作流支持。从数据预处理、特征工程、模型训练到模型评估,sklearn 提供了端到端的工具链。不需要在不同库之间来回切换,一个库就能完成大部分机器学习任务。

丰富的算法选择。sklearn 实现了数十种经典的机器学习算法,包括线性模型、决策树、支持向量机、集成方法、聚类算法等。对于大多数传统机器学习任务,sklearn 的算法已经足够使用。

出色的文档和社区。sklearn 的官方文档详细且实用,每个算法都有大量的示例代码。活跃的社区意味着你遇到的问题很可能已经被别人解决过。

与科学计算生态无缝集成。sklearn 原生支持 NumPy 数组和 pandas DataFrame,可以轻松地与数据科学生态中的其他工具配合使用。

机器学习基础概念

在深入学习 sklearn 之前,有必要先了解一些核心概念。这些概念贯穿整个机器学习工作流程。

监督学习与无监督学习

机器学习算法主要分为两大类,划分的依据是训练数据是否包含标签。

监督学习(Supervised Learning) 的训练数据既包含特征(输入),也包含标签(输出)。算法的目标是学习从特征到标签的映射关系,以便对新的数据进行预测。

监督学习又可以细分为:

  • 分类(Classification):预测离散的类别标签。比如判断邮件是否为垃圾邮件、预测鸢尾花的品种、识别手写数字。
  • 回归(Regression):预测连续的数值。比如预测房价、估计温度、预测销量。

无监督学习(Unsupervised Learning) 的训练数据只有特征,没有标签。算法的目标是发现数据内部的结构或模式。

无监督学习包括:

  • 聚类(Clustering):将相似的样本归为一组。比如客户分群、新闻归类。
  • 降维(Dimensionality Reduction):在保留重要信息的前提下减少特征数量。比如数据可视化、特征压缩。

训练集、验证集与测试集

在机器学习中,数据的合理划分至关重要。通常的做法是将数据划分为三部分:

训练集(Training Set) 用于训练模型,让模型学习数据中的规律。通常占总数据的 60%-80%。

验证集(Validation Set) 用于调整模型的超参数,比如选择最优的正则化系数、决策树的深度等。通过观察模型在验证集上的表现来指导参数调整。

测试集(Test Set) 用于最终评估模型的性能。测试集的数据在训练和调参过程中完全不参与,保证评估结果的客观性。

在实际应用中,如果数据量不大,通常只划分训练集和测试集(如 80/20 划分),然后通过交叉验证来进行模型选择。

过拟合与欠拟合

过拟合(Overfitting) 指的是模型在训练数据上表现很好,但在新数据上表现很差。这通常是因为模型过于复杂,记住了训练数据的噪声和细节,而没有学到真正的规律。过拟合的模型泛化能力差。

欠拟合(Underfitting) 指的是模型在训练数据和新数据上都表现不好。这通常是因为模型过于简单,无法捕捉数据中的规律。

理想的模型应该在训练集和测试集上都有良好的表现。避免过拟合的常用方法包括:

  • 增加训练数据
  • 使用正则化(L1、L2)
  • 使用交叉验证
  • 选择适当复杂度的模型

偏差与方差

偏差(Bias)和方差(Variance)是评估模型性能的两个重要维度。

偏差衡量模型预测值与真实值之间的差异。高偏差意味着模型欠拟合,无法捕捉数据的真实模式。

方差衡量模型对训练数据变化的敏感程度。高方差意味着模型过拟合,对训练数据的微小变化过于敏感。

偏差和方差之间存在权衡关系:降低偏差通常会增加方差,反之亦然。机器学习的目标是在两者之间找到最佳平衡点。

核心设计理念

sklearn 的设计遵循几个核心原则,理解这些原则有助于更高效地使用这个库。

一致的 API

sklearn 中所有算法都遵循相同的接口规范。一个估计器(Estimator)至少实现以下方法:

  • fit(X, y):在训练数据上学习模型参数
  • predict(X):使用训练好的模型进行预测
  • score(X, y):评估模型在给定数据上的表现

这种一致性意味着,切换算法只需要更换类名,其他代码几乎不用改。

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

# 不同的分类器,相同的接口
classifiers = [
LogisticRegression(),
RandomForestClassifier(),
SVC()
]

for clf in classifiers:
clf.fit(X_train, y_train)
accuracy = clf.score(X_test, y_test)
print(f"{clf.__class__.__name__}: {accuracy:.2f}")

转换器模式

除了估计器,sklearn 还有另一类对象叫做转换器(Transformer),用于数据预处理和特征工程。转换器实现以下方法:

  • fit(X):从数据中学习转换参数(如均值、标准差)
  • transform(X):应用学到的转换
  • fit_transform(X):一步完成学习和转换,通常比分开调用更高效
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(X_train) # 学习均值和标准差
X_train_scaled = scaler.transform(X_train) # 应用转换
X_test_scaled = scaler.transform(X_test) # 对测试集应用相同的转换

管道机制

sklearn 的 Pipeline 类可以将多个处理步骤串联成一个整体,确保训练和预测时数据经过相同的处理流程。

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# 创建管道:标准化 -> 逻辑回归
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', LogisticRegression())
])

# 一步完成训练
pipeline.fit(X_train, y_train)

# 一步完成预测(自动先标准化再预测)
y_pred = pipeline.predict(X_test)

管道的好处是避免了数据泄露(Data Leakage):在交叉验证时,每折的标准化参数只从训练折计算,不会用到验证折的信息。

Scikit-learn 能做什么?

sklearn 涵盖了机器学习工作流程的各个环节:

监督学习

任务常用算法典型应用
分类逻辑回归、决策树、随机森林、SVM、KNN、朴素贝叶斯垃圾邮件检测、图像识别、疾病诊断
回归线性回归、岭回归、Lasso、随机森林回归、梯度提升房价预测、销量预测、股票分析

无监督学习

任务常用算法典型应用
聚类K-Means、DBSCAN、层次聚类、高斯混合模型客户分群、图像分割、异常检测
降维PCA、t-SNE、UMAP、因子分析数据可视化、特征压缩、噪声过滤

数据预处理

  • 特征缩放:StandardScaler、MinMaxScaler、RobustScaler
  • 编码:LabelEncoder、OneHotEncoder、OrdinalEncoder
  • 缺失值处理:SimpleImputer、KNNImputer
  • 特征选择:SelectKBest、RFE、SelectFromModel

模型评估与选择

  • 交叉验证:KFold、StratifiedKFold、cross_val_score
  • 超参数调优:GridSearchCV、RandomizedSearchCV
  • 评估指标:准确率、精确率、召回率、F1 分数、ROC-AUC、MSE、R²

安装与环境配置

安装 Scikit-learn

使用 pip 安装:

pip install scikit-learn

使用 conda 安装:

conda install scikit-learn

验证安装

import sklearn
print(f"scikit-learn 版本: {sklearn.__version__}")

核心依赖

sklearn 依赖以下核心库:

用途
NumPy高效的数值计算和数组操作
SciPy科学计算和优化算法
joblib模型持久化和并行计算

建议同时安装以下库以获得更好的体验:

pip install numpy scipy pandas matplotlib seaborn jupyter

快速上手示例

下面通过一个完整的例子展示 sklearn 的典型工作流程:加载鸢尾花数据集,训练一个随机森林分类器,并评估其性能。

# 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, classification_report

# 2. 加载数据
iris = load_iris()
X = iris.data # 特征矩阵:(150, 4)
y = iris.target # 目标向量:(150,)

print(f"特征名称: {iris.feature_names}")
print(f"类别名称: {iris.target_names}")
print(f"数据形状: {X.shape}")

# 3. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2, # 20% 作为测试集
random_state=42, # 固定随机种子,保证结果可复现
stratify=y # 分层抽样,保持各类别比例
)

# 4. 创建并训练模型
clf = RandomForestClassifier(
n_estimators=100, # 决策树数量
max_depth=5, # 最大深度
random_state=42
)
clf.fit(X_train, y_train)

# 5. 预测和评估
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f"\n测试集准确率: {accuracy:.2%}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 6. 查看特征重要性
import pandas as pd
feature_importance = pd.DataFrame({
'feature': iris.feature_names,
'importance': clf.feature_importances_
}).sort_values('importance', ascending=False)

print("\n特征重要性:")
print(feature_importance)

输出示例:

特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
类别名称: ['setosa' 'versicolor' 'virginica']
数据形状: (150, 4)

测试集准确率: 96.67%

分类报告:
precision recall f1-score support

setosa 1.00 1.00 1.00 10
versicolor 1.00 0.90 0.95 10
virginica 0.91 1.00 0.95 10

accuracy 0.97 30
macro avg 0.97 0.97 0.97 30
weighted avg 0.97 0.97 0.97 30

特征重要性:
feature importance
2 petal length (cm) 0.441866
3 petal width (cm) 0.417826
0 sepal length (cm) 0.106346
1 sepal width (cm) 0.033962

从这个例子可以看出 sklearn 的典型使用流程:数据加载 → 数据划分 → 模型训练 → 预测评估。无论使用什么算法,这个基本流程都是一致的。

本教程的组织结构

本教程按照由浅入深的原则组织,涵盖 sklearn 的核心功能:

基础部分

  1. 环境配置 - 开发环境搭建和常用数据集介绍
  2. 数据预处理 - 特征缩放、编码、缺失值处理、特征选择
  3. 分类算法 - 逻辑回归、决策树、随机森林、SVM 等分类器
  4. 回归算法 - 线性回归、正则化回归、树模型回归
  5. 聚类算法 - K-Means、DBSCAN、层次聚类

进阶部分

  1. 模型选择与评估 - 交叉验证、超参数调优、评估指标
  2. 降维方法 - PCA、t-SNE、因子分析
  3. 知识速查表 - 常用 API 快速参考

学习建议

动手实践。机器学习是一门实践性很强的学科。阅读教程时,建议在本地环境中运行每一行代码,尝试修改参数观察效果。

理解原理。sklearn 封装得很好,很容易就能跑出一个模型。但要真正用好它,需要理解算法背后的数学原理。本教程会在介绍每个算法时讲解其核心思想。

关注评估。训练模型只是工作的一部分,更重要的是评估模型的实际效果。不要只看训练集上的表现,要关注模型在未见数据上的泛化能力。

阅读官方文档。sklearn 的官方文档非常详细,每个算法都有参数说明、示例代码和数学原理。养成查阅官方文档的习惯。

准备好开始你的机器学习之旅了吗?下一章我们将详细介绍环境配置。