scikit-learn中MLPRegressor的超参数优化

时间:2018-07-08 09:35:27

标签: python machine-learning scikit-learn

我在使用python进行机器学习方面非常陌生,希望对以下问题有所帮助。

我正在尝试运行MLPRegressor以获得不同的隐藏神经元编号(6个值)的列表,并且对于每个选定的神经元编号,我希望将训练数据进行3次改组,即每个神经元编号获得3分。以下代码可以正常工作,并返回18分(6 * 3)。但是,我感觉这不是解决问题的有效方法,因为它运行了将近一个小时。我尝试使用GridSearchCV(),但是我不知道如何控制训练数据的改组(每个隐藏的神经元编号3次)。有人可以建议一种更好(更快)的解决方法吗?

from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import cross_val_score
from sklearn.utils import shuffle

n=3 # how many times to shuffle the training data
nhn_range=[8,10,12,14,16,18] # number of hidden neurons

nhn_scores = []
for nhn in nhn_range:
    mlp = MLPRegressor(hidden_layer_sizes=(nhn,), activation='tanh', 
                       solver='adam', shuffle=False, random_state=42, 
                       max_iter=20000, momentum=0.7, early_stopping=True, 
                       validation_fraction=0.15)
    for _ in range(n):
        df_train = shuffle(df_train)
        score = np.sqrt(-cross_val_score(mlp, df_train[feature_cols], 
                        df_train[response_cols], 
                        cv=5, scoring='neg_mean_squared_error')).mean()
        nhn_scores.append(score)

代码返回分数列表。如何获得一个简单的数据帧,该数据帧具有3行(每个改组)和6列(每个隐藏的神经元编号)。

预先感谢

1 个答案:

答案 0 :(得分:3)

尝试一下

score_dict = {}
for nhn in nhn_range:
    mlp = MLPRegressor(hidden_layer_sizes=(nhn,), activation='tanh', 
                       solver='adam', shuffle=False, random_state=42, 
                       max_iter=20000, momentum=0.7, early_stopping=True, 
                       validation_fraction=0.15)


    nhn_scores = []
    for _ in range(n):

        df_train = shuffle(df_train)
        score = np.sqrt(-cross_val_score(mlp, df_train[feature_cols], 
                    df_train[response_cols], 
                    cv=5, scoring='neg_mean_squared_error')).mean()
        nhn_scores.append(score)
    score_dict[nhn] = nhn_scores

然后使用from_dictscore_dict转换为这样的数据帧

import pandas as pd
score_df = pd.DataFrame.from_dict(score_dict)