趋近智
这个实践应用演示了如何使用系统调整方法来优化用于回归任务的XGBoost模型。它首先使用默认模型建立基准性能。然后,使用RandomizedSearchCV高效地探索各种超参数 (parameter) (hyperparameter)值。最后,评估调整后的模型以衡量其改进程度。
我们的目标是提高模型在加州住房数据集上的预测准确性。这是一个典型的回归问题,其目的是预测加州各区域的房屋中位数价格。
首先,导入所需的库并加载数据集。我们将使用XGBoost作为模型,并使用Scikit-Learn进行数据处理和调整工具。
import pandas as pd
import numpy as np
import xgboost as xgb
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.metrics import mean_squared_error
# 加载数据集
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target)
# 创建训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("训练数据形状:", X_train.shape)
print("测试数据形状:", X_test.shape)
在开始调整之前,了解我们当前的性能表现是必不可少的。我们将使用默认参数 (parameter)训练一个XGBRegressor模型,并使用均方误差(MSE)评估其在测试集上的性能。较低的MSE表示模型拟合得更好。
# 使用默认参数初始化XGBRegressor
xgb_baseline = xgb.XGBRegressor(objective='reg:squarederror', random_state=42)
# 训练模型
xgb_baseline.fit(X_train, y_train)
# 在测试集上进行预测
y_pred_baseline = xgb_baseline.predict(X_test)
# 计算并打印基准MSE
mse_baseline = mean_squared_error(y_test, y_pred_baseline)
print(f"基准模型MSE: {mse_baseline:.4f}")
这个基准分数是我们希望超越的目标。任何MSE低于此值的模型都表示性能有所提升。
当超参数 (parameter) (hyperparameter)空间很大时,网格搜索的计算成本会很高。RandomizedSearchCV是一种更有效的方法,它从指定的分布中采样固定数量的参数组合。这种方法使我们能够测试各种值,而无需尝试所有可能的组合。
让我们为前面讨论的超参数定义一个搜索空间:
n_estimators:提升轮次数量。learning_rate:步长收缩率。max_depth:树的最大深度。subsample:每棵树随机采样的观测值比例。colsample_bytree:每棵树随机采样的特征(列)比例。gamma:进行进一步划分所需的最小损失减少量。# 定义随机搜索的超参数网格
param_dist = {
'n_estimators': [100, 200, 300, 400, 500],
'learning_rate': [0.01, 0.05, 0.1, 0.2],
'max_depth': [3, 4, 5, 6, 7, 8],
'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],
'colsample_bytree': [0.6, 0.7, 0.8, 0.9, 1.0],
'gamma': [0, 0.1, 0.2, 0.3]
}
# 初始化XGBRegressor
xgb_model = xgb.XGBRegressor(objective='reg:squarederror', random_state=42)
# 初始化RandomizedSearchCV
# n_iter 控制要尝试多少种不同的组合。
# cv 是交叉验证折叠的数量。
# n_jobs=-1 使用所有可用的CPU核心来加快处理速度。
random_search = RandomizedSearchCV(
estimator=xgb_model,
param_distributions=param_dist,
n_iter=50,
scoring='neg_mean_squared_error',
cv=5,
verbose=1,
random_state=42,
n_jobs=-1
)
# 将RandomizedSearchCV拟合到训练数据
random_search.fit(X_train, y_train)
搜索完成后,RandomizedSearchCV会存储它找到的最佳超参数组合。
# 打印找到的最佳参数
print("随机搜索找到的最佳超参数:")
print(random_search.best_params_)
现在,我们使用搜索确定的最佳参数 (parameter)来训练一个新的最终模型。通常的做法是在整个训练数据集上训练此模型,以便它能从最多数据中学习。最后,我们在用于基准测试的相同保留测试集上评估其性能。
# 从搜索结果中获取最佳估计器
best_xgb_model = random_search.best_estimator_
# 在测试集上进行预测
y_pred_tuned = best_xgb_model.predict(X_test)
# 计算并打印调整后模型的MSE
mse_tuned = mean_squared_error(y_test, y_pred_tuned)
print(f"调整后模型MSE: {mse_tuned:.4f}")
print(f"相对于基准的改进: {mse_baseline - mse_tuned:.4f}")
你应该会看到调整后模型的MSE低于基准模型的MSE,这表明我们的超参数 (hyperparameter)调整过程成功提升了模型的预测性能。
一个简单的图表可以直观地展示我们优化工作的影响。让我们比较基准模型和调整后模型的均方误差。
均方误差的减少表明了系统性超参数 (parameter) (hyperparameter)调整的价值。
在此动手练习中,你遵循了一个结构化过程来优化梯度提升模型。你首先建立了性能基准,然后使用RandomizedSearchCV高效地搜寻超参数 (parameter) (hyperparameter)空间,最后通过优化设置训练并评估了最终模型。
这种建立基准、寻找更优参数并评估结果的迭代过程,是应用机器学习 (machine learning)中的一个基本工作流程。虽然我们使用了RandomizedSearchCV,但你还可以利用结果来指导更集中的GridSearchCV,围绕最有前景的参数值进行进一步的细化搜索。
对于更复杂的优化任务,你可以尝试贝叶斯优化等高级技术,它通常能以更少的迭代次数找到更好的超参数。像Hyperopt和Optuna这样的库提供了实现这些高级策略的强大工具。
这部分内容有帮助吗?
RandomizedSearchCV的官方文档,提供了在scikit-learn框架内进行高效超参数调优的详细用法、参数和示例。RandomizedSearchCV等技术。© 2026 ApX Machine Learning用心打造