【问题标题】:Hyperparameter optimization of MLPRegressor in scikit-learnscikit-learn 中 MLPRegressor 的超参数优化
【发布时间】:2018-07-08 20:43:42
【问题描述】:

我是使用 python 进行机器学习的新手,希望能对以下问题提供任何帮助。

我正在尝试为不同的隐藏神经元编号(6 个值)的列表运行 MLPRegressor,并且对于每个选定的神经元编号,我希望将训练数据打乱三次,即每个神经元编号的三个分数。以下代码可以正常工作并返回 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 列(每个隐藏的神经元数)。

提前致谢

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    试试这个

    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)
    

    【讨论】:

    • 感谢您的回答。它解决了获取分数数据框的问题。但是,您能否建议对代码本身进行任何改进以加快处理时间,例如使用 GridSearchCV 作为有问题的解释?
    • 欢迎您!如果我的回答解决了您的问题,请您投票并将其标记为正确的:-) 另外,我需要检查优化部分。你能提供数据,以便我可以在我的系统上复制它吗?
    猜你喜欢
    • 2020-08-16
    • 2018-03-18
    • 2016-04-09
    • 2020-07-17
    • 2018-03-12
    • 1970-01-01
    • 2020-07-24
    • 2018-01-31
    • 2019-09-11
    相关资源
    最近更新 更多