首页编程confusionmatrix(matlab 怎么输出confusion matrix)

confusionmatrix(matlab 怎么输出confusion matrix)

编程之家2023-11-0784次浏览

亲爱的读者们,你是否对confusionmatrix和matlab 怎么输出confusion matrix的相关问题感到困惑?别担心,今天我将为你解答这些问题,让你对此有更清晰的认识。

confusionmatrix(matlab 怎么输出confusion matrix)

sklearn中ConfusionMatrix

sklearn输出的评价矩阵

输出结果

结果分析

输出结果

参考:基于混淆矩阵的评价指标

识别任务中混淆矩阵(Confusion Matrix)用于评价算法好坏的指标。下图是一个二分类问题的混淆矩阵:

confusionmatrix(matlab 怎么输出confusion matrix)

相关术语:

AccuracyRate(准确率):(TP+TN)/(TP+TN+FN+FP)

ErrorRate(误分率):(FN+FP)/(TP+TN+FN+FP)

Recall(召回率,查全率,击中概率): TP/(TP+FN),在所有GroundTruth为正样本中有多少被识别为正样本了;

confusionmatrix(matlab 怎么输出confusion matrix)

Precision(查准率): TP/(TP+FP),在所有识别成正样本中有多少是真正的正样本;

TPR(TruePositive Rate): TP/(TP+FN),实际就是Recall

FAR(FalseAcceptance Rate)或FPR(False Positive Rate): FP/(FP+TN),错误接收率,误报率,在所有GroundTruth为负样本中有多少被识别为正样本了;

FRR(FalseRejection Rate): FN/(TP+FN),错误拒绝率,拒真率,在所有GroundTruth为正样本中有多少被识别为负样本了,它等于1-Recall

ROC曲线(receiver operatingcharacteristic curve):

每个阈值的识别结果对应一个点(FPR,TPR),当阈值最大时,所有样本都被识别成负样本,对应于右上角的点(0,0),当阈值最小时,所有样本都被识别成正样本,对应于右上角的点(1,1),随着阈值从最大变化到最小,TP和FP都逐渐增大;

一个好的分类模型应尽可能位于图像的左上角,而一个随机猜测模型应位于连接点(TPR=0,FPR=0)和(TPR=1,FPR=1)的主对角线上;

可以使用ROC曲线下方的面积AUC(AreaUnder roc Curve)值来度量算法好坏:如果模型是完美的,那么它的AUG= 1,如果模型是个简单的随机猜测模型,那么它的AUG= 0.5,如果一个模型好于另一个,则它的曲线下方面积相对较大;

ERR(Equal Error Rate,相等错误率):FAR和FRR是同一个算法系统的两个参数,把它放在同一个坐标中。FAR是随阈值增大而减小的,FRR是随阈值增大而增大的。因此它们一定有交点。这个点是在某个阈值下的FAR与FRR等值的点。习惯上用这一点的值来衡量算法的综合性能。对于一个更优的指纹算法,希望在相同阈值情况下,FAR和FRR都越小越好。

matlab 怎么输出confusion matrix

以Training confusion matrix为例。

M(1,1),对应内含[1000,17.1%]数字。表示,有1000个输出为1类中,被正确反应了是1类。

M(1,2),表示:在253个输出为1类中,却实际上是属于第2类。

M(1,3),对应内含[79.8%,20.2%]。表示,在输出的1中,有79.8%被正确反应了。

M(3,1),对应内含[69.5%,30.5%]。表示,实际中属于第1类的个数中,有69.5%的个体被正确认别。

M(3,2),表示,实际中属于第2类的个数中,有94.3%的个体被正确认别。

python scikit-learn 有什么算法

1,前言

很久不发文章,主要是Copy别人的总感觉有些不爽,所以整理些干货,希望相互学习吧。不啰嗦,进入主题吧,本文主要时说的为朴素贝叶斯分类算法。与逻辑回归,决策树一样,是较为广泛使用的有监督分类算法,简单且易于理解(号称十大数据挖掘算法中最简单的算法)。但其在处理文本分类,邮件分类,拼写纠错,中文分词,统计机器翻译等自然语言处理范畴较为广泛使用,或许主要得益于基于概率理论,本文主要为小编从理论理解到实践的过程记录。

2,公式推断

一些贝叶斯定理预习知识:我们知道当事件A和事件B独立时,P(AB)=P(A)(B),但如果事件不独立,则P(AB)=P(A)P(B|A)。为两件事件同时发生时的一般公式,即无论事件A和B是否独立。当然也可以写成P(AB)=P(B)P(A|B),表示若要两件事同事发生,则需要事件B发生后,事件A也要发生。

由上可知,P(A)P(B|A)= P(B)P(A|B)

推出P(B|A)=

其中P(B)为先验概率,P(B|A)为B的后验概率,P(A|B)为A的后验概率(在这里也为似然值),P(A)为A的先验概率(在这也为归一化常量)。

由上推导可知,其实朴素贝叶斯法就是在贝叶斯定理基础上,加上特征条件独立假设,对特定输入的X(样本,包含N个特征),求出后验概率最大值时的类标签Y(如是否为垃圾邮件),理解起来比逻辑回归要简单多,有木有,这也是本算法优点之一,当然运行起来由于得益于特征独立假设,运行速度也更快。

.参数估计

3,参数估计

由上面推断出的公式,我们知道其实朴素贝叶斯方法的学习就是对概率P(Y=ck)和P(X(j)=x(j)|Y=ck)的估计。我们可以用极大似然估计法估计上述先验概率和条件概率。

其中I(x)为指示函数,若括号内成立,则计1,否则为0。李航的课本直接给出了用极大似然(MLE)估计求出的结果,并没给推导过程,

我们知道,贝叶斯较为常见的问题为0概率问题。为此,需要平滑处理,主要使用拉普拉斯平滑,如下所示:

K是类的个数,Sj是第j维特征的最大取值。实际上平滑因子λ=0即为最大似然估计,这时会出现提到的0概率问题;而λ=1则避免了0概率问题,这种方法被称为拉普拉斯平滑。

4,算法流程

5,朴素贝叶斯算法优缺点

优点:朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率

需调参较少,简单高效,尤其是在文本分类/垃圾文本过滤/情感判别等自然语言处理有广泛应用。

在样本量较少情况下,也能获得较好效果,计算复杂度较小,即使在多分类问题。

无论是类别类输入还是数值型输入(默认符合正态分布)都有相应模型可以运用。

缺点:0概率问题,需要平滑处理,通常为拉普拉斯平滑,但加一平滑不一定为效果最好,

朴素贝叶斯有分布独立的假设前提,生活中较少完全独立,在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。

模型注意点:

1,大家也知道,很多特征是连续数值型的,一般选择使用朴素贝叶斯高斯模型。

2,为避免0概率事件,记得平滑,简单一点可以用『拉普拉斯平滑』。先处理处理特征,把相关特征去掉,

3,朴素贝叶斯分类器一般可调参数比较少,需集中精力进行数据的预处理等特征工程工作。

6,Scikit-learn三大朴素贝叶斯模型

Scikit-learn里面有3种不同类型的朴素贝叶斯(:

1,高斯分布型模型:用于classification问题,假定属性/特征是服从正态分布的,一般用在数值型特征。,

2,多项式型模型:用于离散值模型里。比如文本分类问题里面我们提到过,我们不光看词语是否在文本中出现,也得看出现的次数。如果总词数为n,出现词数为m的话,说起来有点像掷骰子n次出现m次这个词的场景。

3,伯努利模型:这种情况下,就如提到的bag ofwords处理方式一样,最后得到的特征只有0(没出现)和1(出现过)。

7. Scikit-learn算法实践

小编通过实现朴素贝叶斯三种模型以及主要分类算法,对比发现跟SVM,随机森林,融合算法相比,贝叶斯差距明显,但其时间消耗要远低于上述算法,以下为主要算法主要评估指标)。

8. Python代码

#-*-coding: utf-8-*-

importtime

fromsklearn import metrics

fromsklearn.naive_bayes import GaussianNB

fromsklearn.naive_bayes import MultinomialNB

fromsklearn.naive_bayes import BernoulliNB

fromsklearn.neighbors import KNeighborsClassifier

fromsklearn.linear_model import LogisticRegression

fromsklearn.ensemble import RandomForestClassifier

fromsklearn import tree

fromsklearn.ensemble import GradientBoostingClassifier

fromsklearn.svm import SVC

importnumpy as np

importurllib

# urlwith dataset

url="-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"

#download the file

raw_data= urllib.request.urlopen(url)

#load the CSV file as a numpy matrix

dataset= np.loadtxt(raw_data, delimiter=",")

#separate the data from the target attributes

X=dataset[:,0:7]

#X=preprocessing.MinMaxScaler().fit_transform(x)

#print(X)

y=dataset[:,8]

print("\n调用scikit的朴素贝叶斯算法包GaussianNB")

model= GaussianNB()

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的朴素贝叶斯算法包MultinomialNB")

model= MultinomialNB(alpha=1)

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的朴素贝叶斯算法包BernoulliNB")

model= BernoulliNB(alpha=1,binarize=0.0)

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的KNeighborsClassifier")

model= KNeighborsClassifier()

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的LogisticRegression(penalty='l2')")

model= LogisticRegression(penalty='l2')

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的RandomForestClassifier(n_estimators=8)")

model= RandomForestClassifier(n_estimators=8)

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的tree.DecisionTreeClassifier()")

model= tree.DecisionTreeClassifier()

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的GradientBoostingClassifier(n_estimators=200)")

model= GradientBoostingClassifier(n_estimators=200)

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

print("\n调用scikit的SVC(kernel='rbf', probability=True)")

model= SVC(kernel='rbf', probability=True)

start_time= time.time()

model.fit(X,y)

print('training took%fs!'%(time.time()- start_time))

print(model)

expected= y

predicted= model.predict(X)

print(metrics.classification_report(expected,predicted))

print(metrics.confusion_matrix(expected,predicted))

"""

#预处理代码集锦

importpandas as pd

df=pd.DataFrame(dataset)

print(df.head(3))

print(df.describe())##描述性分析

print(df.corr())##各特征相关性分析

##计算每行每列数据的缺失值个数

defnum_missing(x):

return sum(x.isnull())

print("Missing values per column:")

print(df.apply(num_missing, axis=0))#axis=0代表函数应用于每一列

print("\nMissing values per row:")

print(df.apply(num_missing, axis=1).head())#axis=1代表函数应用于每一行"""

如何用python画好confusion matrix

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

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

直接贴上代码:

[python]view plaincopy

'''''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

非常感谢您的阅读!我们希望本文对于解决您关于confusionmatrix的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。

车牌识别代码 车牌识别码是什么微信开发者工具?微信公众平台开发需要哪些工具