Bagaimana cara menerapkan Softmax sebagai fungsi Aktivasi dalam multi-layer Perceptron di scikit-learn? [Tutup]

9

Saya perlu menerapkan fungsi aktivasi Softmax ke Perceptron multi-layer di scikit. Dokumentasi scikit pada topik model jaringan saraf (diawasi) mengatakan "MLPClassifier mendukung klasifikasi multi-kelas dengan menerapkan Softmax sebagai fungsi output." Pertanyaannya adalah bagaimana cara menerapkan fungsi?

Dalam snip kode di bawah ini, ketika saya menambahkan Softmax di bawah parameter aktivasi itu tidak menerima.

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)

Kode kesalahan adalah:

ValueError: Aktivasi 'Softmax' tidak didukung. Aktivasi yang didukung adalah ('identitas', 'logistik', 'tanh', 'relu').

Apakah ada cara untuk menerapkan fungsi aktivasi Softmax untuk klasifikasi multi-kelas di scikit-learn?

Hanya saja
sumber

Jawaban:

7

Saya yakin bahwa fungsi Softmax diterapkan ketika Anda meminta prediksi probabilitas dengan memanggil metode mlp.predict_proba(X).

Untuk mendukung anggapan saya, saya telah mengembangkan eksperimen kecil ini:

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]))

Perhatikan bahwa tidak peduli nilai apa yang dicolokkan predict_proba(), vektor probabilitas keluaran selalu meringkas 1. Ini hanya dapat dicapai oleh fungsi aktivasi Softmax (Menggunakan aktivasi lain yang Softmax tidak ada jaminan bahwa jumlah aktivasi di final layer akan persis satu, khusus untuk sampel yang tidak terlihat).

Jika tebakan saya benar, melihat dokumentasi saya tidak dapat menemukan metode untuk mendapatkan output dari jaringan sebelum Softmax ... Mungkin karena kelas ini dimaksudkan hanya untuk klasifikasi (bukan regresi atau setup mewah lainnya).

Daniel López
sumber
4

MLPClassifier dapat digunakan untuk "klasifikasi multikelas", "klasifikasi biner" dan "klasifikasi multilabel". Jadi layer output ditentukan berdasarkan tipe Y:

  1. Multiclass : Lapisan terluar adalah lapisan softmax

  2. Multilabel atau Kelas Biner : Lapisan terluar adalah logistik / sigmoid.

  3. Regresi : Lapisan terluar adalah identitas

Bagian dari kode dari sklearn yang digunakan dalam MLPClassifier yang mengkonfirmasinya:

        # 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. Klasifikasi multi-kelas: Untuk Fitur X, hanya ada satu kelas. misal Sentiment Analysis Given a Text (X), apakah output (Y) positif, netral atau negatif. Biner adalah kasus Multiclass di mana hanya ada 2 kemungkinan output.
  2. Klasifikasi multilabel: Untuk Fitur X, mungkin ada beberapa kelas.
Trideep Rath
sumber
1

Tidak setuju dengan jawaban dari Daniel Lopez. Dalam kasus saya, jawab predict_proba () tidak mengembalikan hasil softmax.

Jawaban dari TrideepRath dapat dengan mudah menyelesaikan masalah ini. Untuk menerapkan softmax define out_activation_:

your_model.out_activation_ = 'softmax'
MykolaSharhan
sumber