【问题标题】:Scikit Learn - ValueError: X has 26879 features per sample; expecting 7087Scikit Learn - ValueError: X 每个样本有 26879 个特征;期待 7087
【发布时间】:2015-05-01 00:14:57
【问题描述】:

我正在做特征选择,首先使用 L1 惩罚训练 LogisticRegression,然后使用减少的特征集使用 L2 惩罚重新训练模型。现在,当我尝试预测测试数据时,对其执行的 transform() 会产生一个不同的维度数组。我对如何重新调整测试数据的大小以便能够预测感到困惑。

感谢任何帮助。谢谢。

vectorizer = CountVectorizer()
output = vectorizer.fit_transform(train_data)
output_test = vectorizer.transform(test_data)

logistic = LogisticRegression(penalty = "l1")
logistic.fit(output, train_labels)
predictions = logistic.predict(output_test)

logistic = LogisticRegression(penalty = "l2", C = i + 1)
output = logistic.fit_transform(output, train_labels)
predictions = logistic.predict(output_test)

最后一个预测行显示了以下错误消息。原始特征数为 26879:

ValueError: X has 26879 features per sample; expecting 7087

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    这里似乎有一些问题。 首先,我建议你给这两个逻辑模型起不同的名字,因为你需要两者来进行预测。 在您的代码中,您永远不会调用 l1 逻辑回归的转换,这不是您所说的想要做的。 你应该做的是

    l1_logreg = LogisticRegression(penalty="l1")
    l1_logreg.fit(output, train_labels)
    out_reduced = l1_logreg.transform(out)
    out_reduced_test = l1_logreg.transform(out_test)
    l2_logreg = LogisticRegression(penalty="l2")
    l2_logreg.fit(out_reduced, train_labels)
    pedictions = l2_logreg.predict(out_reduced_test)
    

    pipe = make_pipeline(CountVectorizer(), LogisticRegression(penalty="l1"),
                         LogisticRegression(penalty="l2"))
    pipe.fit(train_data, train_labels)
    preditions = pipe.predict(test_data)
    

    仅供参考,我不希望它比仅执行 l2 logreg 更好。你也可以试试 SGDClassifier(penalty="elasticnet")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2015-11-13
      • 2020-10-03
      • 2020-05-21
      • 2019-12-17
      • 2015-05-07
      • 2016-05-15
      相关资源
      最近更新 更多