Проблема с использованием `transform` против` fit_transform` в CountVectorizer - PullRequest
0 голосов
/ 24 августа 2018

Я успешно обучил и протестировал модель логистической регрессии с CountVectorizer() как таковым:

def train_model(classifier, feature_vector_train, label):
    # fit the training dataset on the classifier
    classifier.fit(feature_vector_train, label)

    return classifier

def getPredictions (classifier, feature_vector_valid):    
    # predict the labels on validation dataset
    predict = classifier.predict(feature_vector_valid)

    return metrics.accuracy_score(predict, valid_y)

def createTrainingAndValidation(column):
    global train_x, valid_x, train_y, valid_y
    train_x, valid_x, train_y, valid_y = model_selection.train_test_split(finalDF[column], finalDF['DeedType1'])

def createCountVectorizer(column):
    global xtrain_count, xvalid_count
    # create a count vectorizer object 
    count_vect = CountVectorizer()
    count_vect.fit(finalDF[column])

    # transform the training and validation data using count vectorizer object
    xtrain_count =  count_vect.transform(train_x)
    xvalid_count =  count_vect.transform(valid_x)

createTrainingAndValidation('Test')
createCountVectorizer('Test')
classifier = train_model(linear_model.LogisticRegression(), xtrain_count, train_y, xvalid_count)
predictions = getPredictions(classifier, xvalid_count)

Я использовал DataFrame с именем finalDF со всем помеченным текстом.Так как эта модель дает мне точность 0,68, я собирался протестировать ее на подмножестве DataFrame с неизвестной меткой.Это не было включено в фазу обучения и тестирования.Я сохранил обученную модель как bestClassifier.

Теперь я получил подмножество неизвестного текста и попытался сделать следующее:

count_vect = CountVectorizer()
count_vect.fit(unknownDf['Text'])
text = unknownDf['Text']
xvalid_count =  count_vect.transform(text)

bestClassifier.predict(xvalid_count)

finalDF имеет 800 строк, а unknownDfимеет только 32 строки после того, что я делаю выше. Как мне исправить это?

1 Ответ

0 голосов
/ 24 августа 2018

Кажется, я вижу, что происходит. В этом кусочке кода:

def createCountVectorizer(column):
    global xtrain_count, xvalid_count
    # create a count vectorizer object 
    count_vect = CountVectorizer()
    count_vect.fit(finalDF[column])

    # transform the training and validation data using count vectorizer object
    xtrain_count =  count_vect.transform(train_x)
    xvalid_count =  count_vect.transform(valid_x)

Вы объявляете CountVectorizer(), звоните fit, а затем transform.Что вам нужно сделать, это использовать то же самое CountVectorizer() до transform на unknownDf['Text'].

Когда вы делаете это:

count_vect = CountVectorizer()
count_vect.fit(unknownDf['Text'])
text = unknownDf['Text']
xvalid_count =  count_vect.transform(text)

Вы создаете совершенно новый CountVectorizer(), который создает новый пакет слов для unknownDf['Text'], когда то, что вы должны делать,удалив эти две строки

count_vect = CountVectorizer()
count_vect.fit(unknownDf['Text'])

и пусть существующий CountVectorizer(), который вы FIT на finalDF[column], используйте для transform unknownDf['Text'].

Найдите способ ИСПОЛЬЗОВАТЬ CountVectorizer() в вашем createCountVectorizer(column), который вы объявили от count_vect до transform unknownDf['Text'].

...