python - Sklearn एसजीडी क्लासिफायर आंशिक फिट



machine-learning scikit-learn (1)

मुझे अंत में जवाब मिल गया है। आपको प्रत्येक पुनरावृत्ति के बीच प्रशिक्षण डेटा को घुमाने की आवश्यकता है, क्योंकि shuffle = True को सेट करते समय मॉडल को तुरंत चालू करने से partial_fit का उपयोग करते समय डेटा को शफ़ल नहीं किया जाएगा (यह केवल फिट पर लागू होता है )। नोट: यह जानकारी sklearn.linear_model.SGDClassifier पृष्ठ पर ढूंढने में सहायक होगी।

संशोधित कोड निम्नानुसार पढ़ता है:

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))

मैं एक बड़े डेटासेट वर्गीकृत करने के लिए एसजीडी का उपयोग करने की कोशिश कर रहा हूं। चूंकि डेटा मेमोरी में फ़िट होने के लिए बहुत बड़ा है, इसलिए मैं क्लासिफायर को प्रशिक्षित करने के लिए partial_fit विधि का उपयोग करना चाहता हूं। मैंने डेटासेट (100,000 पंक्तियों) का एक नमूना चुना है जो फिट बनाम partial_fit का परीक्षण करने के लिए स्मृति में फिट बैठता है:

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))

मैं फिर एक समान परीक्षण सेट के साथ दोनों क्लासिफायरों का परीक्षण करता हूं। पहले मामले में मुझे 100% की शुद्धता मिलती है। जैसा कि मैं इसे समझता हूं, डिफ़ॉल्ट रूप से एसजीडी प्रशिक्षण डेटा पर 5 गुना गुजरता है (n_iter = 5)।

दूसरे मामले में, मुझे समान सटीकता तक पहुंचने के लिए डेटा पर 60 गुना पास करना होगा।

यह अंतर क्यों (5 बनाम 60)? या मुझ से कुछ गलत हो रहा है?





gradient-descent