评分系统 – 输入特性

我正在开发一个评分系统(毕业项目)。我已经对数据进行了预处理,然后在数据上使用了TfidfVectorizer,并使用LinearSVC来拟合模型。

系统的运行如下,它包含265个定义,长度各不相同;但总共,它们的形状为(265, 8581),因此当我尝试输入一些新的随机句子进行预测时,我收到了如下信息

错误信息

如果你想的话,可以查看所使用的代码(完整且较长);

使用的代码;

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_sentencedef 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_wordsdef 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_sentencesdef featureExtraction(data):    vectorizer = TfidfVectorizer(min_df=10, max_df=0.75, ngram_range=(1,3))    tfidf_data = vectorizer.fit_transform(data)    return tfidf_datadef 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)

回答:

你从未在测试数据上调用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)    # 这里我同样返回了用于生成训练数据的向量化器    return vectorizer, tfidf_data......tfidf_vectorizer, tfidf_data = featureExtraction(data)......# 现在在测试数据上使用相同的向量化器X_test= tfidf_vectorizer.transform(Xnew)...

在你的代码中,你使用了一个新的TfidfVectorizer,这显然不会知道训练数据,并且不知道训练数据有8581个特征。

测试数据的准备方式应该始终与训练数据的准备方式相同。否则,即使你没有得到错误,结果也是错误的,模型在实际情况下的表现也不会如预期那样。

请查看我关于不同特征预处理技术的类似情况的其他回答:

我本可以将这个问题标记为上述问题的重复,但看到你完全使用了一个新的向量化器,并且有不同的方法来转换训练数据,我回答了这个问题。从下次开始,请先搜索问题并尝试理解在类似情况下发生了什么,然后再发布问题。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注