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
Jawaban:
Komentar tentang nomor iterasi tepat. Standarnya
SGDClassifier
n_iter
adalah5
Anda melakukan5 * num_rows
langkah - 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 rendahSGDClassifier
karena itu mencapai batas iterasi sebelum toleransi sehingga Anda "berhenti lebih awal"Memodifikasi kode Anda dengan cepat dan kotor saya dapatkan:
sumber
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 .
sumber
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.
sumber
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:
sumber