Scikit-learn:Bunch 对象
在 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_frame=True。此时返回的 Bunch 中,data 会变为 pandas DataFrame,target 会变为 DataFrame 或 Series;如果再设置 return_X_y=True,则函数会直接返回这两个对象。
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_y=True 直接返回的两个对象。
📘 小结
Bunch 对象是 Scikit-learn 中常见的数据集返回形式,本质上是一种支持属性访问的字典式容器。它将特征矩阵、标签数组、特征名称、类别名称和数据说明等信息统一封装起来,使数据集的结构更清晰、读取更方便。对于初学者来说,掌握 Bunch,有助于从“只看数据”过渡到“整体理解数据集结构”。
“点赞有美意,赞赏是鼓励”
