【问题标题】:Cross validation and pipeline in sci-kit learnscikit learn中的交叉验证和管道
【发布时间】:2015-06-22 14:39:33
【问题描述】:

对于机器学习项目,我正在尝试使用从文本中提取的特征来预测分类结果变量。

使用交叉验证,我将 X 和 Y 拆分为测试集和训练集。训练集使用管道进行训练。但是,当我使用测试集中的 X 计算性能时,我的性能是 0.0。这是还没有从 X_test 中提取特征的时候。

是否可以在管道中拆分数据集?

我的代码:

X, Y = read_data('development2.csv')

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42)

train_pipeline = Pipeline([('vect', CountVectorizer()), #ngram_range=(1,2), analyzer='word'
                 ('tfidf', TfidfTransformer(use_idf=False)),
                 ('clf', OneVsRestClassifier(SVC(kernel='linear', probability=True))),
                 ])

train_pipeline.fit(X_train, Y_train)

predicted = train_pipeline.predict(X_test)

print accuracy_score(Y_test, predicted)

使用 SVC 时的回溯:

File     "/Users/Robbert/Documents/pipeline.py", line     62, in <module>
train_pipeline.fit(X_train, Y_train)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/pipeline.py", line 130, in fit
self.steps[-1][-1].fit(Xt, y, **fit_params)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 138, in fit
y = self._validate_targets(y)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 441, in _validate_targets
y_ = column_or_1d(y, warn=True)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 319, in column_or_1d
raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (670, 5)

【问题讨论】:

  • 在管道中拆分它会完成什么?你的方法对我来说看起来不错,但你应该简化你的管道:使用 TfidfVectorizer 而不是 CountVectorizer + TfidfTransformer 并且不要将 SVC 包装在 OneVsRestClassifier 中。 SVC 已经可以处理多个类。如果性能不够好,可以考虑为 SVC 使用其他分类器或内核,获取更多数据,使用不同的预处理方法等。
  • 感谢您的回复。我已经使用 TfidfVectorizer 更改了管道。现在我收到这条消息:ValueError: bad input shape (670, 5)。当我使用单独的功能时,我没有收到一条消息。有什么想法吗?
  • 我不确定。试着把它们分开;删除 OneVsRestClassifier 有帮助吗?
  • 我发现,当我使用不同的分类器(例如 K-NN)时,我没有得到 ValueError。但是,当我使用没有 OneVsRestClassifier 或 Logistic 回归的 SVC 时,错误返回。
  • 你能发布完整的回溯吗?另外,我建议不要使用“probability=True”。如果您的数据集较大,请使用 LinearSVC(dual=False) 而不是 SVC(kernel="linear")。

标签: python machine-learning scikit-learn classification


【解决方案1】:

我解决了这个问题。

目标变量 (Y) 的格式不正确。变量的存储方式如下:[[0 0 0 0 1],[0 0 1 0 0]]。我将其转换为不同的数组格式,如下所示:[5, 3]

这对我有用。

感谢所有回答。

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2016-04-25
    • 2017-09-02
    • 2012-10-14
    • 2019-07-04
    • 1970-01-01
    • 2012-01-07
    • 2020-09-04
    • 2016-05-09
    相关资源
    最近更新 更多