Как scikit learn реализует выходной слой


  1. в scikit learn, сколько нейронов находится в выходном слое? Как указано здесь , Вы можете указать только размер скрытого слоя и их нейроны, но ничего о выходном слое, поэтому я не уверен, как scikit learn реализует выходной слой.
  2. Имеет ли смысл использовать функцию активации softmax для выходного слоя, имеющего только один нейрон?
1 2

1 ответ:

Тест:

Настройка:

In [227]: %paste
clf = MLPClassifier()

m = 10**3
n = 64

df = pd.DataFrame(np.random.randint(100, size=(m, n))).add_prefix('x') \
       .assign(y=np.random.choice([-1,1], m))


X_train, X_test, y_train, y_test = \
    train_test_split(df.drop('y',1), df['y'], test_size=0.2, random_state=33)

clf.fit(X_train, y_train)
## -- End pasted text --
Out[227]:
MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(100,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)

Количество выходов:

In [229]: clf.n_outputs_
Out[229]: 1

Количество слоев:

In [228]: clf.n_layers_
Out[228]: 3

Число итераций, выполненных решателем:

In [230]: clf.n_iter_
Out[230]: 60

Вот отрывок из исходного кода , где будет выбрана функция активации для выходного слоя:

    # Output for regression
    if not is_classifier(self):
        self.out_activation_ = 'identity'
    # Output for multi class
    elif self._label_binarizer.y_type_ == 'multiclass':
        self.out_activation_ = 'softmax'
    # Output for binary class and multi-label
    else:
        self.out_activation_ = 'logistic'

Обновление: MLPClassifier бинаризует (по принципу "один против всех") метки внутренне, поэтому логистическая регрессия должна хорошо работать также с метками, которые отличаются из [0,1]:

    if not incremental:
        self._label_binarizer = LabelBinarizer()
        self._label_binarizer.fit(y)
        self.classes_ = self._label_binarizer.classes_