2015-10-05 23 views
0

我有一個包含文檔及其說明的文本文件。我使用scikit-learn中的SGD Classifier來獲取兩個獨立的文檔類。我已經使用以下代碼訓練了我的模型:scikit-learn SGD文檔分類器:僅使用重要功能

fo = open('training_data.txt','rb') 
all_classes = np.array([0,1]) 

for i,line in enumerate(generate_in_chunks(fo,1000)): 

    x = [member.split('^')[2] for member in line if member!="\n"] 
    y = [member.split('^')[1] for member in line if member!="\n"] 
    vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18,non_negative=True) 

    x_train = vectorizer.transform(x) 
    y_train = np.asarray(y,dtype=int) 

    clf = SGDClassifier(loss='log',penalty='l2',shuffle=True) 

    clf.partial_fit(x_train, y_train,classes=all_classes) 

現在我在測試數據集上使用此clf對象。在這裏,我想使用教程變換提到: http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier

代碼:

fo = open('test_data.txt','rb') 
prob_comp = open('pred_prob_actual.txt','wb') 
for i,line in enumerate(generate_in_chunks(fo,21000)): 
    x = [member.split('^')[2] for member in line if member!="\n"] 
    y = [member.split('^')[1] for member in line if member!="\n"] 

    vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18,non_negative=True) 

    x_test = vectorizer.transform(x) 
    y_test = np.asarray(y,dtype=int) 

    clf.predict(clf.transform(x_test)) 

錯誤:

回溯(最近通話最後一個):

文件 「test.py」 ,第106行,在 clf.predict(clf.transform(x_test)) 文件「/opt/anaconda2.2/lib/python2.7/site-packages/sklearn/linear_model/base.py」,第223行,in預測 scores = self.decision_function(X) 文件「/opt/anaconda2.2/lib/python2.7/site-packages/sklearn/linear_model/base.py」,行204,在decision_function %(X.shape [ 1],n_features))

ValueError:X每個樣本有78個特徵;因此,基本上雖然它已經確定了重要的功能,但在預測測試數據時無法使用它們。

任何有關如何在測試數據上使用變換方法的建議將受到廣泛讚賞。 我只想使用重要功能並尋找可以幫助實現這一目的的方法,只是爲了使其更加清晰。 謝謝。

+0

對於重要的特點,我建議你看一看[TfIdfVectorizer]( http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#sklearn.feature_extraction.text.TfidfVectorizer)。有了它,您可以指定一個'min_df',它可以幫助您提取文檔中更重要的功能。 –

回答

0

更改你的最後一行:

clf.predict(x_test.toarray()) 

您與HashingVectorizer將您的數據集,但這是不夠的。您需要應用toarray()以獲得預測所基於的特徵向量的矩陣。

雖然,爲便於閱讀和「更好」(在我看來)的代碼結構,我會建議你調整你的代碼:

x_train = vectorizer.fit_transform(x) 
... 
x_test = vectorizer.transform(x).toarray() 
y_test = np.asarray(y,dtype=int) 

result = clf.predict(x_test) 

print result 
+0

謝謝主席先生,我想你建議並得到以下錯誤:回溯(最後最近一次調用): 文件「test.py」,線106,在 clf.predict(clf.transform(x_test)。 to_array()) 文件「/opt/anaconda2.2/lib/python2.7/site-packages/scipy/sparse/base.py」,第499行,在__getattr__中 raise AttributeError(attr +「not found」) AttributeError:to_array找不到 –

+0

@PappuJha請現在看看我的答案。它應該解決你的問題。 –

+0

@PappuJha現在怎麼樣?調整行'x_train = fit_transform(x)' –