成人数据集

2025年6月17日 | 阅读12分钟

您会发现,大多数二元分类问题都会出现一个称为类别不平衡的现象。许多人都能理解的一个例子是成人收入数据集,其最终目标是预测给定的人的收入是高于还是低于 50,000 美元。虽然整体类别分布不算极度不平衡,但仍然是不平衡的。

这使得可以应用基于不平衡分类的方法,而模型质量指标可以通过与平衡分类问题定义相似的分类准确率来指定。

在本节中,您将学习不平衡的成人收入分类数据集的模型构建和模型评估。

成人收入数据集

该项目使用了一个简单的不平衡机器学习数据集,即“成人收入”数据集,这是 1994 年美国人口普查局的数据集。该数据集由 Ronny Kohavi 和 Barry Becker 提出,旨在根据个人的特征(如教育和每周工作时间)来识别其月收入是否超过 50,000 美元。

参考: 用于提高朴素贝叶斯分类器准确率的决策树混合方法,1996 年。

数据集特征

该数据集包含 14 个输入变量,涵盖了类别、序数和数值数据类型。

  1. 年龄
  2. 工作类别
  3. 最终权重
  4. 教育
  5. 受教育年限
  6. 婚姻状况
  7. 职业
  8. 关系
  9. 种族
  10. 性 (Sex)
  11. 资本收益
  12. 资本损失
  13. 每周工作小时数
  14. 国籍

数据集特性

  1. 所有缺失值均用“?”符号表示。
  2. 总行数:48,842
  3. 含缺失值的行数:3,620
  4. 完整行数:45,222

目标变量

任务是一个二元分类问题,有两个目标类别

  • “<=50K”:多数类(约 75%)
  • “>50K”:少数类(约 25%)

即使存在中度类别不平衡,通常也会使用分类准确率或错误率来判断模型的性能,因为这两个类别都具有同等的重要性。

模型性能

使用预定义的训练集和测试集,良好的性能基准包括

  • 分类错误率:约 14%
  • 分类准确率:约 86%

这些是模型在此数据集上开发所依据的目标。最后,我们将更仔细地讨论该数据集。

探索数据集

成人收入数据集是一个相当典型的数据集,用于进行各种数据分析,以比较和演示不同的通用或不平衡分类方法。

探索数据集的步骤

1. 读取数据并准备数据

  • 当前记录集可保存在工作目录中,名为 adult-all.csv。
  • 输入变量包含数值、类别和序数性质。类别变量需要排序或进行独热编码(one-hot encoding),因此也称为独热类别变量或独热编码。
  • 目标变量(字符串)必须经过标签编码,其中多数类标记为 0,少数类标记为 1。
  • 这些用“?”标记的地方将被插补,因为缺失列的比例较小,只有 3,620 行。

2. 加载和处理数据

  • 应该使用 read_csv() 函数读取加载的“行机器学习”数据集,并自动将其转换为 Pandas DataFrame,将“?”作为 NaN。
  • 为此,他们通过删除包含缺失值的记录来执行行删除。
  • 描述数据集的形状和类别分布。

代码

输出

Shape: (45222, 15)
Class Distribution:
<=50K: 75.216% (Majority)
>50K: 24.784% (Minority)

3. 可视化数值变量

  • 使用 select_dtypes() 函数仅选择数值列。
  • 首先,创建每个数值变量的简单直方图,以初步了解它们的分布。

代码

观察

  • 数值变量呈现出多种分布:第一种类似于高斯分布和指数分布,第二种是离散的。
  • 变量的宽度差异很大。因此,有必要根据首选算法对变量进行归一化或缩放。
  • 此探索也证实了普遍假设,即该数据集相对较小,并对其类别不平衡程度进行了分类,以及为机器学习模型进行了这些预处理步骤。

模型测试是评估基线结果的重要过程。

通过重复分层 K 折交叉验证来对候选模型进行性能比较。与应用于训练-测试拆分不同,这种方法提供了对模型性能的更好估计。这里应用了 k=10,这意味着每个折叠包含约 4,522 个示例(45,222 除以 10)。

  • 分层:保持多数类和少数类在每个折叠中的比例分别为 75% 和 25%。
  • 重复:进行三次以减少方差并避免异常。
  • 在单个模型上执行 30 次独立评估,其中 10 折使用 3 次。

这里通过 scikit-learn 的 RepeatedStratifiedKFold 提供了这些运行的准确率分数的均值和标准差的摘要,并且使用分类准确率来评估每个模型的性能。

evaluate_model() 函数接收数据集和模型作为输入,评估模型,并返回准确率分数。

在应用模型之前,load_dataset() 函数加载数据,删除包含缺失值的特征,并对目标变量应用标签编码,其中多数类标记为 0,少数类标记为 1。它还识别类别和数值列。

基准模型对所有实例进行多数类预测。使用策略为“most_frequent”的 DummyClassifier 为比较提供基准。

代码

以下是加载数据集、评估基线模型和报告结果的完整代码。

结果

此处使用的数据集已正确加载,包含 45222 个实例,类别变量已正确转换为整数,其中 0 表示“<=50K”,1 表示“>50K”。

纯随机模型(我们叠加了模型)的平均准确率为 75.2% 左右,只有高于此标记的模型才被认为是熟练的。专家指出,在此数据集上的能力是在准确率高于 75.2% 的模型中识别的。

输出

(45222, 15) 
Class= <=50K, Count=34014, Percentage=75.216% 
Class= >50K, Count=11208, Percentage=24.784%

机器学习中的模型评估

下一阶段是在使用上述测试框架构建的相同环境中运行多个不同的机器学习算法。目的是遵循一种通用方法,为选定的数据集(特别是其不平衡性)寻找良好的算法基准。

将评估以下模型:

  • 决策树 (CART)
  • 支持向量机 (SVM)
  • 装袋决策树 (BAG)
  • 随机森林 (RF)
  • 梯度提升机或多元加法模型 (GBM)

方法

默认超参数:对于第一组实验,大多数超参数将保持默认状态,尽管对于集成方法,我们将树的数量设置为 100。

输入转换:为此,构建了一个管道来预处理数据集。

  • 独热编码:对于类别变量,其使用方式如下。
  • 归一化:使用 MinMaxScaler 方法对数值变量进行归一化。

所有这些预处理操作将在交叉验证过程中在每个训练/测试分区内进行。

代码

模型定义

关键步骤

管道创建

  • 对于像 Option 和 Size 这样的特征(分别是类别型和数值型),您可以使用 ColumnTransformer 来应用预处理。
  • 在 Pipeline 中将预处理步骤应用于每个模型作为特征。

交叉验证

  • 对每个模型执行重复分层 K 折交叉验证(分层十折 ×3)。
  • 收集特定的准确率评分以审查所创建模型的有效性。

目前,该架构采用未经调优的评估模型。此外,还可以探索超参数或其他算法的形式以获得更好的准确率。

现在,在这一步,我们将按如下方式执行特征的编码和缩放:使用 One Hot Encoder 转换类别变量,使用 Min Max Scaler 转换数值变量。所有这些预处理步骤都必须在进行交叉验证时对每个折叠进行。这保证了编码和缩放仅在训练集上进行训练,然后用于训练集和测试集。

实现这一点的最佳方法是使用 Pipeline。在第一阶段,管道中使用的转换器是 ColumnTransformer 类型,它将类别转换为独热编码列,并将数值列转换为由 MinMaxScaler 缩放的列。为此,我们将使用类别和数值变量的列索引。

先前定义的 load_dataset() 函数返回数据集以及类别和数值列的索引。这些索引可用于配置 ColumnTransformer,并将成为管道的第一阶段。因此,在管道中执行的最后一个操作是拟合待测的特定机器学习模型。

代码

可以以直接的方式呈现每个算法的聚合平均准确率,并轻松比较算法的性能。

评估后,如果需要,可以为每个算法的结果生成箱须图。这些图将具有相同的 y 轴比例,以便更好地比较不同图的结果分布。

完整代码

这是用于评估不平衡 ADULT 数据集上多个机器学习算法的实验的完整代码。

结果

这样运行此示例可以确定每个算法的见解,并提供分类准确率的均值和标准差。

注意:算法或评估过程可能是随机的,因此结果可能有所不同。您可以运行多次并比较代码运行的平均时间。

见解

本研究中的所有算法都取得了很高的结果;每个算法的分类准确率都超过 75.2%。随机梯度提升在集成决策树中表现最佳,结果略好于论文中采用不同方法获得的结果,约为 86.3%。

模型评估结果

每个算法的评估结果如下:

CART : 0.812 (0.005)

SVM: 0.837 (0.005)

BAG: 0.852 (0.004)

RF: 0.849 (0.004)

GBM: 0.863 (0.004)

为了显示每个算法结果的分布,已生成箱须图。盒子代表四分位距,即所有数据的中间一半:橙色线表示中位数,绿色三角形表示均值。任何异常值都用圆圈表示。

Adult Dataset

从图中可以清楚地看出,所有算法的得分都高于约 75% 的基准率,并且分布相对紧凑,这意味着结果是稳定的。中位数和均值的接近也支持了得分没有偏斜的分析。这仅强化了不仅关注集中趋势度量,而且还尝试在每个数据集中实现分布甚至基线负场景的范式,特别是那些基于不平衡少数类别发生的情况。

对新数据的估值和预测

为了进行预测,最终建立的模型将是“GradientBoostingClassifier”,其分类准确率为 86.3%。该过程包括:

  • 使用 ColumnTransformer,将类别变量和数值变量(编码和缩放)分开。
  • 开发一个 Pipeline,以便在训练和预测时执行此类转换。
  • 该 Pipeline 将允许对新数据进行预测,并包括与训练数据相同的编码和缩放。模型和 Pipeline 定义现在可以继续了。

进行预测

训练好的 Pipeline 可以使用 predict() 函数为新数据生成标签,并将以与训练期间相同的方式预处理数据。例如,给定一行:

这将导致“<=50K”的标签为 0,或“>50K”的标签为 1。

完整代码

以下脚本演示了加载数据集、训练模型以及对已知案例进行预测。

结果

该 Pipeline 正确预测了所有测试用例。这证明了它能够泛化并准确地对“<=50K”和“>50K”类别的新数据进行分类。

输出

<=50K cases: 
>Predicted=0 (expected 0) 
>Predicted=0 (expected 0) 
>Predicted=0 (expected 0) 
>50K cases: 
>Predicted=1 (expected 1) 
>Predicted=1 (expected 1) 
>Predicted=1 (expected 1)

下一主题机器学习模型