Python 2.7 通过非常成功的交叉验证结果过度拟合随机林

Python 2.7 通过非常成功的交叉验证结果过度拟合随机林,python-2.7,random-forest,h2o,Python 2.7,Random Forest,H2o,我在数据科学方面有一定的经验。我有一个数据集,包含9500个观测值和4500多个特征,其中大部分特征高度相关。以下是我所做的简单尝试:我删除了不到6000个非NAs的列,并在至少有6000个非NAs时用相应列的中值插补NAs。至于相关性,我只保留了与其他特征最多0.7相关性的特征。通过这样做,我将功能的数量减少到大约750个。然后,我在随机森林的二元分类任务中使用了这些特征 我的数据集高度不平衡,其中(0:1)的比率为(10:1)。因此,当我应用10倍cv的RF时,我在每个cv中观察到了太好的结

我在数据科学方面有一定的经验。我有一个数据集,包含9500个观测值和4500多个特征,其中大部分特征高度相关。以下是我所做的简单尝试:我删除了不到6000个非NAs的列,并在至少有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)
导入h2o
从h2o.estimators导入h2o.Estimator
h2o.init(端口=23,第n个读数=4)
列车=fs_rf[fs_rf['年]'201705']
列车=列车下降('年',轴=1)
测试=测试下降('年',轴=1)
测试头()
列车=h2o.h2o机架(列车)
列车['BestWorst2']=列车['BestWorst2'].asfactor()
测试=h2o.h2o框架(测试)
测试['BestWorst2']=测试['BestWorst2'].asfactor()
training\u columns=train.drop('BestWorst2',axis=1)。col\u名称
响应_列='BestWorst2'
模型=估算器(ntrees=100,最大深度=20,nfolds=10,平衡等级=真)
模型.列车(x=培训列,y=响应列,培训帧=列车)
性能=模型。模型性能(测试数据=测试)
打印(性能)

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

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

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

我可以从您的代码中看出,您理解您需要使用“过去”数据进行培训,并预测“未来”数据,但如果您想了解更多有关此主题的信息,我建议您使用此或此

一种解决方案是简单地将测试集性能作为评估模型的方法。另一种选择是使用所谓的“滚动”或“时间序列”交叉验证,但H2O目前不支持这一点(尽管它似乎很快就会被添加)。如果你想跟踪进度,这里有一个例子