为什么RandomizedSearchCV()返回的得分比此处的默认分类器设置差?

时间:2018-06-27 14:27:21

标签: python scikit-learn classification

我正在使用以下代码尝试调整MLPClassifier的参数:

hidden_layer_sizes = ([x for x in itertools.product((10, 20, 30, 40, 50, 53, 73, 100), repeat=1)] + \
                       [x for x in itertools.product((10, 20, 30, 40, 50, 100), repeat=2)] )
                       #[((len(clean_df.columns))+1,)] )]
#print(hidden_layer_sizes)
alpha = [0.01, 0.1, 1, 10, 100]
activation = ['identity', 'logistic', 'tanh', 'relu']
solver = ['lbfgs', 'sgd', 'adam']
learning_rate = ['constant', 'invscaling', 'adaptive']

random_grid = {'hidden_layer_sizes': hidden_layer_sizes,
               'alpha': alpha,
              'activation' : activation,
              'solver': solver,
              'learning_rate': learning_rate}

prec_metric = make_scorer(precision_score)
k = StratifiedKFold(n_splits=10, shuffle=False)

mlp = MLPClassifier()

mlp_random = RandomizedSearchCV(estimator = mlp, param_distributions=random_grid, scoring=prec_metric,
                               n_iter=100, cv=k, n_jobs=-1, verbose=3)

mlp_random.fit(clean_df, target)
print("Best parameters found: " + str(mlp_random.best_params_))
print("Mean test score from Randomized Search CV: " + str(mlp_random.cv_results_['mean_test_score'].mean()))

令我惊讶的是(经过几个小时的等待),与使用默认设置训练MLPClassifier时,此随机搜索实际上返回的平均测试分数差了60%,这给了我76%的准确性:

mlp = MLPClassifier()

scores = cross_val_score(mlp, clean_df, target, cv=10)
print("Full features: mean of the scores: {:.2f}".format(scores.mean()))

知道发生什么了吗

1 个答案:

答案 0 :(得分:3)

比较参数网格和默认值,我想问题出在hidden_layer_sizesalpha中。

  • alpha的默认值为1e-4,而网格的最低值为1e-2。可能是,您正则化过多,这会导致拟合不足。检查cv_results_较低的alpha模型相对于其他模型的性能如何,并可能调整网格。
  • 看看hidden_layer_sizes网格,它们的大小都 第一层的<< 100,这是默认值。

请注意,使用默认超参数的模型通常是一个很好的基准,当您为RandomizedSearchCV提供如此多的自由度(均匀采样)时,您不能保证所有采样的超参数都将是有意义的。实际上,我想您的情况很多。

更新: 要将交叉验证结果导出到csv,请执行以下操作:

pd.DataFrame(mlp_random.cv_results_).to_csv('export.csv')