如何调整 MLP 分类器的超参数以获得更完美的性能

数据挖掘 scikit-学习 超参数调整 毫升
2021-10-11 00:46:02

我刚刚接触到多层感知器。而且,在使用 MLP 对 DEAP 数据进行分类时,我得到了这种准确性。但是,我不知道如何调整超参数以改善结果。

这是我的代码和结果的详细信息:

在此处输入图像描述.

from sklearn.neural_network import MLPClassifier

import numpy as np
import scipy.io
x_vals = data['all_data'][:,0:320]

y_vals_new = np.array([0 if each=='Neg'  else 1 if each =='Neu' else 2 for each in data['all_data'][:,320]])
y_vals_Arousal = np.array([3 if each=='Pas'  else 4 if each =='Neu' else 5 for each in data['all_data'][:,321]])

DEAP_x_train = x_vals[:-256]        #using 80% of whole data for training
DEAP_x_test = x_vals[-256:]         #using 20% of whole data for testing
DEAP_y_train = y_vals_new[:-256]     ##Valence
DEAP_y_test = y_vals_new[-256:]
DEAP_y_train_A = y_vals_Arousal[:-256]   ### Arousal
DEAP_y_test_A = y_vals_Arousal[-256:]

mlp = MLPClassifier(solver='adam', activation='relu',alpha=1e-4,hidden_layer_sizes=(50,50,50), random_state=1,max_iter=11,verbose=10,learning_rate_init=.1)

mlp.fit(DEAP_x_train, DEAP_y_train)

print (mlp.score(DEAP_x_test,DEAP_y_test))
print (mlp.n_layers_)
print (mlp.n_iter_)
print (mlp.loss_)
2个回答

如果你使用的是 SKlearn,你可以使用他们的超参数优化工具。

例如,您可以使用:

如果您使用GridSearchCV,您可以执行以下操作:

1)选择你的分类器

from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(max_iter=100)

2)定义一个超参数空间进行搜索。(您想尝试的所有值。)

parameter_space = {
    'hidden_layer_sizes': [(50,50,50), (50,100,50), (100,)],
    'activation': ['tanh', 'relu'],
    'solver': ['sgd', 'adam'],
    'alpha': [0.0001, 0.05],
    'learning_rate': ['constant','adaptive'],
}

注意:max_iter=100您在初始化程序上定义的 不在网格中。因此,该数字将是恒定的,而网格中的数字将被搜索。

3)运行搜索:

from sklearn.model_selection import GridSearchCV

clf = GridSearchCV(mlp, parameter_space, n_jobs=-1, cv=3)
clf.fit(DEAP_x_train, DEAP_y_train)

注意:该参数n_jobs用于定义计算机中要使用的 CPU 核心数(-1 表示所有可用核心)。cv是交叉验证的分割数

4) 查看最佳结果:

# Best paramete set
print('Best parameters found:\n', clf.best_params_)

# All results
means = clf.cv_results_['mean_test_score']
stds = clf.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, clf.cv_results_['params']):
    print("%0.3f (+/-%0.03f) for %r" % (mean, std * 2, params))

5) 现在您可以使用clf进行新的预测。例如,检查您的test set.

y_true, y_pred = DEAP_y_test , clf.predict(DEAP_x_test)

from sklearn.metrics import classification_report
print('Results on the test set:')
print(classification_report(y_true, y_pred))

作为对@BrunoGL 非常实用的答案的补充,我想给出一个更理论的答案。我想建议大家尝试调整简单神经网络的超参数来阅读 Lecun 和其他人的 Efficient Backprop ( http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf )。是的,它是从 1998 年开始的,不,它并没有过时。

它涵盖了您必须设置的主要超参数(激活、求解器、学习率、批次)的影响、公共陷阱、如果您陷入其中可能遇到的问题、如何发现这些问题以及如何解决它们。每个想要调整神经网络的人都必须阅读。另外,它是免费的。