0

증분 학습 모델을 구축했지만 옳은지 또는 잘못되었는지 잘 모르겠습니다. 저는 2 개의 교육 데이터가 먼저 20000 개의 행으로 이루어져 있고 두 번째로 10000 개의 행으로 이루어져 있습니다. 두 개의 열 설명 및 ID가 있습니다. ... 오프라인의 경우 내 모델은 주어진 설명에 대한 올바른 ID를 분류되어 제대로 작동 학습에 .. datafile_train는 datafile_train1 먼저 훈련 데이터를 두 번째 훈련 데이터입니다 내가 증분SGDCllassifier partial_fit 메서드를 사용하여 증분/온라인 학습

1 SGDClassifier 및 partial_fit 방법을 사용하고 있습니다) Countvectorizer, tfidf 및 partial_fit

vectorizer = CountVectorizer() 
tfidf_transformer = TfidfTransformer() 
X_train = vectorizer.fit_transform(datafile_train.loc[:,'description']) 
X_train_tfidf = tfidf_transformer.fit_transform(X_train) 
clf = linear_model.SGDClassifier(penalty='l2',loss='hinge') 
prd=clf.partial_fit(X_train_tfidf, datafile_train.loc[:,'taxonomy_id'],classes=np.unique(datafile_train.loc[:,'taxonomy_id'])) 
전 분류 절인이 후 6,

증분 학습 다음 partial_fit에

2) 산 세척 및 분급 unpickling를 이용해 다시 unpickled

def store(prd): 
    import pickle 
    filename = "incremental" 
    f = open(filename, 'wb') 
    pickle.dump(prd, f) 
    f.close() 
store(prd) 

def train_data(): 
    import pickle 
    f = open('incremental', 'rb') 
    classifier = pickle.load(f) 
    f.close() 
    return classifier 
    clfp=train_data() 

3) 다시 Countvectorizer 새로운 데이터

대 TFIDF 및 partial_fit
vectorizer = CountVectorizer() 
tfidf_transformer = TfidfTransformer() 
X_train1 = vectorizer.fit_transform(datafile_train1.loc[:,'description']) 
X_train_tfidf1 = tfidf_transformer.fit_transform(X_train1) 
prd1=clfp.partial_fit(X_train_tfidf1, datafile_train1.loc[:,'taxonomy_id']) 
# here clfp is previously trained data which is unpickled 

나는 이와 같은 빌드 모델을 가지고 있지만 피클 파일 (처음으로 훈련 된 데이터)의 크기를 확인하면 5MB이고이 모델을 사용하여 새 데이터를 학습 한 때 두 번째 partial fit에 참조하십시오. 새 데이터를 훈련 한 후 clfp (5 MB 크기)를 사용한 후 두 번째 partial_fit에 대한 피클 열차 파일을 만들었습니다. 이전에 훈련 된 데이터에 대한 새 데이터를 학습 중이므로 업데이트해야하는 크기는 5 MB뿐입니다. Is Is 점진적/온라인 학습을 달성하기위한 올바른 방법 ?? 당신이 코드

를 사용하여 설명하고이 오류가 발생하는 경우가 좋은 것, 그래서 내가 기계 학습에 새로운 오전 도와주세요

ValueError: Number of features 125897 does not match previous data 124454. 

**** 편집 (Hashingvectorizer 사용)

hashing = HashingVectorizer() 
X_train_hashing=hashing.fit_transform(datafile_train.loc[:,'description']) 
clf = linear_model.SGDClassifier(penalty='l2',loss='hinge') 
prd=clf.partial_fit(X_train_hashing, datafile_train.loc[:,'taxonomy_id'],classes=np.unique(datafile_train.loc[:,'taxonomy_id'])) 
def store(prd): 
    import pickle 
    filename = "inc" 
    f = open(filename, 'wb') 
    pickle.dump(prd, f) 
    f.close() 
store(prd) 
def train_data(): 
    import pickle 
    f = open('inc', 'rb') 
    classifier = pickle.load(f) 
    f.close() 
    return classifier 
clfp=train_data() 

지금 나는 다음 partial_fit에 clfp 열차 모델을 사용 중입니다

X_train_hashing1=hashing.transform(datafile_train1.loc[:,'description']) 
prd1=clfp.partial_fit(X_train_hashing1, datafile_train1.loc[:,'taxonomy_id']) 
def store(prd1): 
    import pickle 
    timestr = time.strftime("%Y%m%d-%H%M%S") 
    filename = "Train-" + timestr +".pickle" 
    f = open(filename, 'wb') 
    pickle.dump(prd1, f) 
    f.close() 
store(prd1) 

편집은 오류가 아니지만 피클 파일의 크기는 모두 동일합니다. 25.2 MB이지만 두 번째 피클 크기는 첫 번째 피클 크기보다 커야합니다.

+0

SGDClassifier에서'partial_fit()'을 사용하려는 노력은 CountVectorizer와 TfidfTransformer를 재 맞추기 때문에 취소됩니다. 원본을 저장 한 다음 데이터의 두 번째 부분에 사용해야합니다. 하지만 그들은'partial_fit()'메서드를 사용하지 않습니다 !!! 따라서 점진적 교육을 원할 경우 다른 트랜스포머를 위해 전환해야합니다. –

+0

@VivekKumar 귀하의 응답을 보내 주셔서 감사합니다. 내 코드를 편집 해주십시오. – outlier

+0

@outlier, 데이터 prd1의 두 번째 일괄 처리를 훈련 할 때 "모든 유효한 라벨을 포함해야하는 클래스"오류가 표시되지 않습니까? – user1

답변

1

저장된 모델 크기가 많이 증가 시키거나 어쩌면 전혀 증가시키지 마십시오.

모델은 partial_fit()으로 전송 된 전체 새로운 데이터를 저장하지 않고 해당 데이터를 기반으로 속성 만 업데이트합니다. 일단 유형 (float32, float64 등)에 따라 일부 저장 공간이 할당 된 속성은 해당 값과 상관없이 많은 공간을 차지합니다. SGDClassifier 변화할지

주목할만한 특성은 : - : n_classes의 == 다른 2 (n_classes, n_features) 가중치 기능에 할당 된 경우에 어레이 형상 (1 n_features)

coef_.

intercept_ : 배열, shape (1,) if n_classes == 2 else (n_classes,) 결정 함수의 상수.

이 중 하나를 할당하거나 partial_fit()에 첫 번째 데이터를 전달하면 모두가 이러한 값은 예측을 통해 손실을 최소화하기 위해 노력하고 데이터에 따라 업데이트됩니다, 0으로 초기화되지 당신이 모델을 초기화 할 때, 그들은있다.

새 데이터를 전달하면이 값은 다시 업데이트되지만 해당 유형 (float32, float64 등)과 동일한 저장 공간을 계속 차지합니다.

저장된 모델의 크기가 변경되지 않은 이유는 다음과 같습니다.

+0

답변에 따라 모델이 점진적으로 작동하고 있습니까? 내 모델이 교육 자료를 모두 교육했는지 여부를 확인할 수있는 방법이 있습니까? 첫 번째 모델 -> print (prd.coef_)에 대해 [[0. 0. 0. ..., 0. 0. 0.]을 제공하는 두 가지 모델의 특성을 인쇄하려고했습니다. [0. 0. 0 .0, 0 0.] [0. 0. 0. ..., 0. 0. 0.]]와 print (prd.intercept_)는 [-0.26029437 0.07395285 -0.2551581]이된다. – outlier

+0

2) 두 번째 모델 ---> print (prd1.coef_)는 [[0. 0. 0. ..., 0. 0. 0.] [0. 0. 0. ..., 0. 0. 0 .] [0. 0. 0. ..., 0. 0. 0.]] 및 print (prd1.intercept_)는 [-0.2859673 0.0863299 -0.26940698]이 두 모델의 특성을보고 어떻게 생각합니까? – outlier

+0

@outlier. 'partial_fit()'를 사용했고 모델을 덤핑하고로드하는 동안 오류가 없다고 가정하기 때문에 이것은 점진적 훈련입니다. 확인과 관련하여 두 데이터에서 테스트 세트를 시도하고 레이블을 예측 한 다음이를 기반으로 측정 기준을 계산할 수 있습니다. 어쨌든,'coef_'의 실제 데이터와 완전한 출력이 없으면 아무 것도 말할 수 없습니다. –