scikit-learn SGD文档分类器:仅使用重要功能

时间:2015-10-05 11:53:19

标签: python scikit-learn

我有一个包含文档及其描述的文本文件。我正在使用scikit中提供的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行,in     clf.predict(clf.transform(x_test))   文件" /opt/anaconda2.2/lib/python2.7/site-packages/sklearn/linear_model/base.py" ;,第223行,预测     得分= 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个特征;期待206

所以基本上虽然已经确定了重要的功能但是在预测测试数据时无法使用它们。

关于如何在测试数据上使用变换方法的任何建议都将受到广泛赞赏。 我只想使用重要功能,并寻找可以帮助实现这一目标的方法,只是为了让它更清晰。 感谢。

1 个答案:

答案 0 :(得分:1)

将您的最后一行更改为:

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 才能获得预测所依据的特征向量矩阵。

虽然为了可读性而且为了更好的" (在我看来)代码结构我建议你将代码调整为:

regexpmapper