Система оценок - входные характеристики - PullRequest
0 голосов
/ 26 мая 2018

Я работаю над оценочной системой (дипломный проект).Я предварительно обработал данные, затем использовал TfidfVectorizer для данных и использовал LinearSVC, чтобы соответствовать модели.

Система работает следующим образом, имеет 265 определений произвольной длины;но в итоге они суммируются в форме (265, 8581), поэтому, когда я пытаюсь ввести какое-то новое случайное предложение, чтобы предсказать его, я получаю это сообщение

Сообщение об ошибке

вы можете взглянуть на используемый код (Full & long), если хотите;

Используемый код;

def normalize(df):
    lst = []
    for x in range(len(df)):
        text = re.sub(r"[,.'!?]",'', df[x])
        lst.append(text)
    filtered_sentence = ' '.join(lst)
    return filtered_sentence


def stopWordRemove(df):
    stop = stopwords.words("english")
    needed_words = []
    for x in range(len(df)):

        words = word_tokenize(df)
        for word in words:
            if word not in stop:
                needed_words.append(word)
    return needed_words


def prepareDataSets(df):
    sentences = []
    for index, d in df.iterrows():
        Definitions = stopWordRemove(d['Definitions'].lower())
        Definitions_normalized = normalize(Definitions)
        if d['Results'] == 'F':
            sentences.append([Definitions, 'false'])
        else:
            sentences.append([Definitions, 'true'])
    df_sentences = DataFrame(sentences, columns=['Definitions', 'Results'])
    for x in range(len(df_sentences)):
        df_sentences['Definitions'][x] = ' '.join(df_sentences['Definitions'][x])
    return df_sentences

def featureExtraction(data):
    vectorizer = TfidfVectorizer(min_df=10, max_df=0.75, ngram_range=(1,3))
    tfidf_data = vectorizer.fit_transform(data)
    return tfidf_data

def learning(clf, X, Y):
    X_train, X_test,  Y_train, Y_test = \
    cross_validation.train_test_split(X,Y, test_size=.2,random_state=43)
    classifier = clf()
    classifier.fit(X_train, Y_train)
    predict = cross_validation.cross_val_predict(classifier, X_test, Y_test, cv=5)
    scores = cross_validation.cross_val_score(classifier, X_test, Y_test, cv=5)
    print(scores)
    print ("Accuracy of %s: %0.2f(+/- %0.2f)" % (classifier, scores.mean(), scores.std() *2))
    print (classification_report(Y_test, predict))

Затем я запускаю эти сценарии: которые я получаю вышеупомянутую ошибку после

test = LinearSVC()
data, target = preprocessed_df['Definitions'], preprocessed_df['Results']
tfidf_data = featureExtraction(data)
X_train, X_test,  Y_train, Y_test = \
cross_validation.train_test_split(tfidf_data,target, test_size=.2,random_state=43)
test.fit(tfidf_data, target)
predict = cross_validation.cross_val_predict(test, X_test, Y_test, cv=10)
scores = cross_validation.cross_val_score(test, X_test, Y_test, cv=10)
print(scores)
print ("Accuracy of %s: %0.2f(+/- %0.2f)" % (test, scores.mean(), scores.std() *2))
print (classification_report(Y_test, predict))
Xnew = ["machine learning is playing games in home"]
tvect = TfidfVectorizer(min_df=1, max_df=1.0, ngram_range=(1,3))
X_test= tvect.fit_transform(Xnew)
ynew = test.predict(X_test)

1 Ответ

0 голосов
/ 26 мая 2018

Вы никогда не звоните fit_transform() на тесте, только transform() и используете тот же векторизатор, который используется для данных тренировки.

Сделайте следующее:

def featureExtraction(data):
    vectorizer = TfidfVectorizer(min_df=10, max_df=0.75, ngram_range=(1,3))
    tfidf_data = vectorizer.fit_transform(data)

    # Here I am returning the vectorizer as well, which was used to generate the training data
    return vectorizer, tfidf_data
...
...
tfidf_vectorizer, tfidf_data = featureExtraction(data)
...
...

# Now using the same vectorizer on test data
X_test= tfidf_vectorizer.transform(Xnew)
...

В своем коде вы используете новый TfidfVectorizer, который, очевидно, не будет знать о данных обучения, а также не будет знать, что данные обучения имеют 8581 функцию.

Данные испытаний должны быть подготовлены так же, как вы готовите данные поезда, всегда.Иначе, даже если вы не получите ошибку, результаты неверны, и модель не будет работать так в реальных сценариях.

См. Мои другие ответы, объясняющие аналогичную ситуацию для различных методов предварительной обработки признаков:

Я бы пометил этот вопрос как дубликат одного из них, но, увидев, что вы используете новый векторизатор и у вас есть другой метод преобразования данных о поездах, я ответил на это.В следующий раз, прежде чем опубликовать вопрос, пожалуйста, сначала найдите проблему и попытайтесь понять, что происходит в похожих сценариях.

...