2万字阐述-Python 用 XGBoost 进行梯度提升的数据准备(收藏)

XGBoost 是一种流行的梯度提升实现,因为它的速度和性能。
在内部,XGBoost 模型将所有问题表示为仅将数值作为输入的回归预测建模问题。如果您的数据采用不同的形式,则必须将其准备为预期的格式。
今天讲解如何使用 Python 中的 XGBoost 库准备用于梯度提升的数据。
看完这篇文章你们会学习:
如何编码字符串输出变量以进行分类。
如何使用一种热编码准备分类输入变量。
如何使用 XGBoost 自动处理缺失数据。

标签编码字符串类值
鸢尾花分类问题是具有字符串类值的问题的一个示例。
这是一个预测问题,其中给定鸢尾花的厘米测量值,任务是预测给定的花属于哪个物种。
下载数据集并将其放置在您当前的工作目录中,文件名为“ iris.csv ”。
鸢尾花数据集
鸢尾花数据集描述
XGBoost 不能按原样本对这个问题进行建模,因为它要求输出变量是数字变量。
我们可以使用LabelEncoder轻松地将字符串值转换为整数值。三个类值(Iris-setosa、Iris-versicolor、Iris-virginica)被映射到整数值(0、1、2)。
我们将标签编码器保存为一个单独的对象,以便我们可以使用相同的编码方案转换训练数据集以及随后的测试和验证数据集。
下面是一个完整的示例,演示如何加载 iris 数据集。请注意,Pandas 用于加载数据以处理字符串类值。
注意:计算机运行结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
运行该示例会产生以下输出
请注意 XGBoost 模型如何配置为使用multi:softprob目标自动对多类分类问题进行建模,该目标是对类概率建模的 softmax 损失函数的变体。这表明在内部,输出类会自动转换为单热类型编码。
一种热编码分类数据
某些数据集仅包含分类数据,例如乳腺癌数据集。
该数据集描述了乳腺癌活检的技术细节,预测任务是预测患者是否有癌症复发。
下载数据集并将其放置在您当前的工作目录中,文件名为“ breast-cancer.csv ”。
乳腺癌数据集
乳腺癌数据集描述
以下是原始数据集的示例。

我们可以看到所有 9 个输入变量都是分类的并以字符串格式描述。该问题是一个二元分类预测问题,输出类值也以字符串格式描述。
我们可以重用上一节中的相同方法,并将字符串类值转换为整数值,以使用 LabelEncoder 对预测进行建模。例如:
我们可以对 X 中的每个输入特征使用相同的方法,但这只是一个起点。
XGBoost 可以假设每个输入变量的编码整数值具有序数关系。例如,对于乳房四边形变量,编码为 0 的 'left-up' 和编码为 1 的 'left-low' 具有作为整数的有意义的关系。在这种情况下,这个假设是不正确的。
相反,我们必须将这些整数值映射到新的二进制变量上,每个分类值对应一个新变量。
例如,乳房四边形变量具有以下值:
我们可以将其建模为 5 个二元变量,如下所示:
这称为一种热编码。我们可以使用scikit-learn 中的OneHotEncoder类对所有分类输入变量进行热编码。
我们可以在对每个特征进行标签编码后对其进行热编码。首先,我们必须将特征数组转换为二维 NumPy 数组,其中每个整数值都是一个长度为 1 的特征向量。
然后我们可以创建 OneHotEncoder 并对特征数组进行编码
最后,我们可以通过将一个热编码特征一个一个地连接起来,将它们添加为新列(轴 = 2)来构建输入数据集。我们最终得到一个由 43 个二进制输入变量组成的输入向量
理想情况下,我们可以尝试不对某些输入属性进行热编码,因为我们可以使用明确的序数关系对它们进行编码,例如,第一列年龄的值类似于 '40-49' 和 '50-59'。如果您有兴趣扩展此示例,则将其留作练习。
下面是带有标签和一个热编码输入变量和标签编码输出变量的完整示例。
注意:您的结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
运行这个例子,我们得到以下输出。
我们再次可以看到 XGBoost 框架自动选择了 ' binary:logistic ' 目标,这是这个二元分类问题的正确目标。
支持缺失数据
XGBoost 可以自动学习如何最好地处理丢失的数据。
事实上,XGBoost 旨在处理稀疏数据,就像上一节中的一个热编码数据一样,通过最小化损失函数,处理缺失数据的方式与处理稀疏或零值的方式相同。
有关如何在 XGBoost 中处理缺失值的技术细节的更多信息,请参阅论文XGBoost:A Scalable Tree Boosting System 中的第 3.4 节“稀疏感知拆分查找” 。
Horse Colic 数据集是展示这种能力的一个很好的例子,因为它包含很大比例的缺失数据,大约 30%。
下载数据集并将其放置在您当前的工作目录中,文件名为“ horse-colic.csv ”。
马绞痛数据集
马绞痛数据集描述
以下是原始数据集的示例。
这些值由空格分隔,我们可以使用 Pandas 函数read_csv轻松加载它。
加载后,我们可以看到缺失的数据用问号字符 ('?') 标记。我们可以将这些缺失值更改为 XGBoost 期望的稀疏值,即值零 (0)。
因为缺失数据被标记为字符串,所以那些缺失数据的列都被加载为字符串数据类型。我们现在可以将整个输入数据集转换为数值。
最后,尽管类值用整数 1 和 2 标记,但这是一个二元分类问题。我们在 XGBoost 中将二元分类问题建模为逻辑 0 和 1 值。我们可以使用 LabelEncoder 轻松地将 Y 数据集转换为 0 和 1 整数,就像我们在鸢尾花示例中所做的那样。
为了完整起见,下面提供了完整的代码清单。
注意:您的结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
运行此示例会产生以下输出。
我们可以通过将缺失值标记为非零值(例如 1)来梳理 XGBoost 自动处理缺失值的效果。
注意:您的结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
重新运行示例表明模型的准确度下降。
我们也可以用一个特定的值来估算缺失的数据。
通常对列使用平均值或中位数。我们可以使用 scikit-learn SimpleImputer 类轻松估算缺失的数据。
下面是完整示例,其中缺失数据使用每列的平均值进行插补。
注意:计算机运行结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑多次运行该示例并比较平均结果。
运行此示例,我们看到的结果相当于将值固定为一 (1)。这表明,至少在这种情况下,我们最好用零 (0) 的不同值而不是有效值 (1) 或估算值标记缺失值。
当您有缺失值时,对您的数据尝试这两种方法(自动处理和插补)是一个很好的教训。
概括
在这篇博文中,您了解了如何使用 Python 中的 XGBoost 准备用于梯度提升的机器学习数据。
具体来说,你学到了:
如何使用标签编码为二进制分类准备字符串类值。
如何使用单热编码准备分类输入变量以将它们建模为二进制变量。
XGBoost 如何自动处理缺失数据以及如何标记和估算缺失值。
Python 用 XGBoost 进行梯度提升的数据准备就为大家介绍到这里了,欢迎各位同学报名<python数据分析和机器学习项目实战>微专业课,学习更多相关知识
