混淆矩阵的画法-热图采⽤imshow
前⾯系列⽂章讲过数据挖掘的各种知识,最近在研究⼈类时空动⼒学分析和幂率定律,发现在⼈类兴趣转移模型中,可以通过热图(斑图)来进⾏描述的兴趣转移,如下图所⽰。下⼀篇⽂章将简单普及⼈类动⼒学相关知识研究。
这篇⽂章结合Matplotlib的imshow()函数,讲述热图(斑图)绘制及相关参数基础知识。希望⽂章对你有所帮助,如果⽂章中存在错误或不⾜之处,还请海涵。
matplotlib 是python最著名的2D绘图库,它提供了⼀整套和matlab相似的命令API,⼗分适合交互式地进⾏制图。⽽且也可以⽅便地将它作为绘图控件,嵌⼊GUI应⽤程序中。通过简单的绘图语句,就可以绘制出⾼质量的图了。
这⾥我们就主要讲⼀下inshow()函数的使⽤吧。
⼀、引⼊matplotlib函数库
如果你使⽤的是windows平台,⼤家可以直接下载对应版本的matplotlib库的exe⽂件安装即可。
使⽤下⾯的命令引⼊matplotlib的pyplot模块:
import matplotlib.pyplot as plt
为⽅便起见,这样我们就可以⽤plt来代替matplotlib.pyplot使⽤了。
⼆、Figure和Subplot
matplotlib的图像都位于Figure对象中,实际上就是创建了⼀个空的图像窗⼝。可以⽤plt.figure创建⼀个新的Figure。fig = plt.figure()
不能通过空Figure绘图,必须⽤add_subplot()创建⼀个或多个⼦sunplot绘图区才能绘图。
ax = fig.add_subplot(221)
意思是:绘制2×2两⾏两列共4个subplot图像,当前选中第⼀个。编号从1开始。
得到如下的图像:
三、绘制z = sqrt(x 2) 的⼆维函数输出图像
(1)准备数据
我们采⽤⼆维数组产⽣两个⼆维矩阵,对应于所有的(x,y)对。
要使⽤数组,我们使⽤NumPy 模块。
import numpy as np
points = np.arange(-5,5,0.01) #产⽣1000个-5到5等间隔的点
xs,ys = np.meshgrid(points,points) #np.meshgrid()接受两个⼀维数组产⽣两个⼆维矩阵((x,y)对)。
z = np.sqrt(xs2+ys2) #计算z = sqrt(x 2)的值
(2)绘图
ax = fig.add_subplot(221) #第⼀个⼦图
ax.imshow(z) #默认配置
ax = fig.add_subplot(222) #第⼀个⼦图
ax.imshow(z,cmap = ay) #第⼆个⼦图,使⽤⾃定义的colormap(灰度图)
ax = fig.add_subplot(223) #第⼀个⼦图
ax.imshow(z,l) #第⼆个⼦图,使⽤⾃定义的colormap
2+y 2+y
ax = fig.add_subplot(224) #第⼀个⼦图
ax.imshow(z,hot) #第⼆个⼦图,使⽤⾃定义的colormap
plt.show() #显⽰图像
于是,漂亮的图像就出来了。
可是,细⼼的你发现,图的坐标怎么是0-1000呢?是这样的,我们给imshow传⼊z矩阵是1000×1000的,z的索引其实就是图像的坐标,⽽其值才是通过图的颜⾊表现出来的。
热图(heatmap)是数据分析的常⽤⽅法,通过⾊差、亮度来展⽰数据的差异、易于理解。Python在Matplotlib库中,调⽤imshow()函数实现热图绘制。
参考资料:
源码介绍如下图所⽰:
def plot_confusion_matrix(cm, classes,
title='Confusion matrix',
Blues):
"""
This function prints and plots the confusion matrix.
"""
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
tick_marks = np.arange(len(classes))
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
<(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
import itertools
def mixfig_down():
lr = LogisticRegression(C=0.01, penalty='l1',solver='liblinear')
lr.fit(X_train_undersample, y_train_undersample.values.ravel())
y_pred_undersample = lr.predict(X_test_undersample.values)
# Compute confusion matrix
cnf_matrix = confusion_matrix(y_test_undersample, y_pred_undersample)
np.set_printoptions(precision=2)
print("Recall metric in the testing dataset: ", cnf_matrix[1, 1] / (cnf_matrix[1, 0] + cnf_matrix[1, 1]))
# Plot non-normalized confusion matrix
class_names = [0, 1]
matplotlib中subplot
plt.figure()
plot_confusion_matrix(cnf_matrix
,
classes=class_names
, title='Confusion matrix')
plt.show()
#⽤下采样训练的模型验证原本的总样本
#lr = LogisticRegression(C=best_c, penalty='l1',solver='liblinear')
lr.fit(X_train_undersample, y_train_undersample.values.ravel())
y_pred = lr.predict(X_test.values)
# Compute confusion matrix
cnf_matrix = confusion_matrix(y_test,y_pred)
np.set_printoptions(precision=2)
print("Recall metric in the testing dataset: ", cnf_matrix[1, 1] / (cnf_matrix[1, 0] + cnf_matrix[1, 1]))
# Plot non-normalized confusion matrix
class_names = [0, 1]
plt.figure()
plot_confusion_matrix(cnf_matrix
, classes=class_names
, title='Confusion matrix')
plt.show()
mixfig_down()
lr=LogisticRegression(C=0.01,penalty='l1')
lr.fit(X_train_undersample,y_train_undersample.values.ravel())
y_pred_undersample_proba=lr.predict_proba(X_test_undersample.values)#概率值
thresholds=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]
plt.figure(figsize=(10,10))
j=1
for i in thresholds:
y_test_predictions_high_recall=y_pred_undersample_proba[:,1]>i
plt.subplot(3,3,j)
j+=1
cnf_matrix=confusion_matrix(y_test_undersample,y_test_predictions_high_recall)
np.set_printoptions(precision=2)
print("Recall metric in the testing dataset:",cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))    class_names=[0.1]
plot_confusion_matrix(cnf_matrix,classes=class_names,title='Threshold>=%s'%i)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。