不应用所选参数的随机搜索简历

时间:2019-05-16 20:43:32

标签: python machine-learning scikit-learn random-forest cross-validation

希望您能提供帮助

我一直在尝试使用scikit learning中的随机搜索功能调整随机森林模型。

如下所示,我给出了几个最大深度和几个叶子样本的选项。

# Create a based model
model = RandomForestClassifier()

# Instantiate the random search model
best = RandomizedSearchCV(model, {
'bootstrap': [True, False],
'max_depth': [80, 90, 100, 110],
'min_samples_leaf': [3, 4, 5]
}, cv=5, return_train_score=True, iid=True, n_iter = 4)

best.fit(train_features, train_labels.ravel())
print(best.best_score_)
print(best)

但是当我执行此操作时,我得到以下内容,其中每片叶子的最大深度和最小样本设置为不在我的数组中的值。

我在这里做什么错了?

RandomizedSearchCV(cv=5, error_score='raise',
          estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            **max_depth=None**, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            **min_samples_leaf=1**, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False),
          fit_params=None, iid=True, n_iter=4, n_jobs=1,
          param_distributions={'bootstrap': [True, False], 'max_depth': [80, 90, 100, 110], 'min_samples_leaf': [3, 4, 5]},
          pre_dispatch='2*n_jobs', random_state=None, refit=True,
          return_train_score=True, scoring=None, verbose=0)

1 个答案:

答案 0 :(得分:1)

您为RandomizedSearchCV对象选择的名称best实际上是用词不当:best将包含 all 个参数,而不仅仅是最佳参数,包括您的RF模型的参数,其中一些会在随机搜索中被实际覆盖。因此,print(best)会如预期的那样准确地给出此结果,即 all 参数值,包括实际上将不在此使用的默认RF值(它们将被覆盖) parameters中的值。

您应该问的是

print(best.best_params_)

获取最佳参数,并

print(best.best_estimator_)

针对具有最佳参数的整个RF模型。

以下是使用虹膜数据(名称为clf而非best)的可复制示例:

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.model_selection import RandomizedSearchCV

iris = datasets.load_iris()

parameters = {
'bootstrap': [True, False],
'max_depth': [80, 90, 100, 110],
'min_samples_leaf': [3, 4, 5]
}

model = RandomForestClassifier()
clf = RandomizedSearchCV(model, parameters, cv=5, return_train_score=True, iid=True, n_iter = 4)
clf.fit(iris.data, iris.target)

请注意,即使没有任何fit请求,此最后print命令的默认控制台输出将是:

RandomizedSearchCV(cv=5, error_score='raise-deprecating',
          estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators='warn', n_jobs=None,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False),
          fit_params=None, iid=True, n_iter=4, n_jobs=None,
          param_distributions={'max_depth': [80, 90, 100, 110], 'bootstrap': [True, False], 'min_samples_leaf': [3, 4, 5]},
          pre_dispatch='2*n_jobs', random_state=None, refit=True,
          return_train_score=True, scoring=None, verbose=0)

基本上与您所报告的相同(我已经在上面解释过):只是RF模型的默认值(因为您没有为model指定任何参数),加上{{1 }}网格。要获取选择的特定参数集,您应该使用

parameters

并询问clf.best_params_ # {'bootstrap': True, 'max_depth': 90, 'min_samples_leaf': 5} 确实确认我们获得了具有以下确切参数值的RF:

clf.best_estimator_