sklearn預測新文本(unseen new data),而不是train_test_split分割出來的測試集:解決方案
首先寫在前面,對於大神們來說,這可能是一個非常弱智的問題。。。
問題描述:當我在用sklearn框架時,遇到一個問題,一般會用train_test_split去對數據進行訓練集,測試集分割,然後用訓練集去訓練分類器,然後正常情況下,一般會用classifier.predict(test_set),得到一個預測結果,但我想要的是對全新的原始數據去預測結果,那要怎麼去做呢?然後自然是搜索引擎一頓搜,但發現無論是百度還是google都沒找到,很奇怪啊,應該是一個很常見的問題呀!最後的解決方法如下:
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformernfrom sklearn.externals import joblibnnvectorizer = CountVectorizer(min_df=1)ncount = vectorizer.fit_transform(corpus) # corpus是之前的文本,經過去停用詞的預處理操作ntransformer = TfidfTransformer()ntfidf = transformer.fit_transform(count) n# 這四句話只是常見的提取特徵的方法nX_train, X_test, y_train, y_test = train_test_split(tfidf, flag, test_size=0.2)nclf = MultinomialNB().fit(X_train, y_train) # 這裡只是用樸素貝葉斯做個示例njoblib.dump(clf, model.pkl) # 保存分類器njoblib.dump(vectorizer, count_vect) # 保存矢量化,這就是解決問題的核心代碼n# 因為需要使用和訓練器相同的矢量器,不然會報錯,提示ValueError dimension mismatch...nnnew_data = [] # 原始文本ncount_vect = joblib.load(count_vect)ntfidf_transformer = TfidfTransformer()nX_new_counts = count_vect.transform(after_process)nX_new_tfidf = tfidf_transformer.fit_transform(X_new_counts)npredicted = clf.predict(X_new_tfidf)n
其中joblib也很好用,因為可以將訓練好的分類器,矢量保存在本地,這樣就不用重複去運行代碼去訓練了。。。
推薦閱讀:
※scikit-learn中如何保存模型?
※『機器學習』—應用Sklearn機器學習的建議
※sklearn中各種分類器回歸器都適用於什麼樣的數據呢?
※Python3《機器學習實戰》學習筆記(七):Logistic回歸實戰篇之預測病馬死亡率