首先写在前面,对于大神们来说,这个问题可能不值得一提。。。
问题描述:当我在用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相比也有更好的支持,所以都要学!!!