sklearn生成混淆矩阵的坐标轴标注正确性确认问题
混淆矩阵坐标轴标注修正说明
现使用的混淆矩阵生成代码
from sklearn.naive_bayes import MultinomialNB mnb=MultinomialNB() mnb.fit(X_train,Y_train) # 测试用短信样例 sms2="O2提醒:要领取2.5英镑免费通话额度及重磅优惠详情,请回复本短信并提供你的有效姓名、门牌号及邮编" sms="恭喜你中奖了!" X_test = [str (item) for item in X_test] Y_pred = mnb.predict(vec.transform(X_test)) from sklearn.metrics import confusion_matrix mat = confusion_matrix(Y_test, Y_pred) print(mat) names =[ "非垃圾短信", "垃圾短信"] print(names) sns.heatmap(mat, square=True, annot=True, fmt='d', cbar=False, xticklabels=names, yticklabels=names) plt.xlabel('实际值(真实)') plt.ylabel('预测值') plt.show()
生成的混淆矩阵结果

标注正误判断
你当前的坐标轴标注是错误的,二者需要互换位置。
判断依据
sklearn.metrics.confusion_matrix的输出规则:
调用confusion_matrix(y_true, y_pred)时,返回的二维矩阵遵循如下结构:
- 矩阵的**行(第一维度)**对应真实标签分类:第i行的所有数值,都代表真实类别为第i类的样本统计结果
- 矩阵的**列(第二维度)**对应预测标签分类:第j列的所有数值,都代表被模型预测为第j类的样本统计结果
seaborn.heatmap的渲染规则:
传入矩阵后,矩阵的行会对应热力图的y轴刻度,矩阵的列会对应热力图的x轴刻度。
结合上述两点可知,你当前给x轴标注「实际值(真实)」、y轴标注「预测值」的做法刚好和矩阵定义相反。
修正方案
将坐标轴标注部分的代码修改为如下内容即可:
plt.xlabel('预测值') plt.ylabel('实际值(真实)')
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

