2014-03-26 85 views
3

我有一個關於在sklearn文本分類中使用交叉驗證的問題。在交叉驗證之前矢量化所有數據是有問題的,因爲分類器會「看到」測試數據中出現的詞彙。 Weka已經過濾分類器來解決這個問題。什麼是這個函數sklearn等價物?我的意思是對於每一次摺疊,特徵集都會有所不同,因爲訓練數據是不同的。sklearn:矢量化交叉驗證文本分類

+0

我認爲這個問題在名爲「交叉驗證」的堆棧交換機器學習和統計站點上可能會有更好的接收。 – waTeim

+0

這個問題似乎是脫離主題,因爲它屬於http://stats.stackexchange.com/ –

+0

澄清:它不脫離主題,因爲這個問題特別是在sklearn文本分類CV。數值數據不會出現這個問題,因爲該特徵集對於任何摺疊都是固定的,但對於文本分類中的每一次摺疊都是不同的。 – user3466018

回答

4

的scikit學習解決這個問題是交叉驗證估計的Pipeline,例如:

>>> from sklearn.cross_validation import cross_val_score 
>>> from sklearn.feature_extraction.text import TfidfVectorizer 
>>> from sklearn.pipeline import Pipeline 
>>> from sklearn.svm import LinearSVC 
>>> clf = Pipeline([('vect', TfidfVectorizer()), ('svm', LinearSVC())]) 

clf是現在做的特徵提取和SVM模型擬合的複合估計。鑑於文件列表(即一個普通的Python字符串的listdocuments及其標籤y,呼籲

>>> cross_val_score(clf, documents, y) 

會做特徵提取每個單獨摺疊,使每一個支持向量機只知道它(k的詞彙-1)摺疊訓練集。

+0

非常感謝!我測試了您的解決方案,與無管道方法相比,它報告的準確性數字不同。是否有任何方法可以打印出每個關鍵詞的詞彙大小,以便驗證?我打印出「clf」的特徵集大小,並且數字與我從無管線方法中獲得的數量相同。 – user3466018

+0

@ user3466018不是開箱即用,但是您可以實現一個無操作的轉換器,它可以打印'X.shape [1]'並將其堆疊到管道中。 (或者實現一個自定義記錄器,或者破解向量代碼來報告這個。) –