Scikit-learn:数据集

在机器学习中,模型并不是学习的起点,数据才是。对于初学者来说,很多困难并不来自算法公式,而是来自对"数据从哪里来、以什么形式存在、怎样进入模型"的认识不清。

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、任务类型以及后续建模流程之间的关系。

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

相关推荐
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章52-交点查找
图像处理·人工智能·opencv·算法·计算机视觉
冬奇Lab2 小时前
一天一个开源项目(第81篇):YC 总裁亲自写代码,把自己的大脑开源了
人工智能·开源·资讯
冬奇Lab2 小时前
SubAgent 原理深度解析:AI 系统如何通过委托实现专业化分工
人工智能·agent·claude
ZhengEnCi2 小时前
01c-循环神经网络RNN详解
人工智能·深度学习
仙女修炼史2 小时前
CNN的捷径学习Shortcut Learning in Deep Neural Networks
人工智能·学习·cnn
企业架构师老王2 小时前
数据安全优先:企业级智能体私有化部署完整方案与最佳实践
人工智能·ai
北漂Zachary2 小时前
AI训练硬件选型:GPU算力梯队全解析
人工智能·gpu算力
CS创新实验室2 小时前
CS实验室行业报告:机器人领域就业分析报告
大数据·人工智能·机器人
才兄说2 小时前
机器人二次开发机器狗巡检?绕行率低于10%
人工智能