scikit RandomForestClassifier - 实际结果与预测分数不匹配

Posted

技术标签:

【中文标题】scikit RandomForestClassifier - 实际结果与预测分数不匹配【英文标题】:scikit RandomForestClassifier - real results not matching prediction score 【发布时间】:2020-02-20 01:47:31 【问题描述】:

我是机器学习的新手,我正在尝试使用 scikit RandomForestClassifier 对文本进行分类。我遇到的问题是我的测试数据结果与 sklearn 分类报告不匹配。训练集有大约 25k 个样本,其中大约 25% 被标记为 1,75% 被标记为 0。我有一个额外的 1k 测试集,用于在训练后进行测试。

#火车

    vectorizer = TfidfVectorizer(max_features=40, stop_words=stopwords.words('english'))
    X = vectorizer.fit_transform(documents).toarray()
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=0)

    classifier = RandomForestClassifier(
    n_jobs=-1, bootstrap=False, n_estimators=200, random_state=0)

    classifier.fit(X_train, y_train)
    y_pred = classifier.predict(X_test)

    print(confusion_matrix(y_test, y_pred))
    print(classification_report(y_test, y_pred))
    print(accuracy_score(y_test, y_pred))

               precision    recall  f1-score   support

       0       0.98      0.99      0.98      4231
       1       0.95      0.90      0.92       883

accuracy                           0.97      5114

#测试

df = pandas.read_csv(input_file, header=None)
df.columns = ["data", "target"]

df, y = df.data, df.target

test_documents = []
for body in range(0, len(df)):
    document = str(df[body])
    test_documents.append(document)
X = vectorizer.fit_transform(test_documents).toarray()
prediction = pd.DataFrame(classifier.predict(X))

              precision    recall  f1-score   support

       0       0.89      0.87      0.88       856
       1       0.38      0.42      0.40       154

【问题讨论】:

1.对于测试数据集,您不需要fit_transform。 2. 检查你的模型是否过拟合 @Mr_U4913 谢谢。跟进问:1)我应该如何重写那行? 2. 如何测试我的模型中的过度拟合? 1. transform 而不是 fit_transform 2. 如果测试准确度接近训练准确度,那么您的模型正好适合。如果测试 acc 远低于训练 acc,那么您的模型过度拟合。如果测试 acc 优于 train acc,则您的模型欠拟合并训练更复杂的模型 只需详细说明 Mr_U4913 所说的内容:在您的“#test”代码中,使用您在“#train”代码中制作的现有矢量化器转换您的数据......并调用转换方法,而不是fit_transform @Swier 非常感谢,这真的很有用。在我在这里发布之前,我做了一些程序员的雨舞,其中一行错误的代码会产生随机结果,我不断调整每个参数,希望看到积极的效果。我现在将再次开始应用逻辑。干杯! 【参考方案1】:

我希望 Mr_U4913 会添加这个,但我会改为。

为你的测试代码试试这个:

测试

df = pandas.read_csv(input_file, header=None)
df.columns = ["data", "target"]

df, y = df.data, df.target

test_documents = []
for body in range(0, len(df)):
    document = str(df[body])
    test_documents.append(document)
X = vectorizer.transform(test_documents).toarray()  #here is where change is!
prediction = pd.DataFrame(classifier.predict(X))

注意变化...我们现在对矢量化器使用变换方法。我假设您可以将此测试代码放入与您的训练代码相同的文件中,以便您的矢量化器对象仍然存在。

您使用 transform 和 not fit_transform 的原因是您已经使用适合特定词汇的矢量化器训练了模型,并且在测试期间可能会出现新单词。使用现有的矢量化器将忽略这些新词/组合,并有助于保持您的 tdif 矢量协调。与使用 fit_transform 不同,它可能会以完全不同的方式重新创建您的矢量化器,它会有小/大的差异。

编辑:您可能也希望尝试逻辑分类器...有时它会在此类数据上给出不错的结果。

【讨论】:

非常感谢。我的测试结果现在更接近火车测试结果。但是当我将测试结果合并到 csv 并手动检查它们时,我可以看到 148 个预测的 1 中只有 25 个是正确的。我一定还是做错了什么。 你的传奇将继续......没有找到最佳解决方案并不一定意味着你在做某事错误!这也很大程度上取决于您的模型的期望是什么。假设测试集中只有 25 个 1...您将成功地隔离所有这些(假设任务是丢弃带有 0 标签的示例...您已经从 1000 变为 148...对于人工审查或其他)。 我的问题是我没有发布的代码中的一个错字,它只是错误地合并了结果。所以该模型现在的准确率约为 90%,我对此非常满意。现在来比较一个逻辑分类器......干杯!

以上是关于scikit RandomForestClassifier - 实际结果与预测分数不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 CalibratedClassifierCV BaseEstimator 参数

在 Python 中为随机森林选择正确的分布

“OneVsRestClassifier”(Scikit-learn)和“Binary Relevance”(Scikit-multilearn)有啥区别?

scikit

Python/Scikit-learn/regressions - 从 pandas Dataframes 到 Scikit 预测

Sklearn 速查