代码之家  ›  专栏  ›  技术社区  ›  mlee_jordan

尽管交叉验证结果非常成功,但与随机林过度拟合

  •  1
  • mlee_jordan  · 技术社区  · 7 年前

    我在数据科学方面有一定的经验。我有一个包含9500个观察值和4500多个特征的数据集,其中大多数特征高度相关。以下是我所做的简单尝试:我删除了非NAs少于6000个的列,并在至少有6000个非NAs的情况下用相应列的中值插补NAs。至于相关性,我只保留了与其他特征最多0.7相关性的特征。通过这样做,我将功能的数量减少到了750个左右。然后,我在随机森林的二元分类任务中使用了这些特征。

    我的数据集高度不平衡,其中(0:1)的比率为(10:1)。因此,当我应用10倍cv的RF时,我在每个cv中观察到了太好的结果(AUC为99%),这很好,很可能是真的,在我的测试集中,我得到了更差的结果,例如0.7。这是我的代码:

    import h2o
    from h2o.estimators import H2ORandomForestEstimator
    
    h2o.init(port=23, nthreads=4)
    
    train = fs_rf[fs_rf['Year'] <= '201705']
    test = fs_rf[fs_rf['Year'] > '201705']
    train = train.drop('Year',axis=1)
    test = test.drop('Year',axis=1)
    test.head()
    
    train = h2o.H2OFrame(train)
    train['BestWorst2'] = train['BestWorst2'].asfactor()
    
    test = h2o.H2OFrame(test)
    test['BestWorst2'] = test['BestWorst2'].asfactor()
    
    training_columns = train.drop('BestWorst2',axis=1).col_names
    response_column = 'BestWorst2'
    
    model = H2ORandomForestEstimator(ntrees=100, max_depth=20, nfolds=10, balance_classes=True)
    
    model.train(x=training_columns, y=response_column, training_frame=train)
    
    performance = model.model_performance(test_data=test)
    
    print(performance)
    

    我怎样才能避免这种过度搭配呢?我在网格搜索中尝试了许多不同的参数,但都没有改善结果。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Erin LeDell    7 年前

    这不是我所说的“过度拟合”。与测试指标相比,您看到非常好的交叉验证指标的原因是您有时间序列数据,因此您无法使用k倍交叉验证来准确估计性能。

    在时间序列数据集上执行k倍交叉验证将为您提供过于乐观的性能指标,因为您不尊重数据中的时间序列组件。常规k-fold交叉验证将从整个数据集中随机采样,以创建一个训练集;验证集。本质上,你的验证策略是“作弊”,因为你的简历训练集中包含了“未来”数据(如果有意义的话)。

    我可以从您的代码中看出,您理解需要使用“过去”数据进行训练,并预测“未来”数据,但如果您想阅读更多有关此主题的内容,我建议您使用以下内容 article 或者这个 article .

    一种解决方案是简单地将测试集性能视为评估模型的方法。另一种选择是使用所谓的“滚动”或“时间序列”交叉验证,但H2O目前不支持这一点(尽管看起来可能很快就会添加)。这是一个 ticket