layered_perceptron:ConvergenceWarning:随机优化器:达到最大迭代次数并且优化尚未收敛.警告?

anu*_*anu 9 machine-learning neural-network scikit-learn

我写了一个基本程序来了解MLP分类器中发生了什么?

from sklearn.neural_network import MLPClassifier
Run Code Online (Sandbox Code Playgroud)

数据:标记为男性或女性的身体指标(身高,宽度和鞋码)的数据集:

X = [[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37], [166, 65, 40],
     [190, 90, 47], [175, 64, 39],
     [177, 70, 40], [159, 55, 37], [171, 75, 42], [181, 85, 43]]
y = ['male', 'male', 'female', 'female', 'male', 'male', 'female', 'female',
     'female', 'male', 'male']
Run Code Online (Sandbox Code Playgroud)

准备模型:

 clf= MLPClassifier(hidden_layer_sizes=(3,), activation='logistic',
                       solver='adam', alpha=0.0001,learning_rate='constant', 
                      learning_rate_init=0.001)
Run Code Online (Sandbox Code Playgroud)

培养

clf= clf.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

学习分类器的属性:

print('current loss computed with the loss function: ',clf.loss_)
print('coefs: ', clf.coefs_)
print('intercepts: ',clf.intercepts_)
print(' number of iterations the solver: ', clf.n_iter_)
print('num of layers: ', clf.n_layers_)
print('Num of o/p: ', clf.n_outputs_)
Run Code Online (Sandbox Code Playgroud)

测试

print('prediction: ', clf.predict([  [179, 69, 40],[175, 72, 45] ]))
Run Code Online (Sandbox Code Playgroud)

计算.准确性

print( 'accuracy: ',clf.score( [ [179, 69, 40],[175, 72, 45] ], ['female','male'], sample_weight=None ))
Run Code Online (Sandbox Code Playgroud)

RUN1

current loss computed with the loss function:  0.617580287851
coefs:  [array([[ 0.17222046, -0.02541928,  0.02743722],
       [-0.19425909,  0.14586716,  0.17447281],
       [-0.4063903 ,  0.148889  ,  0.02523247]]), array([[-0.66332919],
       [ 0.04249613],
       [-0.10474769]])]
intercepts:  [array([-0.05611057,  0.32634023,  0.51251098]), array([ 0.17996649])]
 number of iterations the solver:  200
num of layers:  3
Num of o/p:  1
prediction:  ['female' 'male']
accuracy:  1.0
/home/anubhav/anaconda3/envs/mytf/lib/python3.6/site-packages/sklearn/neural_network/multilayer_perceptron.py:563: ConvergenceWarning: Stochastic Optimizer: Maximum iterations reached and the optimization hasn't converged yet.
  % (), ConvergenceWarning)
Run Code Online (Sandbox Code Playgroud)

RUN2

current loss computed with the loss function:  0.639478303643
coefs:  [array([[ 0.02300866,  0.21547873, -0.1272455 ],
       [-0.2859666 ,  0.40159542,  0.55881399],
       [ 0.39902066, -0.02792529, -0.04498812]]), array([[-0.64446013],
       [ 0.60580985],
       [-0.22001532]])]
intercepts:  [array([-0.10482234,  0.0281211 , -0.16791644]), array([-0.19614561])]
 number of iterations the solver:  39
num of layers:  3
Num of o/p:  1
prediction:  ['female' 'female']
accuracy:  0.5
Run Code Online (Sandbox Code Playgroud)

RUN3

current loss computed with the loss function:  0.691966937074
coefs:  [array([[ 0.21882191, -0.48037975, -0.11774392],
       [-0.15890357,  0.06887471, -0.03684797],
       [-0.28321762,  0.48392007,  0.34104955]]), array([[ 0.08672174],
       [ 0.1071615 ],
       [-0.46085333]])]
intercepts:  [array([-0.36606747,  0.21969636,  0.10138625]), array([-0.05670653])]
 number of iterations the solver:  4
num of layers:  3
Num of o/p:  1
prediction:  ['male' 'male']
accuracy:  0.5
Run Code Online (Sandbox Code Playgroud)

RUN4:

current loss computed with the loss function:  0.697102567593
coefs:  [array([[ 0.32489731, -0.18529689, -0.08712877],
       [-0.35425908,  0.04214241,  0.41249622],
       [-0.19993622, -0.38873908, -0.33057999]]), array([[ 0.43304555],
       [ 0.37959392],
       [ 0.55998979]])]
intercepts:  [array([ 0.11555407, -0.3473817 , -0.16852093]), array([ 0.31326347])]
 number of iterations the solver:  158
num of layers:  3
Num of o/p:  1
prediction:  ['male' 'male']
accuracy:  0.5
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- ---------------

我有以下问题:

1.Why in the RUN1 the optimizer did not converge?
2.Why in RUN3 the number of iteration were suddenly becomes so low and in the RUN4 so high?
3.What else can be done to increase the accuracy which I get in RUN1.? 
Run Code Online (Sandbox Code Playgroud)

Flo*_*n H 15

1:您的MLP没有收敛:算法通过逐步收敛到最小值进行优化,在运行1中找不到最小值.

2运行的差异:您的MLP有一些随机起始值,因此您不会得到与数据中相同的结果.似乎你在第四次跑步时开始非常接近最低限度.您可以random_state将MLP 的参数更改为常量,例如random_state=0一遍又一遍地获得相同的结果.

3是最困难的一点.您可以使用优化参数

from sklearn.model_selection import GridSearchCV
Run Code Online (Sandbox Code Playgroud)

Gridsearch将您的测试集拆分为大小相同的部分,使用一个部分作为测试数据,其余部分作为训练数据.因此,它优化了将数据拆分为多个分类器.

你需要指定(你的数据很小,所以我建议2或3)你分割的部分数量,分类器(你的MLP),以及你想要优化的参数网格,如下所示:

param_grid = [
        {
            'activation' : ['identity', 'logistic', 'tanh', 'relu'],
            'solver' : ['lbfgs', 'sgd', 'adam'],
            'hidden_layer_sizes': [
             (1,),(2,),(3,),(4,),(5,),(6,),(7,),(8,),(9,),(10,),(11,), (12,),(13,),(14,),(15,),(16,),(17,),(18,),(19,),(20,),(21,)
             ]
        }
       ]
Run Code Online (Sandbox Code Playgroud)

因为你曾经用三个神经元的隐藏层获得100%的准确度,你可以尝试优化学习率和动量等参数而不是隐藏层.

像这样使用Gridsearch:

clf = GridSearchCV(MLPClassifier(), param_grid, cv=3,
                           scoring='accuracy')
clf.fit(X,y)


print("Best parameters set found on development set:")
print(clf.best_params_)
Run Code Online (Sandbox Code Playgroud)