环境配置与常用数据集
本章介绍如何配置 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 依赖以下核心库:
| 依赖库 | 最低版本 | 用途 |
|---|---|---|
| NumPy | 1.17.3+ | 高效的数值计算和数组操作 |
| SciPy | 1.3.2+ | 科学计算和优化算法 |
| joblib | 0.11+ | 模型持久化和并行计算 |
| threadpoolctl | 2.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:经度
数据集汇总表
| 数据集 | 样本数 | 特征数 | 类别数 | 任务类型 | 用途 |
|---|---|---|---|---|---|
| Iris | 150 | 4 | 3 | 多分类 | 入门教程 |
| Digits | 1797 | 64 | 10 | 多分类 | 图像分类 |
| Wine | 178 | 13 | 3 | 多分类 | 特征分析 |
| Breast Cancer | 569 | 30 | 2 | 二分类 | 医学诊断 |
| Diabetes | 442 | 10 | - | 回归 | 回归入门 |
| California Housing | 20640 | 8 | - | 回归 | 房价预测 |
生成数据集
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
内存问题
问题:数据集太大,内存不足
解决方案:
- 使用增量学习(partial_fit)
- 降低数据精度(float64 → float32)
- 使用稀疏矩阵
- 分批处理数据
# 降低精度
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)
小结
- 使用虚拟环境:隔离项目依赖,避免版本冲突
- 选择合适的数据集:从内置数据集开始,逐步使用真实数据
- 正确划分数据:使用分层抽样,设置 random_state
- 了解数据特点:特征类型、分布、缺失情况等
- 善用数据生成:make_classification 等函数可以创建各种测试数据
准备好环境后,下一章我们将学习 数据预处理,了解如何处理和转换数据。