基于XGBoost和随机森林的模型评估与选择的方法思路

本文通过在鸢尾花卉数据集上应用XGBoost和随机森林算法,并使用交叉验证和均方误差评估模型,最终选择了XGBoost作为最优模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在现实任务中,面对繁花似锦的机器学习算法可供选择。为了使模型的泛化能力更好,在数据预处理以及特征工程完毕后,应该通过对比分析选择一种最优的算法模型作为最终的选择。具体的思路是,首先列举几种想到的常规使用且效果较好的算法,然后分别在训练集以及测试集上使用不同的评估指标进行评估,最终确定效果最好的算法模型。本文用鸢尾花卉数据集,以XGBoost和随机森林两个算法为例,进行评估选择,具体步骤如下所示。

#导入所需要的库
import numpy as np
import xgboost as xgb
from sklearn.ensemble import RandomForestClassifier as rf
from sklearn.model_selection import  KFold, train_test_split
from sklearn.metrics import confusion_matrix, mean_squared_error
from sklearn.datasets import load_iris

#实例化数据集
iris = load_iris()
y = iris['target']
x = iris['data']

#训练集测试集划分
train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=1)

#实例化k折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=1)

#使用xgboost在训练集上做交叉验证
xgb_model_list = []
xgb_mse_list = []
for train_index, test_index in kf.split(train_X):
    xgb_model = xgb.XGBClassifier().fit(train_X[train_index], train_y[train_index])
    xgb_model_list.append(xgb_model)
    predictions = xgb_model.predict(train_X[test_index])
    actuals = train_y[test_index]
    print(confusion_matrix(actuals, predictions))
    mse = mean_squared_error(actuals, predictions)
    xgb_mse_list.append(mse)
print('xgb_mse_list:{}'.format(xgb_mse_list))
print('xgb mse均值为:{}'.format(np.mean(xgb_mse_list)))
    

输出结果如下:

xgb_mse_list:[0.0, 0.08333333333333333, 0.041666666666666664, 0.0, 0.08333333333333333]
xgb mse均值为:0.041666666666666664
#使用随机森林在训练集上做交叉验证
rf_model_list = []
rf_mse_list = []
for train_index, test_index in kf.split(train_X):
    rf_model = rf(n_estimators=10, max_depth=10, random_state=10).fit(train_X[train_index],train_y[train_index])
    rf_model_list.append(rf_model)
    predictions = rf_model.predict(train_X[test_index])
    actuals = train_y[test_index]
    mse = mean_squared_error(actuals,predictions)
    rf_mse_list.append(mse)
print('rf_mse_list:{}'.format(rf_mse_list))
print('rf mse均值为:{}'.format(np.mean(rf_mse_list)))

输出结果如下:

rf_mse_list:[0.08333333333333333, 0.041666666666666664, 0.08333333333333333, 0.041666666666666664, 0.08333333333333333]
rf mse均值为:0.06666666666666667
#模型评估与选择
if np.mean(rf_mse_list) <= np.mean(xgb_mse_list):
    min_mse = min(rf_mse_list)
    ind = rf_mse_list.index(mse)
    best_estimators = rf_model_list[ind]
    print('best estimator is random forest {}, mse is {}'.format(ind,min_mse))
else:
    min_mse = min(xgb_mse_list)
    ind = xgb_mse_list.index(min_mse)
    best_estimators = xgb_model_list[ind]
    print('best estimators is xgboost {}, mse is {}'.format(ind,min_mse))

输出结果如下:

best estimators is xgboost 0, mse is 0.0
#使用最好的模型和参数预测测试集,估计模型在实际使用时的判别能力
pred = best_estimators.predict(test_X)
mse = mean_squared_error(pred, test_y)
print('test data mse is {}'.format(mse))
print(confusion_matrix(test_y,pred))

输出结果如下:

test data mse is 0.03333333333333333
[[11  0  0]
 [ 0 12  1]
 [ 0  0  6]]

上过以上方法和步骤,最终选择了XGBoost算法模型作为最优模型。

### XGBoost 随机森林的区别、优缺点及应用场景 #### 特点对比 XGBoost 随机森林均属于集成学习算法,但其核心机制有所不同。随机森林基于袋装法(Bagging),通过构建多棵独立的决策树并综合预测结果来降低方差;而 XGBoost 则是一种梯度提升框架(Gradient Boosting Framework),利用前向分步加法模型逐步优化目标函数。 - **随机森林的核心特点** 随机森林通过对数据集进行有放回采样生成多个子样本,并在每棵树的分裂节点处仅考察部分特征以增加多样性[^5]。这种方法有效降低了单颗决策树可能带来的高方差问题,从而提升了泛化能力。 - **XGBoost 的核心特点** XGBoost 基于梯度提升的思想,在每次迭代中新增一棵树以修正之前模型的残差误差。相比传统的 GBDT 方法XGBoost 引入了二阶导数信息以及正则化项,使得模型更加鲁棒且不易过拟合[^4]。此外,XGBoost 还支持列抽样行抽样策略进一步增强抗噪性能[^2]。 --- #### 优点分析 - **随机森林的优势** - 训练过程简单快速,无需精细调参即可获得较好的效果。 - 对噪声具有较强的容忍性,适合处理含有异常值的数据集。 - 能够评估各个输入变量的重要性,便于解释模型行为。 - **XGBoost 的优势** - 支持自定义目标函数评价指标,灵活性更高[^3]。 - 提供内置交叉验证功能,有助于高效寻找最佳超参数组合。 - 结合硬件资源充分利用多线程运算加速整个流程执行效率。 --- #### 缺点剖析 - **随机森林的局限性** - 当面对高度不平衡类别分布或者复杂模式识别任务时,表现往往不如其他高级方法优越。 - 如果原始属性之间存在强关联关系,则可能导致某些重要维度被忽略掉。 - **XGBoost 的不足之处** - 参数调节较为繁琐耗时较长,尤其对于初学者而言可能存在一定门槛。 - 在极端稀疏矩阵条件下可能会遇到内存溢出风险。 --- #### 应用场景探讨 - **推荐使用随机森林的情况** - 数据规模适中且结构清晰明了的情况下可以优先选用该算法完成初步探索工作; - 用户希望得到易于理解的结果反馈以便后续业务解读操作时也可考虑此选项。 - **更适合部署 XGBoost 场景** - 大型竞赛项目或工业级生产环境中追求极致精度需求下应倾向于采纳本方案; - 存在较多缺失值需填补预处理阶段难以完全消除影响因素时亦可发挥更大作用。 ```python import xgboost as xgb from sklearn.ensemble import RandomForestClassifier # 示例代码展示如何初始化两个模型对象 rf_model = RandomForestClassifier(n_estimators=100, random_state=42) xgb_model = xgb.XGBClassifier(objective="binary:logistic", n_estimators=100, seed=42) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值