如何计算最优的 max_depth 来训练具有大量特征的 ML 模型?

Posted

技术标签:

【中文标题】如何计算最优的 max_depth 来训练具有大量特征的 ML 模型?【英文标题】:How to calc the optimal max_depht to train a ML model with a huge number of features? 【发布时间】:2017-08-13 17:33:22 【问题描述】:

我的数据框中每天有 N 个特征,可以追溯到 20 天(时间序列):我有大约 400 个特征 x 100k 行。

我正在尝试识别最重要的特征,因此我通过这种方式训练了我的 XGBoost 模型:

model = xgb.XGBRegressor(learning_rate=0.01, n_estimators=1000, max_depth=20)

eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, eval_metric="rmse", eval_set=eval_set, verbose=True, early_stopping_rounds=20)

然后:

def plot_fimportance(xgbmodel, df_x, top_n=30):
    features = df_x.columns.values
    mapFeat = dict(zip(["f"+str(i) for i in range(len(features))],features))
    ts = pd.Series(xgbmodel.booster().get_fscore())
    ts.index = ts.reset_index()['index'].map(mapFeat)
    ts.order()[-top_n:].plot(kind="barh", x = 'Feature', figsize = (8, top_n-10), title=("feature importance"))

plot_fimportance(model, df.drop(['label']))

我听说参数 max_depth 应该这样计算:

max_depth = 特征数 / 3

我认为这可能适用于小型数据集,但如果我使用 max_depth=133 训练我的模型,我的电脑可能会爆炸,而且我可能也会过拟合。

我怎么能用这么多的特征计算 max_depth 的最佳值?

【问题讨论】:

【参考方案1】:

那个方程没有给你最佳深度;这只是一种启发式。如果您想要最佳深度,那么您必须凭经验找到它:找到一个功能起点并在每个方向上变化。应用梯度下降来接近最佳答案。

如果您想要的只是在您的机器上运行的最大限制,您可以繁琐地计算存储需求并找到最大值。为了平衡这一点和过度拟合……你需要做出权衡,但你仍然被实验所困。

【讨论】:

您能解释一下或举一个应用梯度下降的例子吗?谢谢! :) 这就进入了“教程”的领域,这超出了 Stack Overflow 的目的范围。在这种情况下,可以将其视为寻找方程解的 Newton-Raphson 方法。非常简单,您可以通过几个深度选择来运行它。看看哪一个最适合你。调整深度并再次运行。重复这个过程,适当调整以找到最佳点,直到你足够接近可以宣布你完成了。 那么,您如何通常检测过拟合?这里没有区别。 一般来说,是的。深入可以促进过拟合;实际上,任何改善训练过程的东西都可能导致过度拟合。根本原因是您的训练数据如何忠实地代表所有可用输入的集合。如果您在覆盖范围内存在差距,那么艰苦的训练将适应这些差距,而生成的模型将无法很好地处理来自这些差距的输入。 总之,先担心max_depth;将过拟合留到以后。

以上是关于如何计算最优的 max_depth 来训练具有大量特征的 ML 模型?的主要内容,如果未能解决你的问题,请参考以下文章

otto案例介绍 -- Otto Group Product Classification Challengexgboost实现

机器学习:梯度下降

学界 | 最大规模数据集最优图像识别准确率!Facebook利用hashtag解决训练数据难题

RandomForest,如何选择最优的 n_estimator 参数

SVM支持向量机,训练与分类的实现(有标签)

阿里云万郁香:多样付费选择构筑成本最优的弹性体验