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_yTrue函数将直接返回一个包含特征矩阵和目标数组的元组 (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弗吉尼亚鸢尾。示例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)输出特征名称 [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镁含量等。与鸢尾花数据集相比葡萄酒数据集的特征数量更多因此更适合用来说明“多特征分类问题”的基本特点。随着特征维度增加数据的结构会更复杂模型在训练时也更依赖于特征之间的综合作用。示例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)输出数据形状 (178, 13) (178,)前 5 个特征名称 [alcohol, malic_acid, ash, alcalinity_of_ash, magnesium]类别名称 [class_0 class_1 class_2]这个数据集适合帮助学习者理解以下几个问题• 当特征数量增加时分类问题会变得更加复杂• 不同特征的数值范围可能差异较大• 某些模型在多特征数据上往往需要先进行标准化或归一化处理• 特征不仅有“数量”的差别也有“区分能力”的差别因此葡萄酒数据集常被看作是从“低维、直观的分类示例”过渡到“较复杂结构化数据分类任务”的一个重要案例。3、乳腺癌数据集更接近实际的二分类任务乳腺癌数据集是一个经典且非常容易上手的二分类数据集共 569 个样本、30 个特征、2 个类别。示例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])输出数据形状 (569, 30) (569,)类别名称 [malignant benign]前 5 个特征名称 [mean radius mean texture mean perimeter mean area mean smoothness]与鸢尾花数据集相比这个数据集更能体现“多个数值特征共同作用于类别判断”的基本特点也更适合作为逻辑回归、支持向量机、树模型等二分类算法的入门示例。4、手写数字数据集图像也可以表示为特征矩阵手写数字数据集常用于图像分类入门。每个样本都是一张 8×8 的数字图像同时它也可以表示为一个长度为 64 的特征向量。该数据集共有 1797 个样本。示例 1from sklearn.datasets import load_digits digits load_digits() print(data 形状, digits.data.shape)print(images 形状, digits.images.shape)print(前 10 个标签, digits.target[:10])输出data 形状 (1797, 64)images 形状 (1797, 8, 8)前 10 个标签 [0 1 2 3 4 5 6 7 8 9]这个数据集有很强的教学意义因为它帮助学习者理解即使面对图像传统机器学习模型最终看到的仍然是数值形式的特征。示例 2显示前几张图片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], cmapgray) ax.set_title(digits.target[i]) ax.axis(off) plt.tight_layout()plt.show()输出5、糖尿病数据集从分类过渡到回归除了分类内置数据集也包含回归任务的典型示例。糖尿病数据集就是其中之一data 的形状为 (442, 10)target 的形状为 (442,)。示例from sklearn.datasets import load_diabetes diabetes load_diabetes()X, y diabetes.data, diabetes.target print(数据形状, X.shape, y.shape)print(前 10 个目标值, y[:10])输出数据形状 (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、生成分类数据示例from sklearn.datasets import make_classification X, y make_classification( n_samples1000, n_classes2, random_state42) print(X.shape, y.shape)输出(1000, 20) (1000,)这类数据适合用来测试分类器是否正常工作也适合研究类别不平衡、特征冗余、标签噪声等问题。在当前版本的 Scikit-learn 中make_classification 显式提供了 return_X_y 参数默认返回 (X, y)若将其设为 False则返回 Bunch 对象。2、生成回归数据示例from sklearn.datasets import make_regression X, y make_regression( n_samples100, n_features1, noise0.1, random_state42) print(X.shape, y.shape)输出(100, 1) (100,)它常用于说明回归任务中“输入与连续输出之间的函数关系”也适合配合散点图展示拟合效果。3、生成聚类数据示例from sklearn.datasets import make_blobs X, y make_blobs( n_samples300, centers4, cluster_std0.60, random_state42) print(X.shape, y.shape)输出(300, 2) (300,)这里虽然也会返回 y但它主要用于教学验证。在真实聚类任务中通常并没有现成标签模型需要根据样本分布自行发现簇结构。四、可下载的外部数据集更接近真实任务当内置数据集和合成数据集已经不足以支撑实验时就需要使用更接近真实场景的数据集。Scikit-learn 为此提供了若干获取接口例如 fetch_openml() 与 fetch_california_housing()。前者用于从 OpenML 获取数据集后者用于获取 California housing 数据集。1、获取公开分类数据MNISTfetch_openml() 可以从 OpenML 获取公开数据集。官方文档说明数据集可以通过名称或数据集 ID 来唯一指定当使用名称时也可以给定版本号。示例from sklearn.datasets import fetch_openml # 首次运行时会下载数据请保持网络连接X, y fetch_openml( namemnist_784, version1, return_X_yTrue, as_frameFalse) print(X shape:, X.shape) print(y shape:, y.shape)输出X shape: (70000, 784)y shape: (70000,)与 load_digits() 相比这类数据规模更大也更接近真实机器学习实验中的数据规模与处理压力。MNIST 的输入是 28×28 像素手写数字图像因此展开后对应 784 个特征。2、获取公开回归数据房价预测是入门回归任务中非常常见的主题。fetch_california_housing() 是当前 Scikit-learn 中仍推荐使用的标准房价数据集接口。官方文档说明该数据集共有 20640 个样本、8 个特征目标值是房屋价格相关的连续实数默认返回 Bunch 对象设置 return_X_yTrue 后可直接得到 (X, y)。示例from sklearn.datasets import fetch_california_housing housing fetch_california_housing() print(housing.data.shape) print(housing.target.shape) print(housing.feature_names)输出(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 数据。示例from sklearn.datasets import fetch_openml ames fetch_openml(namehouse_prices, as_frameTrue) # 注意fetch_openml 返回的是 Bunch 对象即使设置了 as_frameprint(type(ames)) print(ames.data.shape) print(ames.target.shape)输出class sklearn.utils._bunch.Bunch(1460, 80)(1460,)说明当 as_frameTrue 时ames.data 会以 pandas DataFrame 形式返回便于后续进行缺失值分析与类别特征处理。Ames Housing 的意义在于它往往比 California Housing 更像实际结构化数据任务特征更复杂更容易引出缺失值处理、类别特征编码以及更完整的数据预处理流程。这里不必急于深入细节但应知道sklearn.datasets 并不只服务于极简示例也能作为走向真实任务的入口。五、从数据集到模型无论数据来自内置数据集、外部获取数据集还是合成数据集其后续流程通常大致相同1、获取数据2、识别特征与目标3、划分训练集与测试集4、训练模型5、进行预测与评估示例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_size0.2, random_state42) # 3. 训练模型model LogisticRegression(max_iter200)model.fit(X_train, y_train) # 4. 进行预测y_pred model.predict(X_test) print(预测结果, y_pred[:10])输出预测结果 [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、任务类型以及后续建模流程之间的关系。“点赞有美意赞赏是鼓励”