Scikit-learn : 로지스틱 회귀뿐만 아니라 SGDClassifier로 예측하기


24

로지스틱 회귀를 학습하는 방법은 확률 적 그라디언트 디센트 (schakit-learn)가 인터페이스를 제공하는 확률 적 그라디언트 디센트를 사용하는 것입니다.

내가하고 싶은 것은 scikit-learn의 SGDClassifier를 가져 와서 Logistic Regression here 과 동일한 점수를 얻는 입니다. 그러나 점수가 동일하지 않기 때문에 일부 기계 학습 향상 기능이 누락되어 있어야합니다.

이것은 내 현재 코드입니다. SGDClassifier에서 로지스틱 회귀와 동일한 결과를 얻을 수있는 것이 무엇입니까?

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)

내 출력 :

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

3
질문과 관찰 : 반복 실행시 SGD의 정확도는 얼마나 안정적입니까? 두 알고리즘은 동일하지 않으며 동일한 데이터에 대해 반드시 동일한 정확도를 생성하지는 않습니다. 실제로 신기원이나 SGD의 학습률을 변경해 볼 수 있습니다. 그 외에도 SGD의 기능을 정규화 할 수 있습니다.
image_doctor

따라서 위의 10 배 교차 검증을 사용하기 때문에 반복 실행에서 SGD를 테스트하지 않았습니다. 나를 위해 이것은 충분했다.
hlin117

이 알고리즘이 어떻게 다른지 설명해 주시겠습니까? 여기서 SGDClassifier를 살펴보면 "로그 손실은 확률 론적 분류 기인 로지스틱 회귀를 제공합니다."라고 언급합니다. 기계 학습 지식에 차이가 있다고 생각합니다.
hlin117

구현에 대한 자세한 연구가 없으면 왜 그들이 동등하지 않은지에 대해 구체적으로 말할 수는 없다고 생각하지만 동등하지 않다는 좋은 단서는 각 방법의 결과가 크게 다르다는 것입니다. 내 생각에 그것은 각각에 사용되는 추정 방법의 수렴 속성과 관련이있을 것입니다.
image_doctor

1
로지스틱 회귀는 확률 적 기울기 하강이 확률 적 기울기 하강을 사용하는 것처럼 기울기 하강을 사용하기 때문에 이러한 알고리즘이 다릅니다. 전자의 수렴이 더 효율적이며 더 나은 결과를 얻을 것입니다. 그러나 데이터 세트의 크기가 증가함에 따라 SGDC는 로지스틱 회귀 정확도에 접근해야합니다. GD의 매개 변수는 SGD의 매개 변수와 다른 의미를 가지므로 약간 조정 해보십시오. SGD의 학습 속도를 조금씩 낮추면 약간의 수렴을 시도하여 더 나은 수렴을 시도하는 것이 좋습니다.
AN6U5

답변:


23

반복 번호에 대한 의견이 있습니다. 기본값 SGDClassifier n_iter은 가중치 공간에서 단계를 5수행함을 의미합니다 5 * num_rows. 엄지 손가락일반적인 규칙은 일반적인 데이터의 경우 ~ 백만 단계입니다. 예를 들어 1000으로 설정하면 공차에 도달 할 수 있습니다. SGDClassifier허용 오차 전에 반복 한계에 도달 하여 정확도가 떨어 지므로 "조기 중지"

빠르고 더러운 코드 수정 :

# 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

SGDClassifier는 이름에서 알 수 있듯이 Stochastic Gradient descent를 최적화 알고리즘으로 사용합니다.

Sklearn에서 LogisiticRegression의 구현을 살펴보면 5 가지 최적화 기법 (솔버)이 제공되며 기본적으로 Coordinate Descent (CD)를 사용하여 수렴하는 것이 'LibLinear'입니다.

반복 횟수, 최적화, 정규화 유형 (페널티) 및 크기 (C) 이외에 알고리즘의 성능에 영향을줍니다.

Iris 데이터 세트 튜닝에서 실행하는 경우 이러한 모든 하이퍼 파라미터가 크게 변경되지는 않지만 복잡한 데이터 세트의 경우 중요한 역할을합니다.

자세한 내용은 Sklearn Logistic Regression Documentation을 참조하십시오 .


3

또한 SGDClassifier에 대한 "알파"하이퍼 파라미터에 대한 그리드 검색을 수행해야합니다. 그것은 sklearn 문서에 명시 적으로 언급되어 있으며 내 경험으로는 정확성에 큰 영향을 미칩니다. 두 번째 하이퍼 파라미터는 "n_iter"입니다. 그러나 데이터에 작은 영향을 미쳤습니다.


1

TL; DR : alphan_iter (또는 max_iter ) 그리드를 지정하고 SGDClassifier 에서 하이퍼 최적화를 위해 parfit 을 사용할 수 있습니다

저의 동료 Vinay Patlolla는 parfit 을 사용하여 SGD Classifier의 성능과 Logistic Regression을 만드는 방법 에 대한 훌륭한 블로그 게시물 을 작성했습니다 .

Parfit 은 SGDClassifier가 자신의 예제 데이터 세트에 대한 로지스틱 회귀뿐만 아니라 훨씬 적은 시간 내에 수행 할 수 있도록 SGDClassifier를 최적화하는 데 사용되는 적절한 매개 변수 조합을 찾는 데 사용하는 하이퍼 파라미터 최적화 패키지입니다.

요약하면 SGDClassifier의 두 가지 주요 매개 변수는 alphan_iter 입니다. Vinay를 직접 인용하려면 :

sklearn의 n_iter는 기본적으로 None입니다. 여기서는 충분히 많은 양 (1000)으로 설정했습니다. 최근에 추가 된 n_iter의 대체 매개 변수는 max_iter입니다. max_iter에도 동일한 조언이 적용되어야합니다.

알파 하이퍼 파라미터는 이중 목적으로 사용됩니다. 기본 일정에 따라 정규화 매개 변수 및 초기 학습 속도입니다. 이는 로지스틱 회귀 계수를 정규화하는 것 외에도 모형의 출력이 알파와 피팅 루틴이 수행하는 에포크 수 (n_iter) 사이의 상호 작용에 의존한다는 것을 의미합니다. 특히 알파가 매우 작아짐에 따라 느린 학습 속도를 보완하기 위해 n_iter를 늘려야합니다. 넓은 범위의 알파를 검색 할 때 n_iter를 충분히 크게 지정하는 것이 더 안전합니다 (예 : 1000).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.