sklearn预测新文本(unseen new data),而不是train_test_split分割出来的测试集:解决方案

首先写在前面,对于大神们来说,这个问题可能不值得一提。。。


sklearn预测新文本(unseen new data),而不是train_test_split分割出来的测试集:解决方案_第1张图片
笑哭

问题描述:当我在用sklearn框架时,遇到一个问题,一般会用train_test_split去对数据进行训练集,测试集分割,然后用训练集去训练分类器,然后正常情况下,一般会用classifier.predict(test_set),得到一个预测结果,但我想要的是对全新的原始数据去预测结果,那要怎么去做呢?然后自然是搜索引擎一顿搜,但发现无论是百度还是google都没找到,很奇怪啊,应该是一个很常见的问题呀!最后的解决方法如下:

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer

from sklearn.externals import joblib

vectorizer = CountVectorizer(min_df=1)

count = vectorizer.fit_transform(corpus)  # corpus是之前的文本,经过去停用词的预处理操作

transformer = TfidfTransformer()

tfidf = transformer.fit_transform(count) 

# 这四句话只是常见的提取特征的方法

X_train, X_test, y_train, y_test = train_test_split(tfidf, flag, test_size=0.2)

clf = MultinomialNB().fit(X_train, y_train)  # 这里只是用朴素贝叶斯做个示例

joblib.dump(clf, 'model.pkl')  # 保存分类器

joblib.dump(vectorizer, 'count_vect')  # 保存矢量化,这就是解决问题的核心代码

# 因为需要使用和训练器相同的矢量器,不然会报错,提示ValueError dimension mismatch...

new_data = []  # 原始文本

count_vect = joblib.load('count_vect')

tfidf_transformer = TfidfTransformer()

X_new_counts = count_vect.transform(after_process)

X_new_tfidf = tfidf_transformer.fit_transform(X_new_counts)

predicted = clf.predict(X_new_tfidf)

其中joblib也很好用,因为可以将训练好的分类器,矢量保存在本地,这样就不用重复去运行代码去训练了。。。其实在现在各种深度学习的今天,常规的算法还是要掌握的,同时sklearn框架对常规的算法,特征处理方面的支持与tf相比也有更好的支持,所以都要学!!!

你可能感兴趣的:(sklearn预测新文本(unseen new data),而不是train_test_split分割出来的测试集:解决方案)