Scikit-belajar: Mendapatkan SGDClassifier untuk memprediksi serta Regresi Logistik

24

Cara untuk melatih Regresi Logistik adalah dengan menggunakan keturunan gradien stokastik, yang scikit-belajar menawarkan antarmuka.

Apa yang ingin saya lakukan adalah mengambil scikit-belajar ini SGDClassifier dan memilikinya skor yang sama sebagai Regresi Logistik di sini . Namun, saya harus kehilangan beberapa peningkatan pembelajaran mesin, karena skor saya tidak setara.

Ini adalah kode saya saat ini. Apa yang saya lewatkan pada SGDClassifier yang akan menghasilkan hasil yang sama dengan Regresi Logistik?

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
import numpy as np
import pandas as pd
from sklearn.cross_validation import KFold
from sklearn.metrics import accuracy_score

# Note that the iris dataset is available in sklearn by default.
# This data is also conveniently preprocessed.
iris = datasets.load_iris()
X = iris["data"]
Y = iris["target"]

numFolds = 10
kf = KFold(len(X), numFolds, shuffle=True)

# These are "Class objects". For each Class, find the AUC through
# 10 fold cross validation.
Models = [LogisticRegression, SGDClassifier]
params = [{}, {"loss": "log", "penalty": "l2"}]
for param, Model in zip(params, Models):
    total = 0
    for train_indices, test_indices in kf:

        train_X = X[train_indices, :]; train_Y = Y[train_indices]
        test_X = X[test_indices, :]; test_Y = Y[test_indices]

        reg = Model(**param)
        reg.fit(train_X, train_Y)
        predictions = reg.predict(test_X)
        total += accuracy_score(test_Y, predictions)
    accuracy = total / numFolds
    print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)

Output saya:

Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76
hlin117
sumber
3
Sebuah pertanyaan dan pengamatan: seberapa stabil akurasi SGD Anda pada pengulangan? kedua algoritma tidak setara dan tidak serta merta menghasilkan akurasi yang sama mengingat data yang sama. Praktis Anda bisa mencoba mengubah zaman dan atau tingkat pembelajaran untuk SGD. Selain itu, Anda dapat mencoba menormalkan fitur untuk SGD.
image_doctor
Jadi, saya tidak menguji SGD pada pengulangan karena di atas menggunakan 10 kali validasi silang; bagi saya ini sudah cukup.
hlin117
Bisakah Anda jelaskan kepada saya mengapa algoritma ini tidak setara? Jika saya melihat SGDClassifier di sini, ia menyebutkan "Kehilangan 'log' memberikan regresi logistik, sebuah pengklasifikasi probabilistik." Saya percaya ada celah dalam pengetahuan pembelajaran mesin saya.
hlin117
Tanpa studi terperinci tentang implementasi saya tidak berpikir saya bisa spesifik tentang mengapa mereka tidak setara, tetapi petunjuk yang baik bahwa mereka tidak setara adalah bahwa hasil untuk setiap metode berbeda secara signifikan. Dugaan saya adalah bahwa itu ada hubungannya dengan sifat konvergensi dari metode estimasi yang digunakan di masing-masing.
image_doctor
1
Algoritma ini berbeda karena regresi logistik menggunakan gradient descent sedangkan stochastic gradient descent menggunakan stochastic gradient descent. Konvergensi yang pertama akan lebih efisien dan akan menghasilkan hasil yang lebih baik. Namun, ketika ukuran set data meningkat, SGDC harus mendekati keakuratan regresi logistik. Parameter untuk GD memiliki arti yang berbeda dengan parameter untuk SGD, jadi Anda harus mencoba sedikit menyesuaikannya. Saya akan menyarankan bermain dengan (mengurangi) tingkat pembelajaran SGD sedikit untuk mencoba untuk mendapatkan konvergensi yang lebih baik karena mungkin sedikit meronta-ronta.
AN6U5

Jawaban:

23

Komentar tentang nomor iterasi tepat. Standarnya SGDClassifier n_iteradalah 5Anda melakukan 5 * num_rowslangkah - langkah dalam ruang bobot. The Aturan sklearn praktis adalah ~ 1 juta langkah untuk data yang khas. Sebagai contoh Anda, setel ke 1000 dan mungkin mencapai toleransi terlebih dahulu. Akurasi Anda lebih rendah SGDClassifierkarena itu mencapai batas iterasi sebelum toleransi sehingga Anda "berhenti lebih awal"

Memodifikasi kode Anda dengan cepat dan kotor saya dapatkan:

# Added n_iter here
params = [{}, {"loss": "log", "penalty": "l2", 'n_iter':1000}]

for param, Model in zip(params, Models):
    total = 0
    for train_indices, test_indices in kf:
        train_X = X[train_indices, :]; train_Y = Y[train_indices]
        test_X = X[test_indices, :]; test_Y = Y[test_indices]
        reg = Model(**param)
        reg.fit(train_X, train_Y)
        predictions = reg.predict(test_X)
        total += accuracy_score(test_Y, predictions)

    accuracy = total / numFolds
    print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)

Accuracy score of LogisticRegression: 0.96
Accuracy score of SGDClassifier: 0.96
cwharland
sumber
4

SGDClassifier, seperti namanya, menggunakan keturunan Stochastic Gradient sebagai algoritma pengoptimalannya.

Jika Anda melihat implementasi LogisiticRegression di Sklearn ada lima teknik optimisasi (pemecah) yang disediakan dan secara default 'LibLinear' yang menggunakan Koordinat Keturunan (CD) untuk melakukan konvergensi.

Selain jumlah iterasi, optimasi, jenis regularisasi (penalti) dan besarnya (C) juga mempengaruhi kinerja algoritma.

Jika Anda menjalankannya pada penyetelan set data Iris, semua parameter hiper ini mungkin tidak membawa perubahan signifikan tetapi untuk set data kompleks, mereka memainkan peran yang berarti.

Untuk lebih lanjut, Anda dapat merujuk Dokumentasi Regresi Logistik Sklearn .

Rajat Agarwal
sumber
3

Anda juga harus melakukan pencarian grid untuk hyperparameter "alpha" untuk SGDClassifier. Secara eksplisit disebutkan dalam dokumentasi sklearn dan dari pengalaman saya memiliki dampak besar pada akurasi. Hyperparameter kedua yang harus Anda lihat adalah "n_iter" - namun saya melihat efek yang lebih kecil dengan data saya.

Diego
sumber
1

TL; DR : Anda dapat menentukan kisi alfa dan n_iter (atau maks_iter ) dan menggunakan parfit untuk hiper-optimasi pada SGDClassifier

Rekan saya, Vinay Patlolla, menulis posting blog yang sangat baik tentang Cara membuat SGD Classifier berkinerja serta Regresi Logistik menggunakan parfit .

Parfit adalah paket optimisasi parameter-hip yang ia gunakan untuk menemukan kombinasi parameter yang tepat yang berfungsi untuk mengoptimalkan SGDClassifier untuk berkinerja serta Regresi Logistik pada contoh data yang disetel dalam waktu yang jauh lebih sedikit.

Singkatnya, dua parameter utama untuk SGDClassifier adalah alpha dan n_iter . Mengutip Vinay secara langsung:

n_iter di sklearn tidak ada secara default. Kami menetapkannya di sini dengan jumlah yang cukup besar (1000). Parameter alternatif untuk n_iter, yang baru-baru ini ditambahkan, adalah max_iter. Saran yang sama harus berlaku untuk max_iter.

Parameter hiper alfa melayani tujuan ganda. Ini adalah parameter regularisasi dan tingkat pembelajaran awal di bawah jadwal default. Ini berarti bahwa, selain mengatur koefisien Regresi Logistik, output dari model tergantung pada interaksi antara alfa dan jumlah zaman (n_iter) yang dilakukan oleh rutin pemasangan. Secara khusus, karena alfa menjadi sangat kecil, n_iter harus ditingkatkan untuk mengimbangi laju pembelajaran yang lambat. Inilah sebabnya mengapa lebih aman (tapi lebih lambat) untuk menentukan n_iter yang cukup besar, misalnya 1000, ketika mencari di berbagai alfa.

Jason Carpenter
sumber