在机器学习中,模型并不是学习的起点,数据才是。对于初学者来说,很多困难并不来自算法公式,而是来自对"数据从哪里来、以什么形式存在、怎样进入模型"的认识不清。
Scikit-learn 的 sklearn.datasets 模块,正是为此提供支持:它既能加载经典示例数据,也能生成模拟实验数据,还能获取更接近真实场景的数据集。
sklearn.datasets 官方 API 将这些能力统一纳入同一模块中,其中既包括 load_iris、load_digits 这样的加载函数,也包括 fetch_openml、fetch_california_housing 这样的获取函数,以及 make_classification、make_regression 等合成数据生成函数。
学习这一模块的重点,不只是会调用几个函数,更重要的是理解三件事:什么是特征矩阵 X,什么是目标数组 y,以及不同类型的数据如何进入统一的建模流程。
一、数据集在机器学习中的作用
在 Scikit-learn 中,大多数监督学习模型都以"特征矩阵 + 目标数组"的形式接收数据。通常来说:
• X 表示特征矩阵,形状一般为 (n_samples, n_features)
• y 表示目标数组,形状一般为 (n_samples,)
如果任务是分类,y 往往是类别标签;
如果任务是回归,y 则通常是连续数值;
如果任务是聚类等无监督学习,往往只需要 X,而不需要事先给出 y。
因此,理解数据集,本质上就是理解机器学习任务如何被组织成可供模型处理的形式。
还需要注意一点:sklearn.datasets 中许多"加载函数"默认返回的并不只是数组,而是一个Bunch 对象。
它是一种"类似字典、又支持属性访问"的对象,常见字段包括 data、target、feature_names、target_names 和 DESCR;如果设置 return_X_y=True,函数将直接返回一个包含特征矩阵和目标数组的元组 (X, y),不再返回 Bunch 对象。这在直接进行模型训练时更为简洁。
二、内置数据集:适合入门与概念建立
Scikit-learn 提供了一组经典小型数据集,特点是规模较小、结构清晰、可直接使用。它们非常适合建立基本概念。当前官方 API 中仍列出的典型示例包括:iris、wine、digits、diabetes、breast_cancer、linnerud 等。
1、鸢尾花数据集:最经典的分类示例
鸢尾花数据集通常被视为分类任务的起点。它包含 150 个样本、4 个特征和 3 个类别。
4 个特征分别对应花萼长度、花萼宽度、花瓣长度和花瓣宽度;在实际返回结果中,它们显示为 sepal length (cm)、sepal width (cm)、petal length (cm)、petal width (cm)。
3 个类别分别是 setosa(山鸢尾)、versicolor(变色鸢尾)以及 virginica(弗吉尼亚鸢尾)。
示例:
python
from sklearn.datasets import load_iris
iris = load_iris()X, y = iris.data, iris.target
print("特征名称:", iris.feature_names)print("类别名称:", iris.target_names)print("数据形状:", X.shape, y.shape)
输出:
css
特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']类别名称: ['setosa' 'versicolor' 'virginica']数据形状: (150, 4) (150,)
这个例子清楚地展示了监督学习数据的基本结构:X 是二维特征矩阵,y 是一维标签数组。
2、葡萄酒数据集:多特征分类问题
葡萄酒数据集也是一个经典的分类数据集。它包含 178 个样本、13 个特征和 3 个类别。每个样本对应一种葡萄酒,特征则来自对葡萄酒化学成分的分析,例如 alcohol(酒精含量)、malic_acid(苹果酸)、ash(灰分)、alcalinity_of_ash(灰分碱度)、magnesium(镁含量)等。
与鸢尾花数据集相比,葡萄酒数据集的特征数量更多,因此更适合用来说明"多特征分类问题"的基本特点。随着特征维度增加,数据的结构会更复杂,模型在训练时也更依赖于特征之间的综合作用。
示例:
python
from sklearn.datasets import load_wine
wine = load_wine()X, y = wine.data, wine.target
print("数据形状:", X.shape, y.shape)print("前 5 个特征名称:", wine.feature_names[:5])print("类别名称:", wine.target_names)
输出:
css
数据形状: (178, 13) (178,)前 5 个特征名称: ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium']类别名称: ['class_0' 'class_1' 'class_2']
这个数据集适合帮助学习者理解以下几个问题:
• 当特征数量增加时,分类问题会变得更加复杂
• 不同特征的数值范围可能差异较大
• 某些模型在多特征数据上往往需要先进行标准化或归一化处理
• 特征不仅有"数量"的差别,也有"区分能力"的差别
因此,葡萄酒数据集常被看作是从"低维、直观的分类示例"过渡到"较复杂结构化数据分类任务"的一个重要案例。
3、乳腺癌数据集:更接近实际的二分类任务
乳腺癌数据集是一个经典且非常容易上手的二分类数据集,共 569 个样本、30 个特征、2 个类别。
示例:
python
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()X, y = cancer.data, cancer.target
print("数据形状:", X.shape, y.shape)print("类别名称:", cancer.target_names)print("前 5 个特征名称:", cancer.feature_names[:5])
输出:
javascript
数据形状: (569, 30) (569,)类别名称: ['malignant' 'benign']前 5 个特征名称: ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness']
与鸢尾花数据集相比,这个数据集更能体现"多个数值特征共同作用于类别判断"的基本特点,也更适合作为逻辑回归、支持向量机、树模型等二分类算法的入门示例。
4、手写数字数据集:图像也可以表示为特征矩阵
手写数字数据集常用于图像分类入门。每个样本都是一张 8×8 的数字图像;同时,它也可以表示为一个长度为 64 的特征向量。该数据集共有 1797 个样本。
示例 1:
python
from sklearn.datasets import load_digits
digits = load_digits()
print("data 形状:", digits.data.shape)print("images 形状:", digits.images.shape)print("前 10 个标签:", digits.target[:10])
输出:
css
data 形状: (1797, 64)images 形状: (1797, 8, 8)前 10 个标签: [0 1 2 3 4 5 6 7 8 9]
这个数据集有很强的教学意义,因为它帮助学习者理解:即使面对图像,传统机器学习模型最终看到的仍然是数值形式的特征。
示例 2:显示前几张图片
python
import matplotlib.pyplot as pltfrom sklearn.datasets import load_digits
digits = load_digits()fig, axes = plt.subplots(2, 5, figsize=(8, 4))for i, ax in enumerate(axes.ravel()): ax.imshow(digits.images[i], cmap="gray") ax.set_title(digits.target[i]) ax.axis("off")
plt.tight_layout()plt.show()
输出:

5、糖尿病数据集:从分类过渡到回归
除了分类,内置数据集也包含回归任务的典型示例。糖尿病数据集就是其中之一,data 的形状为 (442, 10),target 的形状为 (442,)。
示例:
python
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()X, y = diabetes.data, diabetes.target
print("数据形状:", X.shape, y.shape)print("前 10 个目标值:", y[:10])
输出:
css
数据形状: (442, 10) (442,)前 10 个目标值: [151. 75. 141. 206. 135. 97. 138. 63. 110. 310.]
在这里,y 不再是类别编号,而是连续型目标值。这正是分类与回归在数据层面的根本区别。
6、Linnerud 数据集:理解多输出目标
如果希望进一步扩展对"目标数组"的理解,还可以注意 load_linnerud()。它常被用来说明:监督学习的目标并不一定总是一维向量,也可能是多输出目标。官方 API 将它列为标准小型数据集之一。
它的教学意义不在于规模,而在于帮助学习者意识到:y 有时可以是一维数组,也可以是二维目标矩阵。
三、合成数据集:用于可控实验
除了加载现成数据,Scikit-learn 还可以按指定规则生成模拟数据。
合成数据的最大优点是"可控":样本数、特征数、类别数、噪声强度等都可以人为设定,因此特别适合教学、调试和算法比较。官方 sklearn.datasets API 将 make_classification、make_regression、make_blobs 等统一列入样本生成器。
1、生成分类数据
示例:
python
from sklearn.datasets import make_classification
X, y = make_classification( n_samples=1000, n_classes=2, random_state=42)
print(X.shape, y.shape)
输出:
go
(1000, 20) (1000,)
这类数据适合用来测试分类器是否正常工作,也适合研究类别不平衡、特征冗余、标签噪声等问题。
在当前版本的 Scikit-learn 中,make_classification 显式提供了 return_X_y 参数,默认返回 (X, y);若将其设为 False,则返回 Bunch 对象。
2、生成回归数据
示例:
python
from sklearn.datasets import make_regression
X, y = make_regression( n_samples=100, n_features=1, noise=0.1, random_state=42)
print(X.shape, y.shape)
输出:
go
(100, 1) (100,)
它常用于说明回归任务中"输入与连续输出之间的函数关系",也适合配合散点图展示拟合效果。
3、生成聚类数据
示例:
python
from sklearn.datasets import make_blobs
X, y = make_blobs( n_samples=300, centers=4, cluster_std=0.60, random_state=42)
print(X.shape, y.shape)
输出:
go
(300, 2) (300,)
这里虽然也会返回 y,但它主要用于教学验证。在真实聚类任务中,通常并没有现成标签,模型需要根据样本分布自行发现簇结构。
四、可下载的外部数据集:更接近真实任务
当内置数据集和合成数据集已经不足以支撑实验时,就需要使用更接近真实场景的数据集。
Scikit-learn 为此提供了若干获取接口,例如 fetch_openml() 与 fetch_california_housing()。前者用于从 OpenML 获取数据集,后者用于获取 California housing 数据集。
1、获取公开分类数据:MNIST
fetch_openml() 可以从 OpenML 获取公开数据集。官方文档说明,数据集可以通过名称或数据集 ID 来唯一指定;当使用名称时,也可以给定版本号。
示例:
python
from sklearn.datasets import fetch_openml
# 首次运行时会下载数据,请保持网络连接X, y = fetch_openml( name="mnist_784", version=1, return_X_y=True, as_frame=False)
print("X shape:", X.shape) print("y shape:", y.shape)
输出:
apache
X shape: (70000, 784)y shape: (70000,)
与 load_digits() 相比,这类数据规模更大,也更接近真实机器学习实验中的数据规模与处理压力。MNIST 的输入是 28×28 像素手写数字图像,因此展开后对应 784 个特征。
2、获取公开回归数据
房价预测是入门回归任务中非常常见的主题。fetch_california_housing() 是当前 Scikit-learn 中仍推荐使用的标准房价数据集接口。官方文档说明:该数据集共有 20640 个样本、8 个特征,目标值是房屋价格相关的连续实数;默认返回 Bunch 对象,设置 return_X_y=True 后可直接得到 (X, y)。
示例:
python
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
print(housing.data.shape) print(housing.target.shape) print(housing.feature_names)
输出:
css
(20640, 8)(20640,)['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
这个数据集的教学价值很高,因为它已经不像鸢尾花那样只是"演示结构",而更像是一个真正需要进行数据探索、特征理解和预处理的回归问题。
过去很多教材喜欢使用 Boston Housing,但现在不宜再把它作为推荐示例。
官方文档明确说明:load_boston 已在 1.0 中弃用,并在 1.2 中移除,同时给出了替代建议,包括 California housing 与 Ames housing。
可以通过 OpenML 获取 Ames housing 的 house_prices 数据。
示例:
python
from sklearn.datasets import fetch_openml
ames = fetch_openml(name="house_prices", as_frame=True)
# 注意:fetch_openml 返回的是 Bunch 对象,即使设置了 as_frameprint(type(ames)) print(ames.data.shape) print(ames.target.shape)
输出:
javascript
<class 'sklearn.utils._bunch.Bunch'>(1460, 80)(1460,)
说明:
当 as_frame=True 时,ames.data 会以 pandas DataFrame 形式返回,便于后续进行缺失值分析与类别特征处理。
Ames Housing 的意义在于:它往往比 California Housing 更像实际结构化数据任务,特征更复杂,更容易引出缺失值处理、类别特征编码以及更完整的数据预处理流程。这里不必急于深入细节,但应知道:sklearn.datasets 并不只服务于极简示例,也能作为走向真实任务的入口。
五、从数据集到模型
无论数据来自内置数据集、外部获取数据集还是合成数据集,其后续流程通常大致相同:
1、获取数据
2、识别特征与目标
3、划分训练集与测试集
4、训练模型
5、进行预测与评估
示例:
python
from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegression
# 1. 获取数据iris = load_iris() # 加载鸢尾花数据集X, y = iris.data, iris.target
# 2. 划分训练集与测试集X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42)
# 3. 训练模型model = LogisticRegression(max_iter=200)model.fit(X_train, y_train)
# 4. 进行预测y_pred = model.predict(X_test)
print("预测结果:", y_pred[:10])
输出:
css
预测结果: [1 0 2 1 1 0 1 2 1 1]
这个例子说明,数据集函数的意义并不在于"成功加载",而在于它们为后续建模提供了统一、规范的起点。LogisticRegression 官方文档也说明,它是逻辑回归分类器,可处理稠密或稀疏输入。
六、学习 sklearn.datasets 时应建立的整体认识
如果把前面的内容综合起来,初学者在学习这一模块时,最好形成如下认识。
1、数据集不是零散函数,而是一套完整支持体系
sklearn.datasets 不是"若干无关的数据函数",而是一套面向机器学习教学与实验的数据支持体系。它同时覆盖:
• 小型经典数据集
• 可控合成数据集
• 可下载公开数据集
• 面向不同任务类型的数据入口
2、不同接口面向不同学习阶段
• 入门阶段:优先使用 load_iris()、load_wine()、load_digits()、load_breast_cancer()
• 理解回归:可使用 load_diabetes()、fetch_california_housing()
• 做可控实验:可使用 make_classification()、make_regression()、make_blobs()
• 接近真实任务:可使用 fetch_openml() 获取更大规模数据
3、重点不只是"拿到数据",而是"理解数据"
真正重要的问题包括:
• 数据的样本数是多少?
• 每个样本有多少个特征?
• y 是类别,还是连续数值?
• 是否存在特征尺度差异?
• 是否需要标准化、编码、缺失值处理?
• 数据是否足以代表真实任务的复杂性?
只有把这些问题想清楚,数据集才真正进入机器学习流程,而不只是停留在函数调用层面。
📘 小结
sklearn.datasets 为机器学习学习与实验提供了完整的数据支持体系。内置数据集适合建立概念,合成数据集适合做可控实验,可下载数据集更接近真实任务。学习它的关键,不只是知道怎样获得数据,更重要的是理解 X、y、任务类型以及后续建模流程之间的关系。

"点赞有美意,赞赏是鼓励"