【问题标题】:scikit-learn SGD Document Classifier : Using important features onlyscikit-learn SGD 文档分类器:仅使用重要功能
【发布时间】: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


【解决方案1】:

将最后一行更改为:

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

【讨论】:

  • 谢谢先生,我按照您的建议进行了尝试,但出现以下错误: Traceback(最近一次调用最后一次):文件“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 not found
  • @PappuJha 现在请看我的回答。它应该可以解决您的问题。
  • @PappuJha 现在怎么样?调整x_train = fit_transform(x)的行
  • 工作代码:x_test = vectorizer.transform(x) y_test = np.asarray(y,dtype=int) result = clf.predict(x_test) 打印结果 我相信这段代码使用了所有的特性但我只想使用重要的功能。您更新的答案是否解决了我的担忧。谢谢!!
  • @PappuJha 但是,您需要将其作为array() 才能使预测正常工作。
猜你喜欢
  • 2014-09-02
  • 2014-10-22
  • 2016-08-09
  • 2014-08-09
  • 2017-10-13
  • 2016-07-15
  • 2016-05-16
  • 2015-05-09
  • 2018-09-22
相关资源
最近更新 更多