【问题标题】:Classifying new documents after cross_val_predict在 cross_val_predict 之后对新文档进行分类
【发布时间】:2017-06-08 13:34:14
【问题描述】:

我有一个包含大约 10,000 条推文的样本,我想将它们分类为“相关”和“不相关”类别。我正在为这个模型使用 Python 的 scikit-learn。我手动将 1,000 条推文编码为“相关”或“不相关”。然后,我运行了一个 SVM 模型,使用 80% 的手动编码数据作为训练数据,其余的作为测试数据。我获得了不错的结果(预测准确度约为 0.90),但为了避免过度拟合,我决定对所有 1000 条手动编码的推文使用交叉验证。

下面是我在获取示例中推文的 tf-idf 矩阵后的代码。 “target”是一个数组,列出推文是被标记为“相关”还是“不相关”。

from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_val_predict

clf = SGDClassifier()
scores = cross_val_score(clf, X_tfidf, target, cv=10)
predicted = cross_val_predict(clf, X_tfidf, target, cv=10)

使用此代码,我能够预测 1,000 条推文所属的类别,并且可以将其与我的手动编码进行比较。

为了使用我的模型对我没有手动编码的其他约 9,000 条推文进行分类,我一直在思考下一步该做什么。我想再次使用cross_val_predict,但我不确定第三个参数应该放什么,因为我想预测的是类。

提前感谢您的所有帮助!

【问题讨论】:

    标签: python twitter machine-learning scikit-learn classification


    【解决方案1】:

    cross_val_predict 是不是从模型中实际获得预测的方法。交叉验证是一种模型选择/评估技术,不适合训练模型。 cross_val_predict 是一个非常具体的函数(它可以为您提供许多模型的预测,在交叉验证过程中进行训练)。对于实际的模型构建,您应该使用 fit 来训练您的模型并使用 predict 来获得预测。这里不涉及交叉验证 - 如前所述 - 这是用于模型选择(选择分类器、超参数等)而不是训练实际模型。

    【讨论】:

    • 谢谢,@lejlot!对于cross_val_predict,我仍然有些困惑。它究竟返回了什么?另外,假设我为 SVM 和朴素贝叶斯分类器运行了 cross_val_predictcross_val_score。我是否应该使用这些函数的输出来在分类器之间做出决定?
    • cross_val_predict 在内部训练与您提供的拆分一样多的模型(在您的情况下为 10 个),每个模型都基于不同的数据拆分。之后,它使用每个模型来预测看不见的数据,并将所有结果连接起来以创建预测列表。这主要是 debugging*/*analysis 工具,而不是用于训练的工具。对于您的用例,您根本不应该使用 cross_val_predict。不过,您可以使用 cross_val_score 来决定模型(如 SVM 或 NB)。
    • 这很有意义,谢谢@lejlot!那么如何防止文本分类模型过拟合呢?
    • 交叉验证不能“防止过度拟合”,基于交叉验证的模型选择应该会有所帮助(因为 cv 分数是对泛化误差的估计)。
    • 我想我明白了。感谢所有的帮助,@lejlot :)
    猜你喜欢
    • 2014-06-13
    • 2017-02-27
    • 2016-08-07
    • 1970-01-01
    • 2017-04-11
    • 2011-07-29
    • 2016-10-02
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多