scikit-learnで多層パーセプトロンのアクティベーション機能としてSoftmaxを適用する方法 [閉まっている]


9

Softmaxアクティベーション機能をscikitの多層パーセプトロンに適用する必要があります。ニューラルネットワークモデル(教師あり)のトピックに関するscikitのドキュメントでは、「MLPClassifierは出力関数としてSoftmaxを適用することにより、マルチクラス分類をサポートしていますと述べています。問題は、関数をどのように適用するかです。

以下のコードスニップで、アクティベーションパラメーターの下にSoftmaxを追加すると、受け入れられません。

MLPClassifier(activation='Softmax', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(15,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)

エラーコードは:

ValueError:アクティベーション「Softmax」はサポートされていません。サポートされるアクティベーションは( 'identity'、 'logistic'、 'tanh'、 'relu')です。

scikit-learnのマルチクラス分類にSoftmaxアクティベーション関数を適用する方法はありますか?

回答:


7

メソッドを呼び出して確率予測を要求すると、Softmax関数が適用されると思いますmlp.predict_proba(X)

私の想定を裏付けるために、私はこの小さな実験を開発しました:

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
import numpy as np

X,Y = load_iris().data, load_iris().target

mlp = MLPClassifier()
mlp.fit(X, Y)

print mlp.predict([3.1,  2.5,  8.4,  2.2])
print mlp.predict_proba([3.1,  2.5,  8.4,  2.2])
print "sum: %f"%np.sum(mlp.predict_proba([3.1,  2.5,  8.4,  2.2]))

どの値がに接続されていてpredict_proba()も、出力確率ベクトルは常に1まで合計されます。これは、Softmaxアクティベーション関数によってのみ達成できます(Softmax以外のアクティベーションを使用すると、最終的なアクティベーションの合計が保証されません。層は正確に1つになります(特に、目に見えないサンプルの場合)。

私の推測が正しい場合、ドキュメントを見ると、Softmaxの前にネットワークの出力を取得する方法が見つかりません...多分このクラスは分類のみを目的としているためです(回帰やその他の派手なセットアップではありません)。


4

MLPClassifierは、「マルチクラス分類」、「バイナリ分類」、「マルチラベル分類」に使用できます。したがって、出力層はYのタイプに基づいて決定されます。

  1. マルチクラス:最も外側のレイヤーはソフトマックスレイヤーです

  2. マルチラベルまたはバイナリクラス最外層はロジスティック/シグモイドです。

  3. 回帰:最外層はアイデンティティです

それを確認するMLPClassifierで使用されるsklearnからのコードの一部:

        # 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'
  1. マルチクラス分類:機能Xの場合、クラスは1つだけです。例:感情分析テキスト(X)が指定された場合、出力(Y)は正、中立、または負です。Binaryは、可能な出力が2つしかないマルチクラスの場合です。
  2. マルチラベル分類:機能Xの場合、複数のクラスが存在する可能性があります。

1

ダニエルロペスからの答えに同意することはできません。私の場合、predict_proba()はsoftmaxの結果を返しません。

TrideepRathからの回答で、この問題を簡単に解決できます。softmaxを適用するには、out_activation_を定義します。

your_model.out_activation_ = 'softmax'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.