跳到主要内容

环境配置与常用数据集

本章介绍如何配置 scikit-learn 开发环境,以及 sklearn 中常用数据集的使用方法。良好的开发环境是高效学习和实践的基础。

安装 Scikit-learn

使用 pip 安装

pip 是 Python 最常用的包管理器。建议在虚拟环境中安装,避免与系统 Python 环境冲突。

# 创建虚拟环境
python -m venv sklearn-env

# 激活环境 (Windows)
sklearn-env\Scripts\activate

# 激活环境 (Linux/Mac)
source sklearn-env/bin/activate

# 安装 scikit-learn
pip install scikit-learn

# 验证安装
python -c "import sklearn; print(sklearn.__version__)"

为什么使用虚拟环境?

虚拟环境可以:

  • 隔离不同项目的依赖
  • 避免版本冲突
  • 便于项目迁移和复现
  • 保持系统 Python 环境整洁

使用 conda 安装

如果你使用 Anaconda 或 Miniconda,可以用 conda 安装:

# 创建新环境
conda create -n sklearn-env python=3.10

# 激活环境
conda activate sklearn-env

# 安装 scikit-learn
conda install scikit-learn

# 同时安装常用数据科学包
conda install scikit-learn numpy pandas matplotlib seaborn jupyter

安装特定版本

如果需要安装特定版本:

# pip 方式
pip install scikit-learn==1.3.0

# conda 方式
conda install scikit-learn=1.3.0

依赖项说明

Scikit-learn 依赖以下核心库:

依赖库最低版本用途
NumPy1.17.3+高效的数值计算和数组操作
SciPy1.3.2+科学计算和优化算法
joblib0.11+模型持久化和并行计算
threadpoolctl2.0.0+线程池控制

可选依赖

以下库不是必需的,但强烈推荐安装:

# 数据处理
pip install pandas

# 可视化
pip install matplotlib seaborn

# 交互式开发
pip install jupyter notebook

# 统计分析
pip install statsmodels

验证安装

安装完成后,运行以下代码验证:

import sklearn
import numpy as np
import scipy

# 打印版本信息
print(f"scikit-learn 版本: {sklearn.__version__}")
print(f"NumPy 版本: {np.__version__}")
print(f"SciPy 版本: {scipy.__version__}")

# 测试基本功能
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier

iris = load_iris()
clf = RandomForestClassifier(random_state=42)
clf.fit(iris.data, iris.target)
accuracy = clf.score(iris.data, iris.target)
print(f"\n测试通过!训练集准确率: {accuracy:.2f}")

开发环境推荐

Jupyter Notebook

Jupyter Notebook 是机器学习开发的常用工具,支持交互式编程和可视化。

# 安装 Jupyter
pip install jupyter

# 启动 Notebook
jupyter notebook

# 或使用 JupyterLab(更现代的界面)
pip install jupyterlab
jupyter lab

Jupyter 的优势

  • 交互式执行代码,即时查看结果
  • 支持 Markdown 文档和代码混合
  • 内联显示图表
  • 便于实验和调试

VS Code

VS Code 是流行的代码编辑器,配合 Python 扩展可以提供良好的开发体验。

推荐扩展

  • Python(官方扩展)
  • Pylance(智能提示)
  • Jupyter(Notebook 支持)
  • Code Runner(快速运行代码)

配置示例(settings.json):

{
"python.defaultInterpreterPath": "path/to/sklearn-env/bin/python",
"python.linting.enabled": true,
"python.formatting.provider": "black",
"editor.formatOnSave": true
}

Google Colab

Google Colab 是免费的云端 Jupyter 环境,预装了 scikit-learn 和常用数据科学库。

优势

  • 免费使用 GPU/TPU
  • 无需本地安装
  • 方便分享和协作

使用方式: 直接访问 colab.research.google.com,新建 Notebook 即可开始。

常用数据集

sklearn 内置了多种常用数据集,方便学习和实验。这些数据集规模适中,适合快速验证算法效果。

内置数据集

鸢尾花数据集(Iris)

最经典的机器学习数据集,包含 3 种鸢尾花的 150 个样本,每个样本有 4 个特征。

from sklearn.datasets import load_iris

iris = load_iris()
X, y = iris.data, iris.target

print(f"数据形状: {X.shape}") # (150, 4)
print(f"特征名称: {iris.feature_names}")
print(f"类别名称: {iris.target_names}") # ['setosa' 'versicolor' 'virginica']
print(f"类别分布: {np.bincount(y)}") # [50, 50, 50]

特征说明

  • sepal length:萼片长度(cm)
  • sepal width:萼片宽度(cm)
  • petal length:花瓣长度(cm)
  • petal width:花瓣宽度(cm)

手写数字数据集(Digits)

包含 0-9 共 10 个数字的手写图像,每个图像是 8×8 的像素矩阵。

from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

digits = load_digits()
X, y = digits.data, digits.target

print(f"数据形状: {X.shape}") # (1797, 64)
print(f"图像尺寸: 8x8")

# 可视化前 10 个数字
fig, axes = plt.subplots(2, 5, figsize=(10, 4))
for i, ax in enumerate(axes.flat):
ax.imshow(digits.images[i], cmap='gray')
ax.set_title(f"数字: {digits.target[i]}")
ax.axis('off')
plt.tight_layout()
plt.show()

葡萄酒数据集(Wine)

包含 3 种葡萄酒的化学成分分析,共 178 个样本,13 个特征。

from sklearn.datasets import load_wine

wine = load_wine()
X, y = wine.data, wine.target

print(f"数据形状: {X.shape}") # (178, 13)
print(f"特征名称: {wine.feature_names}")
print(f"类别数量: {len(wine.target_names)}") # 3

特征说明: 酒精含量、苹果酸、灰分、灰分碱度、镁、总酚、黄酮类化合物等 13 个化学指标。

乳腺癌数据集(Breast Cancer)

用于医学诊断的二分类数据集,包含良性和恶性肿瘤的特征。

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
X, y = cancer.data, cancer.target

print(f"数据形状: {X.shape}") # (569, 30)
print(f"类别名称: {cancer.target_names}") # ['malignant' 'benign']
print(f"特征数量: {len(cancer.feature_names)}") # 30

适用场景:二分类问题、特征选择、模型解释。

糖尿病数据集(Diabetes)

用于回归任务的数据集,预测糖尿病进展指标。

from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target

print(f"数据形状: {X.shape}") # (442, 10)
print(f"目标范围: [{y.min():.1f}, {y.max():.1f}]")

加州房价数据集(California Housing)

回归任务数据集,基于加州房价数据,预测房屋中位数价格。

from sklearn.datasets import fetch_california_housing

housing = fetch_california_housing()
X, y = housing.data, housing.target

print(f"数据形状: {X.shape}") # (20640, 8)
print(f"特征名称: {housing.feature_names}")

特征说明

  • MedInc:街区收入中位数
  • HouseAge:房屋年龄中位数
  • AveRooms:平均房间数
  • AveBedrms:平均卧室数
  • Population:人口数
  • AveOccup:平均入住率
  • Latitude:纬度
  • Longitude:经度

数据集汇总表

数据集样本数特征数类别数任务类型用途
Iris15043多分类入门教程
Digits17976410多分类图像分类
Wine178133多分类特征分析
Breast Cancer569302二分类医学诊断
Diabetes44210-回归回归入门
California Housing206408-回归房价预测

生成数据集

sklearn 还提供了灵活的数据生成函数,可以创建各种结构的数据集用于实验。

分类数据生成

from sklearn.datasets import make_classification

# 生成分类数据
X, y = make_classification(
n_samples=1000, # 样本数
n_features=20, # 特征数
n_informative=15, # 有效特征数
n_redundant=3, # 冗余特征数
n_clusters_per_class=2, # 每类的簇数
n_classes=3, # 类别数
weights=[0.5, 0.3, 0.2], # 类别权重(模拟不平衡)
random_state=42
)

print(f"数据形状: {X.shape}")
print(f"类别分布: {np.bincount(y)}")

参数说明

  • n_informative:真正有用的特征数
  • n_redundant:由有效特征线性组合生成的冗余特征
  • n_repeated:重复特征
  • n_clusters_per_class:每个类别的簇数,值越大分类越困难
  • flip_y:随机翻转标签的比例,模拟噪声

回归数据生成

from sklearn.datasets import make_regression

# 生成回归数据
X, y = make_regression(
n_samples=1000, # 样本数
n_features=20, # 特征数
n_informative=15, # 有效特征数
noise=10, # 噪声标准差
random_state=42
)

print(f"数据形状: {X.shape}")
print(f"目标范围: [{y.min():.1f}, {y.max():.1f}]")

聚类数据生成

from sklearn.datasets import make_blobs

# 生成聚类数据
X, y = make_blobs(
n_samples=500, # 样本数
n_features=2, # 特征数(便于可视化)
centers=4, # 簇中心数
cluster_std=0.8, # 簇的标准差
random_state=42
)

print(f"数据形状: {X.shape}")
print(f"簇数量: {len(np.unique(y))}")

# 可视化
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', s=30)
plt.title('生成的聚类数据')
plt.colorbar(label='簇标签')
plt.show()

月牙形和圆形数据

用于测试非线性分类器和聚类算法:

from sklearn.datasets import make_moons, make_circles

# 月牙形数据
X_moons, y_moons = make_moons(n_samples=300, noise=0.1, random_state=42)

# 圆形数据
X_circles, y_circles = make_circles(n_samples=300, noise=0.1, factor=0.5, random_state=42)

# 可视化
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

axes[0].scatter(X_moons[:, 0], X_moons[:, 1], c=y_moons, cmap='viridis', s=30)
axes[0].set_title('月牙形数据')

axes[1].scatter(X_circles[:, 0], X_circles[:, 1], c=y_circles, cmap='viridis', s=30)
axes[1].set_title('圆形数据')

plt.tight_layout()
plt.show()

数据加载最佳实践

使用 Pipeline 和 train_test_split

加载数据后,正确划分训练集和测试集是第一步:

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

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分数据(分层抽样)
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2, # 20% 作为测试集
random_state=42, # 固定随机种子
stratify=y # 分层抽样,保持类别比例
)

# 验证划分
print(f"训练集大小: {X_train.shape[0]}")
print(f"测试集大小: {X_test.shape[0]}")
print(f"训练集类别分布: {np.bincount(y_train)}")
print(f"测试集类别分布: {np.bincount(y_test)}")

处理大规模数据集

对于无法完全加载到内存的大数据集,sklearn 提供了一些解决方案:

增量学习

from sklearn.linear_model import SGDClassifier

# 使用支持增量学习的模型
clf = SGDClassifier(random_state=42)

# 分批训练
for batch_X, batch_y in data_batches:
clf.partial_fit(batch_X, batch_y, classes=np.unique(y))

使用生成器

def batch_generator(X, y, batch_size=100):
"""数据批量生成器"""
n_samples = X.shape[0]
for i in range(0, n_samples, batch_size):
yield X[i:i+batch_size], y[i:i+batch_size]

常见问题解决

安装问题

问题:pip 安装速度慢

解决方案:使用国内镜像源

pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple

问题:依赖版本冲突

解决方案:使用虚拟环境或 conda

conda create -n sklearn-env python=3.10
conda activate sklearn-env
conda install scikit-learn

内存问题

问题:数据集太大,内存不足

解决方案:

  1. 使用增量学习(partial_fit)
  2. 降低数据精度(float64 → float32)
  3. 使用稀疏矩阵
  4. 分批处理数据
# 降低精度
X = X.astype(np.float32)

# 使用稀疏矩阵
from scipy import sparse
X_sparse = sparse.csr_matrix(X)

并行计算

sklearn 支持多核并行计算:

# 使用所有 CPU 核心
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(n_jobs=-1, random_state=42)
clf.fit(X_train, y_train)

小结

  1. 使用虚拟环境:隔离项目依赖,避免版本冲突
  2. 选择合适的数据集:从内置数据集开始,逐步使用真实数据
  3. 正确划分数据:使用分层抽样,设置 random_state
  4. 了解数据特点:特征类型、分布、缺失情况等
  5. 善用数据生成:make_classification 等函数可以创建各种测试数据

准备好环境后,下一章我们将学习 数据预处理,了解如何处理和转换数据。