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

时间:2017-11-13 22:22:26

标签: python-2.7 random-forest h2o

我对数据科学有一定的经验。我有一个包含9500个观测值的数据集和超过4500个特征,其中大部分都是高度相关的。这里简要介绍了我尝试过的内容:我已经删除了少于6000个非NA的列,并将NAs与其相应的列进行了归纳。当至少有6000个非NA时的中值。至于相关性,我只保留了与其他特征具有至多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 个答案:

答案 0 :(得分:3)

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

对时间序列数据集执行k次交叉验证将为您提供过于乐观的性能指标,因为您不尊重数据中的时间序列组件。定期k折叠交叉验证将从您的整个数据集中随机抽样以创建一个列车和一个列车。验证集。从本质上讲,您的验证策略是“欺骗”&#34;因为你有&#34; future&#34;您的简历培训集中包含的数据(如果有意义的话)。

我可以通过你的代码看到你明白你需要训练过去&#34;过去&#34;数据和预测&#34; future&#34;数据,但如果您想了解有关此主题的更多信息,请推荐此article或此article

一种解决方案是简单地将测试集性能视为评估模型的方法。另一个选择是使用名为&#34; rolling&#34;或&#34;时间序列&#34;交叉验证,但H2O目前不支持(虽然它似乎很快就会加入)。如果您想跟踪进度,请ticket为此。