朴素贝叶斯和 SVM 分类 - 如何在 x y 轴上绘制精度?

Posted

技术标签:

【中文标题】朴素贝叶斯和 SVM 分类 - 如何在 x y 轴上绘制精度?【英文标题】:Naive Bayes and SVM classification - how to plot accuracy on x y axis? 【发布时间】:2020-08-25 12:54:00 【问题描述】:

我正在尝试生成一些带有 x 和 y 轴的线图,以展示运行分类的 2 种不同算法的准确性 - 朴素贝叶斯和 SVM。

我像这样训练/测试数据:

# split the dataset into training and validation datasets
train_x, valid_x, train_y, valid_y = model_selection.train_test_split(result['post'], result['type'], test_size=0.30, random_state=1)

# label encode the target variable
encoder = preprocessing.LabelEncoder()
train_y = encoder.fit_transform(train_y)
valid_y = encoder.fit_transform(valid_y)

def tokenizersplit(str):
    return str.split()
tfidf_vect = TfidfVectorizer(tokenizer=tokenizersplit, encoding='utf-8', min_df=2, ngram_range=(1, 2), max_features=25000)

tfidf_vect.fit(result['post'])
tfidf_vect.transform(result['post'])

xtrain_tfidf = tfidf_vect.transform(train_x)
xvalid_tfidf = tfidf_vect.transform(valid_x)

def train_model(classifier, trains, t_labels, valids, v_labels):
    # fit the training dataset on the classifier
    classifier.fit(trains, t_labels)

    # predict the labels on validation dataset
    predictions = classifier.predict(valids)

    return metrics.accuracy_score(predictions, v_labels)

# Naive Bayes
accuracy = train_model(naive_bayes.MultinomialNB(), xtrain_tfidf, train_y, xvalid_tfidf, valid_y)
print ("NB accuracy: ", accuracy)

但是,对于作业,我需要使用 matplotlib 在 x/y 轴上绘制一些东西。我试过这个:

m=linear_model.LogisticRegression()
m.fit(xtrain_tfidf, train_y)
y_pred = m.predict(xvalid_tfidf)
print(metrics.classification_report(valid_y, y_pred))
plt.plot(valid_y, y_pred)
plt.show()

但这给了我:

我需要一些可以更轻松地比较朴素贝叶斯与 SVM 与其他算法的准确性的东西。我怎样才能做到这一点? 绘制分类报告:

plt.plot(metrics.classification_report(valid_y, y_pred))
plt.show()

我的分类输出:

  precision    recall  f1-score   support

           0       1.00      0.18      0.31        11
           1       0.00      0.00      0.00        14
           2       0.00      0.00      0.00        19
           3       0.50      0.77      0.61        66
           4       0.39      0.64      0.49        47
           5       0.00      0.00      0.00        23

    accuracy                           0.46       180
   macro avg       0.32      0.27      0.23       180
weighted avg       0.35      0.46      0.37       180

编辑时出错:

df = pd.DataFrame(metrics.classification_report(valid_y, y_pred)).transpose()

报错

ValueError: DataFrame 构造函数未正确调用!

【问题讨论】:

分类报告是一个表格,它不是用来绘制的 - 首先尝试简单地以classification_report(valid_y, y_pred) 运行它,看看它会返回什么。 @desertnaut 对。不一定需要在这里使用分类报告,但是如果我尝试仅绘制它,我什么也得不到(参见我的更新中的图片) 你能发布metrics.classification_report(valid_y, y_pred)的输出吗?如果是表格,您可以通过传递 plt.scatter(x=..,y=..,..) 来散点图两个轴 @HirakSarkar 是的 - 看我的编辑它的表格 你也可以打印metrics.classification_report(valid_y, y_pred).shape 吗?该表似乎被截断,似乎有超过 4 列,可能是把它放在一个变量中。 ``` df = metrics.classification_report(valid_y, y_pred) print(df.shape) print(df.columns) `` 【参考方案1】:

metrics.classification_report总结预测结果。所以这不是为了绘图而只是为了打印“报告”。如果您希望表格采用可视格式,您可以关注https://***.com/a/34304414/4005668。

否则你可以通过在数据帧中捕获它来获取数据帧

import pandas as pd
# put it in a dataframe
df = pd.DataFrame(metrics.classification_report(..)).transpose()
# plot the dataframe
df.plot()

【讨论】:

是的,但是这个答案已经过时了,导致了我的第二个问题***.com/questions/61705257/… 将我自己的分类报告插入数据框时出错。请参阅我的编辑。 你能上传你的 jupyter notebook 或其他东西,以便我重现错误吗?因为对于我的玩具示例,它没有给出错误。

以上是关于朴素贝叶斯和 SVM 分类 - 如何在 x y 轴上绘制精度?的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯分类——大道至简

机器学习--模型分类--贝叶斯

朴素贝叶斯分类算法的sklearn实现

如何使用朴素贝叶斯和主成分分析(C#、Accord.NET)对文档进行分类

朴素贝叶斯(Naive Bayes)算法

执行朴素贝叶斯和决策树分类时出现 KeyError