评分系统 - 输入功能
Posted
技术标签:
【中文标题】评分系统 - 输入功能【英文标题】:Grading System - Input Features 【发布时间】:2018-11-05 09:44:39 【问题描述】:我正在研究评分系统(毕业项目)。我已经对数据进行了预处理,然后在数据上使用了 TfidfVectorizer 并使用 LinearSVC 来拟合模型。
系统如下,它有265个定义,任意长度;但总的来说,它们的形状为 (265, 8581 ) 所以当我尝试输入一些新的随机句子来预测它时,我收到了这条消息
Error Message
如果您愿意,可以查看使用的代码 ( 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)
【问题讨论】:
是否可以粘贴完整的错误信息?查找问题变得容易一些。谢谢! @HarisNadeem 感谢您的回复,我已编辑问题以添加错误消息的屏幕截图。请看一看! 请不要将屏幕截图用于文本。将其格式化为代码。 你确实有很多代码让我阅读。哈哈。但据我所知,您的问题来自这里:vectorizer = TfidfVectorizer(min_df=1, max_df=1.0, ngram_range=(1,3))
。从文档中可以看出,这导致单词缩小到 18 个。使用TfidfTransformer
会更好吗?
(PS 我不知道解决方案,但我正在尝试阅读文档并查看潜在错误的来源)
【参考方案1】:
您永远不会在测试中调用 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 个特征。
应始终以与准备训练数据相同的方式准备测试数据。否则,即使您没有出错,结果也是错误的,模型在实际情况下也不会像那样执行。
查看我的其他答案,解释不同特征预处理技术的类似情况:
https://***.com/a/47205199/3374996 https://***.com/a/50461140/3374996 https://***.com/a/44671967/3374996我会将此问题标记为其中一个问题的副本,但是看到您完全使用新的矢量化器并且有不同的方法来转换火车数据,我回答了这个问题。从下次开始,请先搜索问题并尝试了解类似情况下发生的情况,然后再发布问题。
【讨论】:
以上是关于评分系统 - 输入功能的主要内容,如果未能解决你的问题,请参考以下文章