首先寫在前面,對于大神們來說,這個問題可能不值得一提。。。

問題描述:當(dāng)我在用sklearn框架時,遇到一個問題,一般會用train_test_split去對數(shù)據(jù)進行訓(xùn)練集,測試集分割,然后用訓(xùn)練集去訓(xùn)練分類器,然后正常情況下,一般會用classifier.predict(test_set),得到一個預(yù)測結(jié)果,但我想要的是對全新的原始數(shù)據(jù)去預(yù)測結(jié)果,那要怎么去做呢?然后自然是搜索引擎一頓搜,但發(fā)現(xiàn)無論是百度還是google都沒找到,很奇怪啊,應(yīng)該是一個很常見的問題呀!最后的解決方法如下:
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.externals import joblib
vectorizer = CountVectorizer(min_df=1)
count = vectorizer.fit_transform(corpus)? # corpus是之前的文本,經(jīng)過去停用詞的預(yù)處理操作
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')? # 保存矢量化,這就是解決問題的核心代碼
# 因為需要使用和訓(xùn)練器相同的矢量器,不然會報錯,提示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也很好用,因為可以將訓(xùn)練好的分類器,矢量保存在本地,這樣就不用重復(fù)去運行代碼去訓(xùn)練了。。。其實在現(xiàn)在各種深度學(xué)習(xí)的今天,常規(guī)的算法還是要掌握的,同時sklearn框架對常規(guī)的算法,特征處理方面的支持與tf相比也有更好的支持,所以都要學(xué)?。?!