【发布时间】:2016-01-02 01:46:43
【问题描述】:
我有一个包含文档及其描述的文本文件。我正在使用 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))
错误:
Traceback(最近一次调用最后一次):
文件“test.py”,第 106 行,在 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 行,在决策函数中 % (X.shape[1], n_features))
ValueError: X 每个样本有 78 个特征;预计 206
所以基本上虽然它已经识别了重要的特征,但它不能在预测测试数据时使用它们。
任何关于我如何在测试数据上使用变换方法的建议都将受到广泛赞赏。 我只想使用重要的功能,并寻找可以帮助做到这一点的方法,只是为了更清楚。 谢谢。
【问题讨论】:
-
重要的功能建议大家看看TfIdfVectorizer。有了它,您将能够指定一个
min_df,它可以帮助您提取文档中更重要的特征。
标签: python scikit-learn