XGBoost因其在众多Kaggle竞赛中表现出的卓越性能而广受认可,成为处理复杂机器学习挑战的首选。该强大的算法以其在处理大型数据集方面的效率而闻名,并以其实用性和有效性脱颖而出。
在本文中,我们将把XGBoost应用于Ames Housing数据集,以展示其独特的功能。在我们之前讨论梯度提升回归器(GBR)的基础上,我们将探讨XGBoost与GBR的关键区别,包括其处理缺失值和分类数据的先进方法。
通过我的书《进阶数据科学》启动您的项目。它提供了带有可运行代码的自学教程。
让我们开始吧。

使用 XGBoost 应对缺失数据挑战
照片由Chris Linnett拍摄。部分权利保留。
概述
本文分为四个部分;它们是:
- XGBoost简介与初始设置
- 演示XGBoost的缺失值原生处理
- 演示XGBoost的分类数据原生处理
- 使用RFECV优化XGBoost以进行特征选择
XGBoost简介与初始设置
XGBoost,即eXtreme Gradient Boosting,是梯度提升算法的一个优化且高效的开源实现。它是一个流行的机器学习库,专为速度、性能和可扩展性而设计。
与您可能从scikit-learn
库中熟悉的许多机器学习工具不同,XGBoost是独立运行的。要安装XGBoost,您需要在系统上安装Python。一旦准备就绪,您就可以使用Python的包安装程序pip来安装XGBoost。打开您的命令行或终端,然后输入以下命令:
1 |
pip install xgboost |
此命令将下载并安装XGBoost包及其依赖项。
虽然XGBoost和梯度提升回归器(GBR)都基于梯度提升,但它们之间存在关键差异,使XGBoost脱颖而出:
- 处理缺失值:XGBoost在处理缺失值方面有先进的方法。默认情况下,XGBoost在训练期间智能地学习处理缺失值的最佳方向,而GBR要求在拟合模型之前对所有缺失值进行外部处理。
- 原生支持分类特征:与
scikit-learn
中的梯度提升回归器不同,后者要求将分类变量预处理为数值格式;XGBoost可以直接处理分类特征。 - 包含正则化:XGBoost的独特功能之一是其内置的正则化组件。与GBR不同,XGBoost同时应用L1和L2正则化,这有助于减少过拟合并提高模型性能,尤其是在复杂数据集上。
此初步列表突出了XGBoost相较于传统梯度提升回归器的一些关键优势。需要注意的是,这些点并非详尽无遗,而是旨在让您了解在选择机器学习项目算法时应考虑的一些重要区别。
想开始学习进阶数据科学吗?
立即参加我的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
演示XGBoost的缺失值原生处理
在机器学习中,我们处理缺失值的方式会显著影响模型的性能。传统上,在将数据输入大多数算法之前,会使用诸如插补(用列的均值、中位数或众数填充缺失值)之类的技术。然而,XGBoost通过在模型训练过程中原生处理缺失值提供了一个引人注目的替代方案。此功能不仅简化了预处理流程,还可以通过利用XGBoost的内置功能来构建更健壮的模型。
以下代码片段演示了如何在没有初步插补的情况下,将XGBoost用于包含缺失值的数据集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 导入XGBoost以演示缺失值的原生处理 import pandas as pd import xgboost as xgb from sklearn.model_selection import cross_val_score # 加载数据集 Ames = pd.read_csv('Ames.csv') # 选择包含缺失值的数值特征 cols_with_missing = Ames.isnull().any() X = Ames.loc[:, cols_with_missing].select_dtypes(include=['int', 'float']) y = Ames['SalePrice'] # 检查并打印缺失值的总数 total_missing_values = X.isna().sum().sum() print(f"缺失值的总数:{total_missing_values}") # 使用默认设置初始化XGBoost回归器,强调随机种子以确保可复现性 xgb_model = xgb.XGBRegressor(seed=42) # 执行 5 折交叉验证 scores = cross_val_score(xgb_model, X, y, cv=5, scoring='r2') # 计算并显示平均R-squared得分 mean_r2 = scores.mean() print(f"XGB原生插补,平均R²得分:{mean_r2:.4f}") |
此代码块应输出:
1 2 |
缺失值的总数:829 XGB原生插补,平均R²得分:0.7547 |
在上例中,XGBoost直接应用于具有缺失值的数值列。值得注意的是,在训练模型之前没有进行任何插补或删除这些缺失值的步骤。此功能在现实场景中非常有用,因为数据通常包含缺失值,而手动插补可能会引入偏差或不必要的噪声。
XGBoost处理缺失值的方法不仅简化了数据准备过程,还增强了模型处理真实、混乱数据的能力。此功能以及其他功能,使XGBoost成为任何数据科学家工具箱中的强大工具,尤其是在处理大型数据集或信息不完整的数据集时。
演示XGBoost的分类数据原生处理
有效处理分类数据在机器学习中至关重要,因为它们通常包含可以显著影响模型预测的有价值信息。传统模型在训练前需要将分类数据转换为数字格式,例如独热编码。这可能导致高维特征空间,尤其是在具有许多级别的特征中。然而,当XGBoost在pandas中转换为category
数据类型时,它可以直接处理分类变量。这可以带来性能提升和更有效的内存使用。
我们可以从选择一些分类特征开始。例如,考虑“Neighborhood”、“BldgType”和“HouseStyle”等特征。选择这些特征是基于它们对目标变量(在本例中是房价)的潜在影响。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# 演示分类特征的原生处理 import pandas as pd import xgboost as xgb from sklearn.model_selection import cross_val_score # 加载数据集 Ames = pd.read_csv('Ames.csv') # 将指定的分类特征转换为“category”类型 for col in ['Neighborhood', 'BldgType', 'HouseStyle']: Ames[col] = Ames[col].astype('category') # 包含一些数值特征以获得均衡的模型 selected_features = ['OverallQual', 'GrLivArea', 'YearBuilt', 'TotalBsmtSF', '1stFlrSF', 'Neighborhood', 'BldgType', 'HouseStyle'] X = Ames[selected_features] y = Ames['SalePrice'] # 使用原生分类数据处理功能初始化XGBoost回归器 xgb_model = xgb.XGBRegressor( seed=42, enable_categorical=True ) # 执行 5 折交叉验证 scores = cross_val_score(xgb_model, X, y, cv=5, scoring='r2') # 计算平均R-squared得分 mean_r2 = scores.mean() print(f"使用选定的分类特征的平均模型R²得分:{mean_r2:.4f}") |
在此设置中,我们在XGBoost的配置中启用了enable_categorical=True
选项。此设置至关重要,因为它指示XGBoost以其原生形式处理标记为“category”的特征,并利用其内部优化来处理分类数据。我们的模型结果如下所示:
1 |
使用 选定 分类 特征的 平均 模型R² 得分: 0.8543 |
该得分反映了中等性能,同时直接处理分类特征,无需进行独热编码等其他预处理步骤。它展示了XGBoost在管理混合数据类型方面的效率,并强调了启用原生支持如何简化建模过程并提高预测准确性。
专注于一组精选的特征可以简化建模流程,并充分利用XGBoost的内置功能,可能带来更具可解释性和更鲁棒的模型。
使用RFECV优化XGBoost以进行特征选择
特征选择对于构建高效且可解释的机器学习模型至关重要。递归特征消除与交叉验证(RFECV)通过迭代地移除不太重要的特征并通过交叉验证验证剩余的特征集来简化模型。此过程不仅简化了模型,还可能通过专注于信息量最大的属性来增强其性能。
虽然XGBoost在构建模型时可以原生处理分类特征,但此功能在RFECV等特征选择方法的上下文中不直接支持,因为RFECV依赖于需要数值输入的运算(例如,按重要性对特征进行排名)。因此,为了有效地将RFECV与XGBoost一起使用,我们使用Pandas的.cat.codes
方法将分类特征转换为数字代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 对XGB执行交叉验证的递归特征消除 import pandas as pd import xgboost as xgb from sklearn.feature_selection import RFECV from sklearn.model_selection import cross_val_score # 加载数据集 Ames = pd.read_csv('Ames.csv') # 将选定的特征转换为“object”类型以将其视为分类数据 for col in ['MSSubClass', 'YrSold', 'MoSold']: Ames[col] = Ames[col].astype('object') # 将所有object类型特征转换为类别,然后转换为代码 categorical_features = Ames.select_dtypes(include=['object']).columns for col in categorical_features: Ames[col] = Ames[col].astype('category').cat.codes # 选择特征和目标 X = Ames.drop(columns=['SalePrice', 'PID']) y = Ames['SalePrice'] # 初始化XGBoost回归器 xgb_model = xgb.XGBRegressor(seed=42, enable_categorical=True) # 初始化RFECV rfecv = RFECV(estimator=xgb_model, step=1, cv=5, scoring='r2', min_features_to_select=1) # 拟合RFECV rfecv.fit(X, y) # 打印最佳特征数量及其名称 print("最佳特征数量:", rfecv.n_features_) print("最佳特征:", X.columns[rfecv.support_]) |
该脚本识别出36个最佳特征,显示了它们在预测房价中的相关性。
1 2 3 4 5 6 7 8 9 10 |
最佳特征数量: 36 最佳特征: Index(['GrLivArea', 'MSZoning', 'LotArea', 'Neighborhood', 'Condition1', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd', 'MasVnrArea', 'ExterQual', 'BsmtQual', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1', 'TotalBsmtSF', 'HeatingQC', 'CentralAir', '1stFlrSF', '2ndFlrSF', 'BsmtFullBath', 'KitchenQual', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageCars', 'GarageArea', 'GarageCond', 'WoodDeckSF', 'ScreenPorch', 'MoSold', 'SaleType', 'SaleCondition', 'GeoRefNo', 'Latitude', 'Longitude'], dtype='object') |
在识别出最佳特征后,评估它们在不同数据子集上的表现至关重要。
1 2 3 4 5 6 7 8 9 |
# 在前面的代码块基础上继续 # 使用选定的特征对最终模型进行交叉验证 final_model = xgb.XGBRegressor(seed=42, enable_categorical=True) cv_scores = cross_val_score(final_model, X.iloc[:, rfecv.support_], y, cv=5, scoring='r2') # 计算平均R-squared得分 mean_r2 = cv_scores.mean() print(f"使用剩余特征的平均交叉验证R²得分:{mean_r2:.4f}") |
平均R²得分为0.8980,表明模型具有高效率,突显了所选特征的重要性。
1 |
使用剩余特征的平均交叉验证R²得分:0.8980 |
这种使用RFECV结合XGBoost的特征选择方法,特别是通过.cat.codes
正确处理分类数据,优化了模型的预测性能。优化特征空间提高了模型的解释性和操作效率,证明了它在复杂的预测任务中是一种宝贵的策略。
进一步阅读
API
教程
Ames 住房数据集和数据字典
总结
在本文中,我们介绍了XGBoost的一些重要功能。从安装到实际应用,我们探讨了XGBoost如何原生处理各种数据挑战,如缺失值和分类数据,从而显著简化了数据准备过程。此外,我们还演示了如何使用RFECV(递归特征消除与交叉验证)优化XGBoost,这是一种鲁棒的特征选择方法,可提高模型的简洁性和预测性能。
具体来说,你学到了:
- XGBoost的原生缺失值处理:您亲眼目睹了XGBoost如何在无需初步插补的情况下处理包含缺失项的数据集,从而实现了更简单、可能更准确的建模过程。
- XGBoost的有效分类数据管理:与需要编码的传统模型不同,XGBoost在正确格式化后可以直接处理分类变量,从而带来性能提升和更好的内存管理。
- 通过RFECV增强XGBoost以进行最优特征选择:我们逐步演示了如何将RFECV应用于XGBoost,展示了如何识别和保留最具影响力的特征,从而提高模型的效率和可解释性。
您有任何问题吗?请在下面的评论中提出您的问题,我将尽力回答。
暂无评论。