在 Scikit-learn 中很多数据集加载函数或获取函数并不是直接返回元组、列表或单独的数组而是以名为 Bunch 的对象统一封装。理解 Bunch 对象有助于更清晰地读取数据集内容也能帮助初学者建立“数据集由多个部分共同构成”的整体认识。一、什么是 Bunch 对象Bunch 是 Scikit-learn 中的一种容器对象本质上是支持属性访问的字典式数据结构。Bunch 与普通字典非常相似但它额外支持通过属性名访问键对应的值。例如普通字典通常写作d[data]而 Bunch 既能这样写也能写成bunch.data因此Bunch 可以看作是在保留字典组织方式的同时提供了更方便的访问形式。Bunch 的作用主要是把同一数据集的多个相关部分统一组织起来并提供更方便的访问方式真正参与数值计算和模型训练的仍然是其中的 data、target 等具体数据对象。二、为什么 Scikit-learn 要使用 Bunch一个机器学习数据集往往不只有一份“数据”。通常还会同时包含• 特征数据• 标签数据• 特征名称• 类别名称• 数据说明文档如果把这些内容分散返回使用时会比较混乱。而 Bunch 的优势就在于用一个对象统一保存这些相关信息。例如加载鸢尾花数据集时from sklearn.datasets import load_iris iris load_iris()print(type(iris))输出结果通常类似于class sklearn.utils._bunch.Bunch可以看出load_iris() 返回的并不是单独的数组而是一个 Bunch 对象。说明上例输出结果中出现的是其实际实现所在的模块路径在学习和使用时通常将它理解为 sklearn.utils.Bunch 即可。三、Bunch 中常见的字段不同数据集返回的字段可能略有差异。要注意的是下面列出的这些字段是常见字段而不是所有 Bunch 对象都必须同时具备的固定字段集合。data 是最核心的部分表示特征矩阵。它通常是一个二维数组• 每一行表示一个样本• 每一列表示一个特征例如在鸢尾花数据集中四列特征分别对应花萼长度、花萼宽度、花瓣长度和花瓣宽度在实际返回结果中它们会以 sepal length (cm)、sepal width (cm)、petal length (cm)、petal width (cm) 等名称出现。print(iris.data[:3])说明在较新版本的 Scikit-learn 中许多加载函数支持 as_frameTrue。此时返回的 Bunch 中data 会变为 pandas DataFrametarget 会变为 DataFrame 或 Series如果再设置 return_X_yTrue则函数会直接返回这两个对象。target 表示标签数组也就是每个样本对应的类别或目标值。print(iris.target[:10])如果是分类问题target 往往是类别编号如果是回归问题target 往往是连续数值。feature_names 用于说明各个特征列的名称。print(iris.feature_names)这对于理解 data 中每一列的含义非常重要。否则我们只能看到数字而不知道这些数字分别表示什么。在分类数据集中target_names 常用于给出类别名称。print(iris.target_names)例如target 中可能用 0、1、2 表示三类花而 target_names 则给出它们真正的类别名称。DESCR 是对数据集的文字说明description通常包含• 数据集背景• 样本数量• 特征说明• 类别说明• 数据来源print(iris.DESCR[:300])DESCR 是一个字符串str类型的字段适合在初步了解数据集时阅读但一般不用于正式建模过程中的数值计算。四、Bunch 的两种访问方式1、属性访问这是最常见、也最直观的方式print(iris.data.shape)print(iris.target.shape)print(iris.feature_names)这种写法简洁适合日常使用。不过需注意属性访问要求键名必须是有效的 Python 变量名无空格、无连字符。若遇到特殊键名仍需使用下方的字典方式访问。2、字典方式访问由于 Bunch 与字典类似也可以这样写print(iris[data].shape)print(iris[target].shape)print(iris[feature_names])这种写法在需要动态处理键名时更方便。例如for key in iris.keys(): print(key)五、简单示例下面通过一个简单示例观察 Bunch 对象中最常用的几个部分from sklearn.datasets import load_iris # 加载鸢尾花数据集iris load_iris() # 查看 Bunch 中有哪些字段print(iris.keys()) # 查看特征矩阵和标签数组的形状print(data 的形状, iris.data.shape)print(target 的形状, iris.target.shape) # 查看特征名称print(特征名称, iris.feature_names) # 查看类别名称print(类别名称, iris.target_names) # 查看前 3 个样本print(前 3 个样本)print(iris.data[:3]) # 查看前 3 个样本的标签print(前 3 个标签)print(iris.target[:3])通过这个示例可以看到Bunch 对象并不是某种复杂算法结构而是一个把数据集相关信息组织在一起的“容器”。六、学习 Bunch 时应把握的重点学习 Bunch不必把注意力放在它的内部实现上而应重点理解以下三点。1、Bunch 是数据集的封装容器Bunch 负责把同一数据集的多个部分组织在一起。2、Bunch 本身不是训练数据真正用于建模的是 data 和 target而不是 Bunch 这个外层对象本身。3、Bunch 可帮助我们建立完整的数据集视角一个数据集不仅有样本值还应包括特征名、标签含义和说明信息。Bunch 的价值正在于把这些内容统一呈现出来。从机器学习建模的角度看Bunch 更适合用于“查看和理解数据集”真正送入模型的通常是其中的 data 与 target或者由 return_X_yTrue 直接返回的两个对象。 小结Bunch 对象是 Scikit-learn 中常见的数据集返回形式本质上是一种支持属性访问的字典式容器。它将特征矩阵、标签数组、特征名称、类别名称和数据说明等信息统一封装起来使数据集的结构更清晰、读取更方便。对于初学者来说掌握 Bunch有助于从“只看数据”过渡到“整体理解数据集结构”。“点赞有美意赞赏是鼓励”