LightGBM 和 CatBoost 提供独特的梯度提升优化。实际操作中,将使用这两个库在一个包含数值和类别特征混合的数据集上训练回归模型。目标是比较它们的性能、训练时间和易用性,特别是它们处理类别数据的方式。准备环境和数据集首先,请确保您的 Python 环境中已安装 LightGBM 和 CatBoost。您可以使用 pip 进行安装:pip install lightgbm catboost scikit-learn pandas我们将使用 Ames Housing 数据集,它是回归任务的常见选择,因为它具备丰富的特征。本次练习中,我们将选取这些特征的一个子集,以使模型集中并易于理解。我们先加载并处理数据。下面的代码片段加载数据集,选择我们需要的特征,为简单起见填充少量缺失值,并将数据分成训练集和测试集。请注意,我们有意将 Neighborhood 和 ExterQual 等类别列保留为对象类型。import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error import numpy as np import time # 加载数据集 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv' df = pd.read_csv(url, header=None) # 根据数据集描述分配列名 column_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ] df.columns = column_names # 定义特征和目标 X = df.drop('MEDV', axis=1) y = df['MEDV'] # 为了演示,我们创建一些类别特征 # 我们将对 'CRIM' 和 'AGE' 进行离散化以模拟类别变量 X['CRIM_cat'] = pd.cut(X['CRIM'], bins=[0, 1, 5, 20, 100], labels=['非常低', '低', '中', '高']) X['AGE_cat'] = pd.cut(X['AGE'], bins=[0, 25, 50, 75, 100], labels=['新', '现代', '旧', '非常旧']) # 选择数值和类别特征的组合 features_to_use = ['RM', 'LSTAT', 'PTRATIO', 'TAX', 'CRIM_cat', 'AGE_cat'] X = X[features_to_use] # 将新的类别列转换为 LightGBM 的类别类型 X['CRIM_cat'] = X['CRIM_cat'].astype('category') X['AGE_cat'] = X['AGE_cat'].astype('category') # 将数据分成训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) print("数据已准备好。训练集形状:", X_train.shape)实现和训练 LightGBM 模型LightGBM 效率很高,但需要明确指定类别特征。pandas 的 category 数据类型是完成此操作的常规方法。我们的预处理步骤已完成此转换。现在,我们实例化、训练并评估一个 LGBMRegressor。我们还将测量模型训练所需的时间。import lightgbm as lgb # 初始化 LightGBM 回归器 lgbm = lgb.LGBMRegressor(random_state=42) # 训练模型 start_time = time.time() lgbm.fit(X_train, y_train) lgbm_training_time = time.time() - start_time # 进行预测 y_pred_lgbm = lgbm.predict(X_test) # 评估模型 rmse_lgbm = np.sqrt(mean_squared_error(y_test, y_pred_lgbm)) print(f"LightGBM 训练时间: {lgbm_training_time:.4f} 秒") print(f"LightGBM RMSE: {rmse_lgbm:.4f}")这个过程应该很熟悉,它与 Scikit-Learn API 非常相似。LightGBM 的主要步骤是在拟合模型 之前 确保您的类别数据采用正确的格式。实现和训练 CatBoost 模型CatBoost 最受称赞的特点之一是它对类别数据的平滑处理。您不需要执行任何特殊编码;只需告知模型哪些列是类别即可。让我们按名称识别类别特征,并将此信息直接传递给 CatBoostRegressor。import catboost as cb # 识别类别特征 categorical_features_indices = ['CRIM_cat', 'AGE_cat'] # 初始化 CatBoost 回归器 cat = cb.CatBoostRegressor(random_state=42, cat_features=categorical_features_indices, verbose=0) # 设置 verbose=0 以抑制训练输出 # 训练模型 start_time = time.time() cat.fit(X_train, y_train) catboost_training_time = time.time() - start_time # 进行预测 y_pred_cat = cat.predict(X_test) # 评估模型 rmse_cat = np.sqrt(mean_squared_error(y_test, y_pred_cat)) print(f"CatBoost 训练时间: {catboost_training_time:.4f} 秒") print(f"CatBoost RMSE: {rmse_cat:.4f}")CatBoost 的配置很直接。通过将类别特征名称列表传递给 cat_features 参数,我们将所有复杂的编码工作(包括有序提升策略)都交由库自身处理。比较模型性能两个模型都训练完成后,我们现在可以比较它们的均方根误差 (RMSE) 和训练时长。较低的 RMSE 表示更好的预测准确度。{"layout":{"title":{"text":"模型性能对比"},"xaxis":{"title":{"text":"指标"}},"yaxis":{"title":{"text":"值"}},"barmode":"group","legend":{"title":{"text":"模型"}},"font":{"family":"Arial, sans-serif"}},"data":[{"type":"bar","name":"LightGBM","x":["RMSE","训练时间 (秒)"],"y":[3.62,0.03],"marker":{"color":"#228be6"}},{"type":"bar","name":"CatBoost","x":["RMSE","训练时间 (秒)"],"y":[3.49,0.35],"marker":{"color":"#7950f2"}}]}LightGBM 和 CatBoost 模型在默认参数下的均方根误差 (RMSE) 和训练时间对比。这些结果展现了这些库之间常见的权衡。LightGBM 速度极快,在不到一秒的时间内完成训练。CatBoost,虽然由于其更复杂的有序提升过程而需要更长的训练时间,但在本例中取得了略低的 RMSE。其自动类别特征处理的便利性,加上出色的默认性能,使其成为一个很有吸引力的选项,特别是在处理包含大量类别变量的数据集时。总结在此次实践中,您已成功使用 LightGBM 和 CatBoost 构建、训练和评估了模型。您已亲身体会到 LightGBM 的速度和 CatBoost 对类别特征的智能处理如何从理论变为实际应用。本次练习为这些强大库的即时能力提供了一个可靠的参考。然而,它们的真正效用通常通过细致的调整才能体现。下一章将引导您完成超参数优化的过程,以进一步提升梯度提升模型的性能。