【问题标题】:How can I plot a confusion matrix? [duplicate]如何绘制混淆矩阵? [复制]
【发布时间】:2016-06-04 23:06:48
【问题描述】:

我正在使用 scikit-learn 将文本文档 (22000) 分类为 100 个类。我使用 scikit-learn 的混淆矩阵方法来计算混淆矩阵。

model1 = LogisticRegression()
model1 = model1.fit(matrix, labels)
pred = model1.predict(test_matrix)
cm=metrics.confusion_matrix(test_labels,pred)
print(cm)
plt.imshow(cm, cmap='binary')

这就是我的混淆矩阵的样子:

[[3962  325    0 ...,    0    0    0]
 [ 250 2765    0 ...,    0    0    0]
 [   2    8   17 ...,    0    0    0]
 ..., 
 [   1    6    0 ...,    5    0    0]
 [   1    1    0 ...,    0    0    0]
 [   9    0    0 ...,    0    0    9]]

但是,我没有收到清晰易读的情节。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python matplotlib matrix scikit-learn text-classification


    【解决方案1】:

    您可以使用plt.matshow() 代替plt.imshow() 或者您可以使用seaborn 模块的heatmap (see documentation) 来绘制混淆矩阵

    import seaborn as sn
    import pandas as pd
    import matplotlib.pyplot as plt
    array = [[33,2,0,0,0,0,0,0,0,1,3], 
            [3,31,0,0,0,0,0,0,0,0,0], 
            [0,4,41,0,0,0,0,0,0,0,1], 
            [0,1,0,30,0,6,0,0,0,0,1], 
            [0,0,0,0,38,10,0,0,0,0,0], 
            [0,0,0,3,1,39,0,0,0,0,4], 
            [0,2,2,0,4,1,31,0,0,0,2],
            [0,1,0,0,0,0,0,36,0,2,0], 
            [0,0,0,0,0,0,1,5,37,5,1], 
            [3,0,0,0,0,0,0,0,0,39,0], 
            [0,0,0,0,0,0,0,0,0,0,38]]
    df_cm = pd.DataFrame(array, index = [i for i in "ABCDEFGHIJK"],
                      columns = [i for i in "ABCDEFGHIJK"])
    plt.figure(figsize = (10,7))
    sn.heatmap(df_cm, annot=True)
    

    【讨论】:

    • mask_bad = X.mask if np.ma.is_masked(X) else np.isnan(X) # Mask nan's。 TypeError: 输入类型不支持 ufunc 'isnan',并且根据强制转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型
    【解决方案2】:

    @bninopaul 的回答并不完全适合初学者

    这是你可以“复制并运行”的代码

    import seaborn as sn
    import pandas as pd
    import matplotlib.pyplot as plt
    
    array = [[13,1,1,0,2,0],
             [3,9,6,0,1,0],
             [0,0,16,2,0,0],
             [0,0,0,13,0,0],
             [0,0,0,0,15,0],
             [0,0,1,0,0,15]]
    
    df_cm = pd.DataFrame(array, range(6), range(6))
    # plt.figure(figsize=(10,7))
    sn.set(font_scale=1.4) # for label size
    sn.heatmap(df_cm, annot=True, annot_kws={"size": 16}) # font size
    
    plt.show()
    

    【讨论】:

    • 只是添加,对于自定义 xy 标签,将 df_cm 行替换为如下内容:df_cm = pd.DataFrame(array, index=["stage 1", "stage 2", "stage 3", "stagte 4"], columns=["stage 1", "stage 2", "stage 3", "stagte 4"])
    • 我不明白为什么这个答案更“适合初学者”?...它与 bninopaul 的基本相同。
    • conf 矩阵是 beginner-sized @DavidSkarbrevik ;)
    【解决方案3】:

    如果您想在混淆矩阵中添加更多数据,包括“总计列”和“总计行”以及百分比 (%) 在每个单元格中,类似于 matlab 默认(见下图)

    包括热图和其他选项...

    你应该喜欢上面的模块,在 github 上共享; )

    https://github.com/wcipriano/pretty-print-confusion-matrix


    此模块可以轻松完成您的任务,并使用大量参数生成上面的输出以自定义您的 CM:

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 2013-10-25
      • 2020-09-01
      • 2017-10-17
      • 2020-07-15
      • 2019-12-26
      • 1970-01-01
      相关资源
      最近更新 更多