2014-07-07 4 views
27

큰 데이터 세트를 분류하기 위해 SGD를 사용하려고합니다. 데이터가 너무 커서 메모리에 저장할 수 없기 때문에 partial_fit 메서드를 사용하여 분류자를 학습하고 싶습니다.Sklearn SGDClassifier 부분 맞춤

from sklearn.linear_model import SGDClassifier 

def batches(l, n): 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

clf1 = SGDClassifier(shuffle=True, loss='log') 
clf1.fit(X, Y) 

clf2 = SGDClassifier(shuffle=True, loss='log') 
n_iter = 60 
for n in range(n_iter): 
    for batch in batches(range(len(X)), 10000): 
     clf2.partial_fit(X[batch[0]:batch[-1]+1], Y[batch[0]:batch[-1]+1], classes=numpy.unique(Y)) 

난 후, 동일한 테스트 세트 모두 분류 테스트 : I는 맞는partial_fit를 테스트하는 메모리에 적합한 데이터 세트 (10 행)의 샘플을 선택 하였다. 첫 번째 경우에는 100 %의 정확도를 얻습니다. 내가 알고 있듯이 SGD는 기본적으로 교육 데이터 (n_iter = 5)보다 5 배 이상 빠릅니다.

두 번째 경우 동일한 정확도에 도달하려면 데이터를 60 번 통과해야합니다.

왜이 차이가 있습니까 (5 대 60 대)? 아니면 내가 잘못하고있는거야?

+0

은 자세한'부여 = 1' 당신에게 힌트를 줄 수있는 SGD 생성자에. –

+0

첫 번째 경우 ("맞음")는 "- Epoch 5 Norm : 29.25, NNZ : 300, 바이어스 : -1.674706, T : 459595, 평균 손실 : 0.076786"으로 끝납니다. 두 번째 경우 (partial_fit)는 10 패스 후에 "- Epoch 1 Norm : 22.99, NNZ : 300, Bias : -1.999685, T : 1918, 평균 손실 : 0.089302"로 끝납니다. 나는 무엇을 찾고 있어야 하는가? thx –

+0

평균 손실. 배치 케이스에서 더 빨리 떨어지는 지 확인하십시오. –

답변

46

나는 결국 대답을 발견했다. 각 반복 사이의 훈련 데이터를 셔플에 당신은 partial_fit를 사용할 때 데이터를 셔플되지 않습니다 모델을 인스턴스화 할 때 셔플 설정으로 = 진정한이 (에 맞게에만 적용)가 필요합니다. 참고 : sklearn.linear_model.SGDClassifier page에서이 정보를 찾는 것이 도움이되었을 것입니다. 다음과 같이

개정 코드를 읽

from sklearn.linear_model import SGDClassifier 
import random 
clf2 = SGDClassifier(loss='log') # shuffle=True is useless here 
shuffledRange = range(len(X)) 
n_iter = 5 
for n in range(n_iter): 
    random.shuffle(shuffledRange) 
    shuffledX = [X[i] for i in shuffledRange] 
    shuffledY = [Y[i] for i in shuffledRange] 
    for batch in batches(range(len(shuffledX)), 10000): 
     clf2.partial_fit(shuffledX[batch[0]:batch[-1]+1], shuffledY[batch[0]:batch[-1]+1], classes=numpy.unique(Y))