当前位置:首页 » 编程语言 » python混淆矩阵

python混淆矩阵

发布时间: 2023-05-23 09:59:55

❶ 如何用python画好confusion matrix

在做分类的时候,经常需要画混淆矩阵,下面我们使用python的matplotlib包,scikit-learning机器学习库也同样提供了例子:, 但是这样的图并不能满足我们的要求,

首先是刻度的显示是在方格的中间,这需要隐藏刻度,其次是如何把每个label显示在每个方块的中间, 其次是如何在每个方格中显示accuracy数值, 最后是如何在横坐标和纵坐标显示label的名字,在label name比较长的时候,如何处理显示问题。

直接贴上代码:

[python]view plain

  • '''''computeconfusionmatrix

  • labels.txt:containlabelname.

  • predict.txt:predict_labeltrue_label

  • '''

  • fromsklearn.metricsimportconfusion_matrix

  • importmatplotlib.pyplotasplt

  • importnumpyasnp

  • #loadlabels.

  • labels=[]

  • file=open('labels.txt','r')

  • lines=file.readlines()

  • forlineinlines:

  • labels.append(line.strip())

  • file.close()

  • y_true=[]

  • y_pred=[]

  • #loadtrueandpredictlabels.

  • file=open('predict.txt','r')

  • lines=file.readlines()

  • forlineinlines:

  • y_true.append(int(line.split("")[1].strip()))

  • y_pred.append(int(line.split("")[0].strip()))

  • file.close()

  • tick_marks=np.array(range(len(labels)))+0.5

  • defplot_confusion_matrix(cm,title='ConfusionMatrix',cmap=plt.cm.binary):

  • plt.imshow(cm,interpolation='nearest',cmap=cmap)

  • plt.title(title)

  • plt.colorbar()

  • xlocations=np.array(range(len(labels)))

  • plt.xticks(xlocations,labels,rotation=90)

  • plt.yticks(xlocations,labels)

  • plt.ylabel('Truelabel')

  • plt.xlabel('Predictedlabel')

  • cm=confusion_matrix(y_true,y_pred)

  • printcm

  • np.set_printoptions(precision=2)

  • cm_normalized=cm.astype('float')/cm.sum(axis=1)[:,np.newaxis]

  • printcm_normalized

  • plt.figure(figsize=(12,8),dpi=120)

  • #setthefontsizeoflabel.

  • #forlabelinplt.gca().xaxis.get_ticklabels():

  • #label.set_fontsize(8)

  • #textportion

  • ind_array=np.arange(len(labels))

  • x,y=np.meshgrid(ind_array,ind_array)

  • forx_val,y_valinzip(x.flatten(),y.flatten()):

  • c=cm_normalized[y_val][x_val]

  • if(c>0.01):

  • plt.text(x_val,y_val,"%0.2f"%(c,),color='red',fontsize=7,va='center',ha='center')

  • #offsetthetick

  • plt.gca().set_xticks(tick_marks,minor=True)

  • plt.gca().set_yticks(tick_marks,minor=True)

  • plt.gca().xaxis.set_ticks_position('none')

  • plt.gca().yaxis.set_ticks_position('none')

  • plt.grid(True,which='minor',linestyle='-')

  • plt.gcf().subplots_adjust(bottom=0.15)

  • plot_confusion_matrix(cm_normalized,title='Normalizedconfusionmatrix')

  • #showconfusionmatrix

  • plt.show()

  • 结果如下图所示:

    阅读全文

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    目前您尚未登录,请登录或注册后进行评论

  • linchunmian

    2017-05-08 2

❷ python3.5做分类时,混淆矩阵加在哪一步

preface:做着最近的任务,对数据处理,做些简单的提特征,用机器学习算法跑下程序得出结果,看看哪些特征的组合较好,这一系列流程必然要用到很多函数,故将自己常用函数记录上。应该说这些函数基本上都会用到,像是数据预处理,处理完了后特征提取、降维、训练预测、通过混淆矩阵看分类效果,得出报告。

1.输入

从数据集开始,提取特征转化为有标签的数据集,转为向量。拆分成训练集和测试集,这里不多讲,在上一篇博客中谈到用StratifiedKFold()函数即可。在训练集中有data和target开始。

2.处理

[python]view plain

  • defmy_preprocessing(train_data):

  • X_normalized=preprocessing.normalize(train_data,norm="l2",axis=0)#使用l2范式,对特征列进行正则

  • returnX_normalized

  • defmy_feature_selection(data,target):

  • fromsklearn.feature_selectionimportSelectKBest

  • fromsklearn.feature_selectionimportchi2

  • data_new=SelectKBest(chi2,k=50).fit_transform(data,target)

  • returndata_new

  • defmy_PCA(data):#datawithouttarget,justtraindata,withoutraintarget.

  • pca_sklearn=decomposition.PCA()

  • pca_sklearn.fit(data)

  • main_var=pca_sklearn.explained_variance_

  • printsum(main_var)*0.9

  • importmatplotlib.pyplotasplt

  • n=15

  • plt.plot(main_var[:n])

  • plt.show()

  • defclf_train(data,target):

  • fromsklearnimportsvm

  • #fromsklearn.linear_modelimportLogisticRegression

  • clf=svm.SVC(C=100,kernel="rbf",gamma=0.001)

  • clf.fit(data,target)

  • #clf_LR=LogisticRegression()

  • #clf_LR.fit(x_train,y_train)

  • #y_pred_LR=clf_LR.predict(x_test)

  • returnclf

  • defmy_confusion_matrix(y_true,y_pred):

  • fromsklearn.metricsimportconfusion_matrix

  • labels=list(set(y_true))

  • conf_mat=confusion_matrix(y_true,y_pred,labels=labels)

  • print"confusion_matrix(leftlabels:y_true,uplabels:y_pred):"

  • print"labels ",

  • foriinrange(len(labels)):

  • printlabels[i]," ",

  • print

  • foriinrange(len(conf_mat)):

  • printi," ",

  • forjinrange(len(conf_mat[i])):

  • printconf_mat[i][j],' ',

  • print

  • print

  • defmy_classification_report(y_true,y_pred):

  • fromsklearn.metricsimportclassification_report

  • print"classification_report(left:labels):"

  • printclassification_report(y_true,y_pred)


  • my_preprocess()函数:
  • 主要使用sklearn的preprocessing函数中的normalize()函数,默认参数为l2范式,对特征列进行正则处理。即每一个样例,处理标签,每行的平方和为1.

    my_feature_selection()函数:

    使用sklearn的feature_selection函数中SelectKBest()函数和chi2()函数,若是用词袋提取了很多维的稀疏特征,有必要使用卡方选取前k个有效的特征。

    my_PCA()函数:

    主要用来观察前多少个特征是主要特征,并且画图。看看前多少个特征占据主要部分。

    clf_train()函数:

    可用多种机器学习算法,如SVM, LR, RF, GBDT等等很多,其中像SVM需要调参数的,有专门调试参数的函数如StratifiedKFold()(见前几篇博客)。以达到最优。

    my_confusion_matrix()函数:

    主要是针对预测出来的结果,和原来的结果对比,算出混淆矩阵,不必自己计算。其对每个类别的混淆矩阵都计算出来了,并且labels参数默认是排序了的。

    my_classification_report()函数:

    主要通过sklearn.metrics函数中的classification_report()函数,针对每个类别给出详细的准确率、召回率和F-值这三个参数和宏平均值,用来评价算法好坏。另外ROC曲线的话,需要是对二分类才可以。多类别似乎不行。

  • 主要参考sklearn官网

❸ python svm 怎么训练模型

支持向量机SVM(Support Vector Machine)是有监督的分类预测模型,本篇文章使用机器学习库scikit-learn中的手写数字数据集介绍使用Python对SVM模型进行训练并对手写数字进行识别的过程。

准备工作

手写数字识别的原理是将数字的图片分割为8X8的灰度值矩阵,将这64个灰度值作为每个数字的训练集对模型进行训练。手写数字所对应的真实数字作为分类结果。在机器学习sklearn库中已经包含了不同数字的8X8灰度值矩阵,因此我们首先导入sklearn库自带的datasets数据集。然后是交叉验证库,SVM分类算法库,绘制图表库等。

12345678910#导入自带数据集from sklearn import datasets#导入交叉验证库from sklearn import cross_validation#导入SVM分类算法库from sklearn import svm#导入图表库import matplotlib.pyplot as plt#生成预测结果准确率的混淆矩阵from sklearn import metrics

读取并查看数字矩阵

从sklearn库自带的datasets数据集中读取数字的8X8矩阵信息并赋值给digits。

12#读取自带数据集并赋值给digitsdigits = datasets.load_digits()

查看其中的数字9可以发现,手写的数字9以64个灰度值保存。从下面的8×8矩阵中很难看出这是数字9。

12#查看数据集中数字9的矩阵digits.data[9]

以灰度值的方式输出手写数字9的图像,可以看出个大概轮廓。这就是经过切割并以灰度保存的手写数字9。它所对应的64个灰度值就是模型的训练集,而真实的数字9是目标分类。我们的模型所要做的就是在已知64个灰度值与每个数字对应关系的情况下,通过对模型进行训练来对新的手写数字对应的真实数字进行分类。

1234#绘制图表查看数据集中数字9的图像plt.imshow(digits.images[9], cmap=plt.cm.gray_r, interpolation='nearest')plt.title('digits.target[9]')plt.show()


从混淆矩阵中可以看到,大部分的数字SVM的分类和预测都是正确的,但也有个别的数字分类错误,例如真实的数字2,SVM模型有一次错误的分类为1,还有一次错误分类为7。



❹ python 怎么画与其他方法进行比较的ROC曲线

使用sklearn的一系列方法后可以很方便的绘制处ROC曲线,这里简单实现以下。
主要是利用混淆矩阵中的知识作为绘制的数据(如果不是很懂可以先看看这里的基础):

tpr(Ture Positive Rate):真阳率 图像的纵坐标

fpr(False Positive Rate):阳率(伪阳率) 图像的横坐标

mean_tpr:累计真阳率求平均值

mean_fpr:累计阳率求平均值

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import StratifiedKFold

iris = datasets.load_iris()
X = iris.data
y = iris.target
X, y = X[y != 2], y[y != 2] # 去掉了label为2,label只能二分,才可以。
n_samples, n_features = X.shape
# 增加噪声特征
random_state = np.random.RandomState(0)
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

cv = StratifiedKFold(n_splits=6) #导入该模型,后面将数据划分6份
classifier = svm.SVC(kernel='linear', probability=True,random_state=random_state) # SVC模型 可以换作AdaBoost模型试试

# 画平均ROC曲线的两个参数
mean_tpr = 0.0 # 用来记录画平均ROC曲线的信息
mean_fpr = np.linspace(0, 1, 100)
cnt = 0
for i, (train, test) in enumerate(cv.split(X,y)): #利用模型划分数据集和目标变量 为一一对应的下标
cnt +=1
probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test]) # 训练模型后预测每条样本得到两种结果的概率
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1]) # 该函数得到伪正例、真正例、阈值,这里只使用前两个

mean_tpr += np.interp(mean_fpr, fpr, tpr) # 插值函数 interp(x坐标,每次x增加距离,y坐标) 累计每次循环的总值后面求平均值
mean_tpr[0] = 0.0 # 将第一个真正例=0 以0为起点

roc_auc = auc(fpr, tpr) # 求auc面积
plt.plot(fpr, tpr, lw=1, label='ROC fold {0:.2f} (area = {1:.2f})'.format(i, roc_auc)) # 画出当前分割数据的ROC曲线

plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck') # 画对角线

mean_tpr /= cnt # 求数组的平均值
mean_tpr[-1] = 1.0 # 坐标最后一个点为(1,1) 以1为终点
mean_auc = auc(mean_fpr, mean_tpr)

plt.plot(mean_fpr, mean_tpr, 'k--',label='Mean ROC (area = {0:.2f})'.format(mean_auc), lw=2)

plt.xlim([-0.05, 1.05]) # 设置x、y轴的上下限,设置宽一点,以免和边缘重合,可以更好的观察图像的整体
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') # 可以使用中文,但需要导入一些库即字体
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

❺ python随机森林分类模型,测试集和训练集的样本数没有准确按照70%和30%分配

进行比例划分的时候 从 int 型 转化为了 float 型, float型总是会有微小的误差的,这个不是大问题。
比如你输入 1- 0.9 , 可能返回 0.1, 也可能返回0.09999999 或者 0.100000000001 , 这是计算机存储机制导致的。

❻ 混淆矩阵热力图什么意思

混淆矩阵热力图意思是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型作出的分类判断两蠢迟个标准贺掘进行汇总。 示例:
2. python 函数 官方文档中给出的用法带拍李是 sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None) y_true

❼ python里面一些简单代码的含义是什么(题主零基础)

主要就两个文件 一个是sample的名字 labels.txt
还有个放矩阵 predict.txt 两列,一列pre 二列true
放矩阵那里他高春会调confusion_matrix自己算,如大缓果你自己算好了不需要算,那代码就要改
confusion_matrix介绍见
http://scikit-learn.org/stable/moles/generated/sklearn.metrics.confusion_matrix.html
这东西用R画快多了,python的也只是滚念模刚才看了下介绍,应该没啥大问题

❽ Python hmmlearn中的混淆矩阵是怎么表示的

hmmlearn这个库有三种模型,分别是Gaussian,Multinomial和GMMHMM。这三种模型对应的就是三种emission
matrix(即混淆矩阵,也就是隐状态到观察态的概率)。Gaussian就是说混淆矩阵是一个高斯分布,即观察态是连续的。Multinomiual就是说混淆矩阵事一个Multibimiual
distribution,即观察态势离散的。GMMHMM则是说混淆矩阵是遵循gaussinan
mixture
分布,也是连续的。
题主问如何把混淆矩阵输入到模型里面。首先你要确定你的混淆矩阵的类型。对于Gaussian类型,就是把你希望的
mean和variance值放到模型里面。我就直接把文档里面的例子搬过来,例子里是建立了一个高斯分布的隐马尔科夫模型。
>>>
import
numpy
as
np
>>>
from
hmmlearn
import
hmm
#一个隐马尔科夫模型由(p向量,状态转移矩阵,混淆矩阵)来定义。
>>>
startprob
=
np.array([0.6,
0.3,
0.1])
#
定义初始状态的概率
>>>
transmat
=
np.array([[0.7,
0.2,
0.1],
[0.3,
0.5,
0.2],
[0.3,
0.3,
0.4]])#定义转移矩阵的概率
>>>
means
=
np.array([[0.0,
0.0],
[3.0,
-3.0],
[5.0,
10.0]])
#定义混淆矩阵的均值
>>>
covars
=
np.tile(np.identity(2),
(3,
1,
1))#
定义混淆矩阵的方差
>>>
model
=
hmm.GaussianHMM(3,
"full",
startprob,
transmat)#
定义一个混淆矩阵为高斯分布的隐马尔科夫模型。
这里‘full’的意思就是说你输入的方差矩阵每个元素都给出了,不是一个只是对角线上的元素为0的矩阵
>>>
model.means_
=
means
>>>
model.covars_
=
covars#把你希望的均值方差输入你定义的模型里面,到此你就把混淆矩阵输入进模型了
>>>
X,
Z
=
model.sample(100)
对于Multinomial

GMM,我还没用,不过Multinomial应该是需要你自己手动输入隐状态到观察态的概率的,而GMM应该是和Gaussian类型类似,只是需要多输入一个权重因子。
对于第二个问题,covariance_type意思是你的混淆矩阵的covariance
matrix是什么类型,比如若只是对角线上的元素不为0,则把covariance_type设为‘diag’。

❾ Python hmmlearn中的混淆矩阵是怎么表示的

hmmlearn这个库有三种模型,分别是Gaussian,Multinomial和GMMHMM。这三种模型对应的就是三种emission matrix(即混淆矩阵,也就是隐状态到观察态的概率)。Gaussian就是说混淆矩阵是一个高斯分布,即观察态是连续的。Multinomiual就是说混淆矩阵事一个Multibimiual distribution,即观察态势离散的。GMMHMM则是说混淆矩阵是遵循gaussinan mixture 分布,也是连续的。
题主问如何把混淆矩阵输入到模型里面。首先你要确定你的混淆矩阵的类型。对于Gaussian类型,就是把你希望的 mean和variance值放到模型里面。我就直接把文档里面的例子梁旁搬过来,例子里是建立了一个高斯分布的隐马尔科夫模型。

>>> import numpy as np
>>> from hmmlearn import hmm
#一个隐马尔科夫模型由(p向量,状态转移矩阵,混淆矩阵)来定义。
>段友>> startprob = np.array([0.6, 0.3, 0.1])
# 定义初始状态的概率
>>> transmat = np.array([[0.7, 0.2, 0.1], [0.3, 0.5, 0.2], [0.3, 0.3, 0.4]])#定义转移矩阵的概率

>>> means = np.array([[0.0, 0.0], [3.0, -3.0], [5.0, 10.0]])
#定义混淆矩阵的均值
>>> covars = np.tile(np.identity(2), (3, 1, 1))# 定义混淆矩阵的方差
>>> model = hmm.GaussianHMM(3, "full", startprob, transmat)# 定义一个混淆矩阵为高斯分布的隐马尔科夫模型。 这里‘full’的意思就是说你输入的方差矩阵每个元素都给出了,不是一个只是对角线上的元素为0的矩阵
>>> model.means_ = means
>>> model.covars_ = covars#把你希望的均值方差输入你定义的模型里面,到此你就把混淆矩握渣槐阵输入进模型了
>>> X, Z = model.sample(100)

对于Multinomial 和 GMM,我还没用,不过Multinomial应该是需要你自己手动输入隐状态到观察态的概率的,而GMM应该是和Gaussian类型类似,只是需要多输入一个权重因子。

对于第二个问题,covariance_type意思是你的混淆矩阵的covariance matrix是什么类型,比如若只是对角线上的元素不为0,则把covariance_type设为‘diag’。

❿ python是否有绘制混淆矩阵的函数,怎么来实现

#-*-coding:UTF-8-*-
"""绘制混淆矩阵图"""
importmatplotlib.pyplotasplt
fromsklearn.metricsimportconfusion_matrix


defconfusion_matrix_plot_matplotlib(y_truth,y_predict,cmap=plt.cm.Blues):
"""Matplotlib绘制混淆矩阵图
parameters
----------
y_truth:真实的y的值,1darray
y_predict:预测的y的值,1darray
cmap:画混淆矩阵图的配色风格,使用cm.Blues,更多风格请参考官网
"""
cm=confusion_matrix(y_truth,y_predict)
plt.matshow(cm,cmap=cmap)#混淆矩阵图
plt.colorbar()#颜色标签

forxinrange(len(cm)):#数据标签
foryinrange(len(cm)):
plt.annotate(cm[x,y],xy=(x,y),horizontalalignment='center',verticalalignment='center')

plt.ylabel('Truelabel')#坐标轴标签
plt.xlabel('Predictedlabel')#坐标轴标签
plt.show()#显示作图结果


if__name__=='__main__':
y_truth=[1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]
y_predict=[1,0,0,1,0,1,1,1,1,1,0,1,0,1,0]
confusion_matrix_plot_matplotlib(y_truth,y_predict)

热点内容
搭建小米云服务器 发布:2024-05-19 19:43:17 浏览:130
苹果手机备忘录怎么加密 发布:2024-05-19 18:57:57 浏览:16
光荣脚本 发布:2024-05-19 18:57:48 浏览:997
pythonjson字符串 发布:2024-05-19 18:51:43 浏览:253
什么是服务器厂商介绍 发布:2024-05-19 18:50:09 浏览:371
服务器网卡硬件型号怎么看 发布:2024-05-19 18:36:41 浏览:666
修改pve服务器ip 发布:2024-05-19 18:31:52 浏览:469
微信密码忘记了如何取出里面的钱 发布:2024-05-19 18:27:35 浏览:330
vs2005反编译 发布:2024-05-19 18:26:34 浏览:364
ug启动语言脚本 发布:2024-05-19 18:25:57 浏览:875