ScikitLearn - RandomForestRegressor 在网格搜索内外得分不同

数据挖掘 机器学习 Python scikit-学习 随机森林 网格搜索
2022-02-17 16:15:32

我正在使用RandomForestRegressorscikit-learnpython包)。我正在寻找超参数的最佳值,n_estimators并将min_samples_split我的回归器拟合到火车数据集 ( X_train, y_train) 上:

  param_grid = { 'n_estimators' : range( 10 , 201 ) ,
                 'min_samples_split' : range( 2 , 11 ) }


  rfr = RandomForestRegressor()

  best_score = 0
  best_param = {}

  for param in ParameterGrid( param_grid ):
      rfr.set_params( **g )
      rfr.fit( X_train , y_train )
      score = rfr.score( X_train , y_train )

  if score > best_score :
      best_score = score
      best_param = param

  print( 'best_score : {0}'.format( best_score ) )
  print( 'best_parameters : {0}'.format( best_param ) )

我不是故意使用交叉验证。

最好的超参数在best_param变量中,对应的分数在best_score变量中。

之后,我使用最好的参数设置我的回归器的超参数:

rfr.set_params( **best_param )

我在我的火车数据集上拟合回归器:

rfr.fit( X_train , y_train )

最后只是为了检查我获得了具有最佳超参数的回归器的分数:

rfr.score( X_train , y_train )

分数与网格中计算的分数不同:网格外为 0.806,网格内为 0.963。

我不明白为什么。超参数是最好的,用于计算这些最佳参数的数据集是相同的。有什么提示吗?

2个回答

我找到了问题的答案:RandomForestRegressor()中存在随机性。

使用random_state超参数解决问题:

rfr = RandomForestRegressor( random_state = 123 )

令人惊讶的是从random_state超参数的不同值获得的分数差异。这意味着我最好的超参数n_estimatorsmin_samples_split强烈依赖于random_state超参数。

我想这是我必须处理的事情。

如果没有交叉验证,您将有效地为一组训练数据选择最佳超参数,因此它会过度拟合。但是,由于random_state未设置参数,您基本上每次都使用不同的训练数据样本。

请参阅这个交叉验证的问题:交叉验证之外的超参数调整有多糟糕?也许您应该尝试使用 CV,看看是否仍然会发生这种情况。