【问题标题】:scikit-learn GridSearchCV does not work properly with random forestscikit-learn GridSearchCV 不能在随机森林中正常工作
【发布时间】:2018-10-15 05:55:33
【问题描述】:

我有一个随机森林模型的网格搜索实现。

train_X, test_X, train_y, test_y = train_test_split(features, target, test_size=.10, random_state=0)
# A bit performance gains can be obtained from standarization
train_X, test_X = standarize(train_X, test_X)

tuned_parameters = [{
    'n_estimators': [5],
    'criterion': ['mse', 'mae'],
    'random_state': [0]
}]

scores = ['neg_mean_squared_error', 'neg_mean_absolute_error']
for n_fold in [5]:
    for score in scores:
        print("# Tuning hyper-parameters for %s with %d-fold" % (score, n_fold))
        start_time = time.time()
        print()

        # TODO: RandomForestRegressor
        clf = GridSearchCV(RandomForestRegressor(verbose=2), tuned_parameters, cv=n_fold,
                           scoring=score, verbose=2, n_jobs=-1)
        clf.fit(train_X, train_y)
        ... Rest omitted

在我将它用于此网格搜索之前,我已将完全相同的数据集用于许多其他任务,因此数据应该没有任何问题。另外,为了测试的目的,我先用LinearRegression来看看整个流水线是否顺利,它工作。然后我切换到 RandomForestRegressor 并设置非常少量的估计器来再次测试它。他们发生了一件非常奇怪的事情,我将附上详细信息。性能有非常显着的下降,我不知道发生了什么。没有理由花费 30 分钟以上的时间来运行一次小型网格搜索。

Fitting 5 folds for each of 2 candidates, totalling 10 fits
[CV] criterion=mse, n_estimators=5, random_state=0 ...................
building tree 1 of 5
[CV] criterion=mse, n_estimators=5, random_state=0 ...................
building tree 1 of 5
[CV] criterion=mse, n_estimators=5, random_state=0 ...................
building tree 1 of 5
[CV] criterion=mse, n_estimators=5, random_state=0 ...................
building tree 1 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    1.0s remaining:    0.0s
building tree 2 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    1.0s remaining:    0.0s
building tree 2 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    1.1s remaining:    0.0s
building tree 2 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    1.1s remaining:    0.0s
building tree 2 of 5
building tree 3 of 5
building tree 3 of 5
building tree 3 of 5
building tree 3 of 5
building tree 4 of 5
building tree 4 of 5
building tree 4 of 5
building tree 4 of 5
building tree 5 of 5
building tree 5 of 5
building tree 5 of 5
building tree 5 of 5
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    5.0s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    5.0s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    5.0s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.2s finished
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    5.0s finished
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.3s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.3s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.2s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.8s finished
[CV] .... criterion=mse, n_estimators=5, random_state=0, total=   5.3s
[CV] criterion=mse, n_estimators=5, random_state=0 ...................
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.8s finished
[CV] .... criterion=mse, n_estimators=5, random_state=0, total=   5.3s
building tree 1 of 5
[CV] criterion=mae, n_estimators=5, random_state=0 ...................
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.9s finished
[CV] .... criterion=mse, n_estimators=5, random_state=0, total=   5.3s
building tree 1 of 5
[CV] criterion=mae, n_estimators=5, random_state=0 ...................
building tree 1 of 5
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.9s finished
[CV] .... criterion=mse, n_estimators=5, random_state=0, total=   5.3s
[CV] criterion=mae, n_estimators=5, random_state=0 ...................
building tree 1 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    1.0s remaining:    0.0s
building tree 2 of 5
building tree 3 of 5
building tree 4 of 5
building tree 5 of 5
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    5.3s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.2s finished
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s
[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    0.5s finished
[CV] .... criterion=mse, n_estimators=5, random_state=0, total=   5.6s
[CV] criterion=mae, n_estimators=5, random_state=0 ...................
building tree 1 of 5

上面的日志在几秒钟内打印出来,然后事情似乎卡在了这里……

[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:  7.4min remaining:    0.0s
building tree 2 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:  7.5min remaining:    0.0s
building tree 2 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:  7.5min remaining:    0.0s
building tree 2 of 5
[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:  7.8min remaining:    0.0s
building tree 2 of 5
building tree 3 of 5
building tree 3 of 5
building tree 3 of 5
building tree 3 of 5
building tree 4 of 5
building tree 4 of 5
building tree 4 of 5
building tree 4 of 5
building tree 5 of 5
building tree 5 of 5
building tree 5 of 5

这些线路的花费超过 20 分钟。

顺便说一句,对于每个 GridSearchCV 运行,线性回归花费不到 1 秒。

你知道为什么性能下降这么多吗?

感谢任何建议和评论。谢谢。

【问题讨论】:

  • 请先尝试n_jobs = -1,而不是n_jobs =1
  • @VivekKumar 实际上这是我的第一次尝试,没有成功...

标签: machine-learning scikit-learn random-forest grid-search


【解决方案1】:

尝试为 RandomForestRegressor 设置 max_depth。这应该会减少拟合时间。默认max_depth=None

例如:

tuned_parameters = [{
    'n_estimators': [5],
    'criterion': ['mse', 'mae'],
    'random_state': [0],
    'max_depth': [4],
}]

编辑:另外,默认情况下RandomForestRegressor 具有n_jobs=1。它将使用此设置一次构建一棵树。尝试设置n_jobs=-1

此外,您可以指定多个指标,而不是将scoring 参数循环到GridSearchCV。这样做时,您还必须指定要在GridSearchCV 上选择的指标作为refit 的值。然后,您可以在拟合后访问cv_results_ 字典中的所有分数。

    clf = GridSearchCV(RandomForestRegressor(verbose=2),tuned_parameters, 
                       cv=n_fold, scoring=scores, refit='neg_mean_squared_error',
                       verbose=2, n_jobs=-1)

    clf.fit(train_X, train_y)
    results = clf.cv_results_
    print(np.mean(results['mean_test_neg_mean_squared_error']))
    print(np.mean(results['mean_test_neg_mean_absolute_error']))

http://scikit-learn.org/stable/auto_examples/model_selection/plot_multi_metric_evaluation.html#sphx-glr-auto-examples-model-selection-plot-multi-metric-evaluation-py

【讨论】:

  • 我试一试,怎么前几棵树建得这么快,后面几棵就搞砸了……
猜你喜欢
  • 2015-03-28
  • 2016-05-11
  • 2013-04-26
  • 2015-09-16
  • 2016-06-22
  • 2017-03-26
  • 2015-02-20
  • 2015-04-13
  • 2015-08-28
相关资源
最近更新 更多