Scikit-learn: Lojistik Regresyonun yanı sıra tahmin etmek için SGDClassifier'ı edinmek


24

Lojistik Regresyon'u eğitmenin bir yolu, scikit-learn'ın bir arayüz sunduğu stokastik degrade inişini kullanmaktır.

Yapmak istediğim bir scikit- learn'ın SGDClassifier'ı almak ve burada Lojistik Regresyon ile aynı puanı almak . Ancak puanlarım eşit olmadığından bazı makine öğrenme geliştirmelerini kaçırmam gerekiyor.

Bu benim şu anki kodum. Lojistik Regresyon ile aynı sonuçları vermesini sağlayacak olan SGDClassifier'da ne eksik?

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)

Çıktım:

Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76

3
Bir soru ve bir gözlem: SGD'nin tekrarlanan çalışmalardaki doğruluğu ne kadar kararlıdır? iki algoritma eşdeğer değildir ve mutlaka aynı veriler verilen aynı doğruluğu üretmeyecektir. Pratik olarak, dönemleri ve / veya SGD'nin öğrenme oranını değiştirmeyi deneyebilirsiniz. Bunun ötesinde, SGD'nin özelliklerini normalleştirmeyi deneyebilirsiniz.
image_doctor

Bu yüzden, SGD'yi tekrarlanan çalışmalarda test etmedim, çünkü yukarıdaki 10 kat çapraz doğrulama kullanır; benim için bu yeterli.
hlin117

Bana bu algoritmaların nasıl eşdeğer olmadığını açıklayabilir misiniz? Burada SGDClassifier’a bakarsam, “log log’ kaybı, lojistik bir regresyon, olasılıklı bir sınıflandırıcı verir ”diyor. Makine öğrenim bilgilerimde bir boşluk olduğuna inanıyorum.
hlin117

Uygulamaların ayrıntılı bir incelemesi olmadan, neden eşdeğer olmadıkları konusunda spesifik olabileceğimi sanmıyorum, ancak eşdeğer olmadıklarına dair iyi bir ipucu, her bir yönteme ait sonuçların önemli ölçüde farklı olduğudur. Benim tahminim, her birinde kullanılan tahmin yöntemlerinin yakınsama özellikleriyle ilgili olması gerektiğidir.
image_doctor

1
Bu algoritmalar farklıdır, çünkü lojistik regresyon, stokastik gradyan inişinin stokastik gradyan inişini kullandığı durumlarda gradyan inişini kullanır. Birincinin yakınsaması daha verimli olacak ve daha iyi sonuçlar verecektir. Ancak, veri kümesinin büyüklüğü arttıkça, SGDC lojistik regresyonun doğruluğuna yaklaşmalıdır. GD'nin parametreleri, SGD'nin parametrelerinden farklı şeyler ifade eder, bu yüzden onları hafifçe ayarlamayı denemelisiniz. SGD öğrenme oranlarını biraz düşürmeyi önerebilirim, çünkü biraz daha iyi bir şekilde birleşebilir.
AN6U5

Yanıtlar:


23

Yineleme numarası ile ilgili yorumlar yerindedir. Varsayılan SGDClassifier n_iter, ağırlık alanındaki adımları 5atmanız anlamına gelir 5 * num_rows. Başparmak sklearn kuralı ~ tipik veriler için 1.000.000 adım mesafededir. Örneğin, sadece 1000 olarak ayarlayın ve ilk önce toleransa ulaşabilir. Doğruluk oranınız düşük SGDClassifierçünkü toleranstan önce yineleme sınırına çarpıyor bu yüzden "erken duruyorsunuz"

Kodunuzu çabuk ve kirli olarak değiştirerek alıyorum:

# 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

4

Adından da anlaşılacağı gibi SGDClassifier, optimizasyon algoritması olarak Stochastic Gradient inişini kullanıyor.

Sklearn'deki LogisiticRegression uygulamasına bakarsanız, sağlanan beş optimizasyon tekniği (çözücü) vardır ve varsayılan olarak birleştirmek için Koordinat Descent'i (CD) kullanan 'LibLinear'dır.

Yinelemelerin sayısı dışında, optimizasyon, düzenlenme türü (ceza) ve büyüklüğü (C) de algoritmanın performansını etkiler.

Iris veri setinde çalıştırıyorsanız, tüm bu hiper parametrelerin ayarlanması önemli bir değişiklik getirmeyebilir, ancak karmaşık veri kümeleri için anlamlı bir rol oynarlar.

Daha fazla bilgi için Sklearn Logistics Regression Documentation'a başvurabilirsiniz .


3

SGDClassifier için "alfa" hiperparametresi için bir ızgara araması da yapmalısınız. Sklearn belgelerinde açıkça belirtilmiştir ve deneyimlerimden doğruluk üzerinde büyük etkisi var. Bakmanız gereken ikinci hiperparametre "n_iter" - ancak verilerimle daha küçük bir etki gördüm.


1

TL; DR : Bir alfa ve n_iter ızgarası (veya max_iter) belirleyebilirsiniz. ) ve kullanabilirsiniz Parfit SGDClassifier üzerinde hiper optimizasyonu için

Meslektaşım Vinay Patlolla, mükemmel bir blog yazısı yazdı SGD Sınıflandırıcısının parfit kullanarak Logistic Regression'ın yanı sıra nasıl performans göstereceği hakkında .

Parfit , SGDClassifier'ı optimize etmek için sunulan uygun parametreler kombinasyonunu bulmak için kullandığı ve daha az zamanda örnek veri setinde Logistic Regression kullandığı bir hiper-parametre optimizasyon paketidir.

Özetle, SGDClassifier için iki anahtar parametre alfa ve n_iter'dir. . Vinay'e doğrudan alıntı yapmak için:

sklearn'deki n_iter varsayılan olarak Yok'tur. Onu burada yeterince büyük bir miktara (1000) ayarlıyoruz. Son zamanlarda eklenmiş olan n_iter'e alternatif bir parametre de max_iter'dir. Aynı tavsiye max_iter için de geçerlidir.

Alfa hiper parametresi çift bir amaca hizmet eder. Hem normalleştirme parametresi hem de varsayılan programdaki ilk öğrenme oranıdır. Bu, Lojistik Regresyon katsayılarının düzenlenmesine ek olarak, modelin çıktısının, alfa ve uygun rutinin gerçekleştirdiği epoch sayısı (n_iter) arasındaki bir etkileşime bağlı olduğu anlamına gelir. Özellikle, alfa çok küçüldükçe, yavaş öğrenme oranını telafi etmek için n_iter artırılmalıdır. Bu nedenle, geniş bir alfa fazı ararken n_itreyi yeterince büyük, örneğin 1000, belirtmek daha güvenli (ancak daha yavaş).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.