Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 评分系统-输入特征_Python_Machine Learning_Scikit Learn_Svm_Data Science - Fatal编程技术网

Python 评分系统-输入特征

Python 评分系统-输入特征,python,machine-learning,scikit-learn,svm,data-science,Python,Machine Learning,Scikit Learn,Svm,Data Science,我正在做一个评分系统(毕业设计)。我对数据进行了预处理,然后对数据使用TfidfVectorizer,并使用LinearSVC拟合模型 该系统如下,它有265个定义,任意长度;但总的来说,它们的形状是(2658581) 所以当我尝试输入一些新的随机句子来预测它时,我得到了这个信息 如果愿意,您可以查看所使用的代码(完整和长代码) 使用的代码 def normalize(df): lst = [] for x in range(len(df)): text = r

我正在做一个评分系统(毕业设计)。我对数据进行了预处理,然后对数据使用TfidfVectorizer,并使用LinearSVC拟合模型

该系统如下,它有265个定义,任意长度;但总的来说,它们的形状是(2658581) 所以当我尝试输入一些新的随机句子来预测它时,我得到了这个信息

如果愿意,您可以查看所使用的代码(完整和长代码)

使用的代码

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)

您从未在测试时调用
fit\u 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)
...
在您的代码中,您正在使用一个新的TFIDFvectorier,它显然不知道训练数据,也不知道训练数据具有8581个特性

测试数据的准备方式应始终与列车数据的准备方式相同。否则,即使您没有得到错误,结果也是错误的,并且模型在实际场景中也不会像这样执行

请参阅我的其他答案,解释不同特征预处理技术的类似情况:


我会将这个问题标记为其中一个问题的副本,但是看到您正在使用一个新的矢量器,并且有一种不同的方法来转换列车数据,我回答了这个问题。从下次开始,请先搜索问题并尝试了解类似情况下发生的情况,然后再发布问题。

是否可以粘贴完整的错误消息?查找问题会变得更容易一些。谢谢@谢谢你的回复,我已经编辑了这个问题,添加了错误信息的截图。请看一看!请不要在文本中使用截图。把它格式化为代码。你真的有很多代码让我读。哈哈。但据我所知,你的问题来自这里:
vectorizer=TfidfVectorizer(最小值df=1,最大值df=1.0,ngram\u范围=(1,3))
。从文档中可以看出,这导致单词数量减少到了18个。使用
TfidfTransformer
会更好吗?(顺便说一句,我不知道解决方案,但我正在阅读文档,看看潜在的错误是从哪里产生的)