SVC模型评估指标与ROC曲线

目录

1.解决二分类SVC中的样本不均衡问题

1.1 概述

1.2 SVC参数class_weight

1.3 参数class_weight的使用

2.SVC模型评估指标

2.1 混淆矩阵(Confusion Matrix)

2.1.1 模型整体效果:准确率

2.1.2 精确度

2.1.3 召回率

 2.1.3 F1 measure

2.1.4 假负率(False Negative Rate)

2.1.5 特异度

2.1.6 假正率

2.2 sklearn中混淆矩阵的类

 3. ROC曲线及其相关问题

3.1 概率(probability)与阈值(threshold)

3.2 SVM实现概率预测:参数probability,接口predict_proba以及decision_function

3.3 绘制SVM的ROC曲线

3.4 sklearn中的ROC曲线和AUC面积

3.4.1 sklearn.metrics.roc_curve

3.4.2 AUC面积 sklearn.metrics.roc_auc_score

3.5 利用ROC曲线找出最佳阈值 


1.解决二分类SVC中的样本不均衡问题

1.1 概述

        样本不均衡是只在一组数据集中,标签的其中一类占有很大的比例,但我们有着捕捉特定的分类需求的状况。比如,我们现在要对潜在犯罪者和普通人分类,潜在犯罪者占总人口的比例是相当低的,也许只有2%左右,98%的人都是普通人,而我们的目标是找出潜在犯罪者。这样的标签分布会带来许多问题:

        首先,分类模型天生会倾向于多数的类,让多数类更容易被判断正确,少数类被牺牲掉。因为对于模型而言,样本量越大的标签可以学习的信息越多,算法就会更加依赖于从多数类中学到的信息来判断。如果我们希望捕获少数类,模型就会失败,

        其次,模型评估指标会失去意义。这种分类情况下,即使模型什么都不做,全把所有人都当成不会犯罪的人,准确率也能非常高,这使得模型评估指标accuracy变得毫无意义,根本无法达到我们的“要识别出会犯罪的人”的建模目的。

1.2 SVC参数class_weight

        在逻辑回归中,参数class_weight默认为None,此模式表示数据集中的所有标签是均衡的,即自动认为标签的比例是1:1,。所以当样本不均衡的时候,我们可以使用形如{“标签的值1”:权重1,“标签的值2”:权重2}的字典来输入真实的样本标签比例,来让算法意识到样本是不平衡的。或者使用“balanced”模式,直接使用n_sample/(n_classes*np.bincount(y))作为权重,可以比较好地修正我们样本不均衡的情况。

1.3 参数class_weight的使用

        首先自建一组样本不平衡的数据集,然后在这组数据集上建立两个模型,一个设置有class_weight参数,另一个则不设置:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# 建模,不设定class_weight
clf=svm.SVC(kernel='linear',C=1.0)
clf.fit(x,y)
# 设定class_weight
wclf=svm.SVC(kernel='linear',class_weight={1:10})
wclf.fit(x,y)

分别绘制两个模型的决策边界:

plt.figure(figsize=(6,5))
plt.scatter(x[:,0],x[:,1],c=y,cmap="rainbow",s=10)
ax=plt.gca()

# 绘制两个模型下的决策边界,首先要有网格
xlim=ax.get_xlim()
ylim=ax.get_ylim()
xx=np.linspace(xlim[0],xlim[1],30)
yy=np.linspace(ylim[0],ylim[1],30)
YY,XX=np.meshgrid(yy,xx)
xy=np.vstack([XX.ravel(),YY.ravel()]).T

# 找出样本点到决策边界的距离
Z_clf=clf.decision_function(xy).reshape(XX.shape)
a=ax.contour(XX,YY,Z_clf,colors='black',levels=[0],alpha=0.5,linestyles=['-'])

Z_wclf=wclf.decision_function(xy).reshape(XX.shape)
b=ax.contour(XX,YY,Z_wclf,colors='red',levels=[0],alpha=0.5,linestyles=['-'])

# 画图例
plt.legend([a.collections[0],b.collections[0]],["non weight","weighted"],loc="upper right")
plt.show()

 

:a.collections 调用这个等高线对象中画的所有线,返回一个惰性对象 

 从图像上可以看出,灰色是样本平衡之前的决策边界。灰色线上方的点被分为一类,下方的点被分为另一类,可以看到大约有一半少数类(红色)被分错,多数类(紫色)几乎都被分类正确。红色线是平衡之后的决策边界,同样红色线上方是一类,红色线下方是一类,可以看到,做了样本平衡之后,少数类几乎全部都被分类正确了,但多数类有很多被分错了。接着分别输出两个模型的accuracy准确度:

clf.score(x,y)
0.9418181818181818
wclf.score(x,y)
0.9127272727272727

可以看出,从准确率的角度来看,不做样本平衡的时候准确率反而更高,做了样本平衡之后准确率反而变低,这是因为做了样本平衡后,为了要更有效地捕捉少数类,模型误伤了许多多数类样本,而多数类被分错的样本数量>少数类被分类正确的样本数量,使得模型整体的精确性下降。现在,如果我们的目的是模型整体的准确率,那我们就要拒绝样本平衡,使用不设置class_weight的模型

2.SVC模型评估指标

        从上面的例子可以看出,如果我们的目标是尽量捕获少数类,那么准确率这个模型评估指标便失效了。如果简单来看,我们只需要查看模型在少数类上的准确率就好了,只要能够将少数类尽量捕捉出来,就能够达到我们的目的。但是,一味的追求捕捉少数类,而不顾及多数类,就无法达成模型的效果。所以在现实中,我们往往在寻找捕获少数类的能力将多数类判断错后需要付出的成本的平衡。如果一个模型能够尽量捕获少数类的情况下,还能够尽量对多数类分类正确,则这个模型就非常优秀了。为了评估这样的能力,我们将引入新的模型评估指标:混淆矩阵和ROC曲线

2.1 混淆矩阵(Confusion Matrix)

        混淆矩阵是二分类问题的多维衡量指标体系,在样本不平衡时极其有用,我们将少数类认为是正例,多数类认为是负例。在决策树,随机森林这些普通分类算法里,少数类是1,多数类是0,对于支持向量机,少数类是1,多数类是-1.普通的混淆矩阵,一般是使用{0,1}来表示。标准二分类的混淆矩阵如图所示:

混淆矩阵中,真实值在前,预测值在后,可以看出,主对角线就是全部预测正确的,副对角线就是全部预测错误的。基于混淆矩阵,我们有六个不同的模型评估指标,这些评估指标的范围都介于[0,1],所有以11和00为分子的指标都是越接近1越好,所有以01和10为分子的指标都是越接近0越好。对于所有的指标,以下用橙色表示分母,绿色表示分子。

2.1.1 模型整体效果:准确率

        准确率Accuracy就是所有预测正确的所有样本除以总样本,通常来说越接近1越好。

Accuracy=\frac{11+00}{11+10+01+00}

2.1.2 精确度

        精确度Precision,又叫查准率,表示所有被我们预测为是少数类的样本中,真正的少数类所占的比例。在支持向量机中,精确度可以被形象地表示为决策边界上方的所有点中红色点所占的比例,精确度越高,代表我们捕捉正确的红色点越多,对少数类的预测越精确。精确度越低,则代表我们误伤了过多的多数类。精确度是“将多数类判错后所需付出成本的衡量”。

 Precision=\frac{11}{11+01}

对于上面的例子,分别求两个模型的精确度(所有判断正确并确实为1的样本/所有被判断为1的样本)

# 对于没有class_weight,没有做样本平衡的灰色决策边界
(y[y==clf.predict(x)]==1).sum()/(clf.predict(x)==1).sum()
0.7142857142857143
# 对于有class_weight,做样本平衡的红色决策边界
(y[y==wclf.predict(x)]==1).sum()/(wclf.predict(x)==1).sum()
0.5102040816326531

可以看出,做了样本平衡之后,精确度是下降的。因为很明显在样本平衡之后,有更多的多数类紫色点被我们误分。

2.1.3 召回率

        召回率Recall,又被称作为敏感度(sensitivity),真正率,查全率,表示所有真实为1的样本中,被我们预测正确的样本所占的比例。在支持向量集中,召回率可以被表示为,决策边界上方的所有红色点占全部样本中红色点的比例,召回率越高,代表我们尽量捕捉了越多的少数类。

Recall=\frac{11}{11+10}

 对于上面的例子,分别求两个模型的召回率(所有predict为1的样本/全部为1的样本)

# 对于没有class_weight,没有做样本平衡的灰色决策边界
(y[y==clf.predict(x)]==1).sum()/(y==1).sum()
0.6
# 对于有class_weight,做样本平衡的红色决策边界
(y[y==wclf.predict(x)]==1).sum()/(y==1).sum()
1.0

可以看出,样本平衡之前,我们只捕获了60%的少数类点,做了样本平衡之后捕获了100%的少数类点。从图像上看,红色决策边界捕捉出了全部的少数类,而灰色决策边界只捕捉到了60%。

 2.1.3 F1 measure

        根据以上我们注意到召回率和精确度的分子是相同的,只是分母不同。而召回率和精确度是此消彼长的,两者之间的平衡代表了捕捉少数类的需求和尽量不要误伤多数类的需求的平衡。为了同时兼顾精确度和召回率,我们创造了两者的调和平均数作为考量两者平衡的综合性指标,称之为F1 measure。两个数之间的调和平均倾向于靠近两个数中比较小的那个数,因此我们追求尽量高的F1 measure,能够保证精确度和召回率都比较高。F1measure介于[0,1],越接近1越好。

F1-measure=\frac{2}{\frac{1}{Precision}+\frac{1}{Recall}}=\frac{2*Precision*Recall}{Precision+Recall}

2.1.4 假负率(False Negative Rate)

       从Recall延伸出来的另一个评估指标假负率(False Negative Rate),它等于1-Recall,用于衡量所有真实为1的样本中,被判断为0的,通常用的不多:

FNR=\frac{10}{11+10}

2.1.5 特异度

        特异度(Specificity)表示所有真实为0的样本中,被正确预测为0的样本所占的比例。在支持向量机中,可以表示为决策边界下方的点占所有紫色点的比例。

Specificity=\frac{00}{01+00}

 对于上面的例子,分别求两个模型的特异度(所有被正确predict为0的样本/全部为0的样本)

# 对于没有class_weight,没有做样本平衡的灰色决策边界
(y[y==clf.predict(x)]==0).sum()/(y==0).sum()
0.976
# 对于有class_weight,做样本平衡的红色决策边界
(y[y==wclf.predict(x)]==0).sum()/(y==0).sum()
0.904

2.1.6 假正率

        特异度衡量了一个模型将多数类判断正确的能力,而1-specificity就是一个模型将多数类判断错误的能力,这种能力叫做假正率(False Positive Rate),被计算如下:

FPR=\frac{01}{01+00}

        在支持向量机中,假正率就是决策边界上方紫色的点(所有被判断错误的多数类)占所有紫色点的比例。根据之前Precision的分析,可得出,当样本均衡过后,假正率会更高,因为有更多紫色的点被判断错误,而在均衡之前,假正率比较低,被判断的紫色点比较少,所以假正率其实类似于Precision的反向指标。

2.2 sklearn中混淆矩阵的类

含义
sklearn.metrics.confusion_matrix混淆矩阵
sklearn.metrics.accuracy_score准确率 accuracy
sklearn.metrics.precision_score精确度 precision
sklearn.metrics.recall_score召回率 recall
sklearn.metrics.precision_recall_curve精确度-召回率平衡曲线,可以展示不同阈值下精确度和召回率如何变化。
sklearn.metrics.f1_scoreF1 measure

 3. ROC曲线及其相关问题

        基于混淆矩阵,我们了解到其中6个指标,其中,假正率有一个非常重要的应用:我们在追求较高的Recall的时候,Precision会下降,也就是说随着少数类被捕捉出来,会有更多的多数类被判断错误。那么随着Recall的逐渐增加,模型将多数类判断错误的情况是如何变化呢?我们希望理解:每判断正确一个少数类,就有多少个多数类会被判断错误。假正率正好可以衡量这个能力的变化。相对的,Precision无法判断这些判断错误的多数类在全部多数类中究竟占多大的比例,所以无法在提升Recall的过程中也顾及到模型整体的Accuracy。因此,我们可以使用Recall和FPR之间的平衡,来替代Recall和Precision之间的平衡,让我们衡量模型在尽量捕捉少数类的时候,误伤多数类的情况如何变化,这就是ROC曲线。

        ROC曲线,全称The Receiver Operating Characteristic Curve,这是一条以不同阈值下的假正率FPR为横坐标,不同阈值下的召回率Recall为纵坐标的曲线,

 3.1 概率(probability)与阈值(threshold)

class_1_=7
class_2_=4
centers_=[[0.0,0.0],[1,1]] #设定两个类别的中心
clusters_std=[0.5,1.0] #设定两个类别的方差,通常来说,样本量比较大的类别会更加松散
x_,y_=make_blobs(n_samples=[class_1_,class_2_]
              ,centers=centers_
              ,cluster_std=clusters_std
              ,random_state=0
              ,shuffle=False)
plt.scatter(x_[:,0],x_[:,1],c=y_,cmap="rainbow",s=30)
plt.show()

 

# 逻辑回归
from sklearn.linear_model import LogisticRegression as LogiR
clf_lo=LogiR().fit(x_,y_)
prob=clf_lo.predict_proba(x_)
# 将样本和概率放到已故DataFrame中
import pandas as pd
prob=pd.DataFrame(prob)
prob.columns=["0","1"]
prob
01
00.6946190.305381
10.5109310.489069
20.8200380.179962
30.7856470.214353
40.7773870.222613
50.6566340.343366
60.7685860.231414
70.3491710.650829
80.3661840.633816
90.6632720.336728
100.6075290.392471
for i in range(prob.shape[0]):
    if prob.loc[i,"1"]>0.5:
        prob.loc[i,"pred"]=1
    else:
        prob.loc[i,"pred"]=0
prob["y_true"]=y_
prob=prob.sort_values(by="1",ascending=False)
prob
01predy_true
70.3491710.6508291.01
80.3661840.6338161.01
10.5109310.4890690.00
100.6075290.3924710.01
50.6566340.3433660.00
90.6632720.3367280.01
00.6946190.3053810.00
60.7685860.2314140.00
40.7773870.2226130.00
30.7856470.2143530.00
20.8200380.1799620.00
from sklearn.metrics import confusion_matrix as CM,precision_score as P,recall_score as R
CM(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) #真实值,预测值 labels把少数类写在前面
array([[2, 2],
       [0, 7]], dtype=int64)
P(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) #真实值,预测值
1.0
R(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) #真实值,预测值
0.5
# 手动调节阈值,来改变我们的模型效果
for i in range(prob.shape[0]):
    if prob.loc[i,"1"]>0.4:
        prob.loc[i,"pred"]=1
    else:
        prob.loc[i,"pred"]=0
prob["y_true"]=y_
prob=prob.sort_values(by="1",ascending=False)
from sklearn.metrics import confusion_matrix as CM,precision_score as P,recall_score as R
CM(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) 
array([[0, 4],
       [3, 4]], dtype=int64)
P(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) #真实值,预测值
0.0
R(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) 
0.0

可见,降低或升高阈值并不一定能够让模型的效果变好,一切都基于我们要追求怎样的模型效果
but通常来说,降低阈值能够升高recall

3.2 SVM实现概率预测:参数probability,接口predict_proba以及decision_function

        在画决策边界时使用SVC的接口decision_function,它返回输入的特征矩阵中每个样本到划分数据集的超平面的距离。在SVM中利用超平面来判断样本,所以,到超平面的距离一定程度上反应了样本归属于某个标签类的可能性。接口decision_function返回的值也因此被我们认为是SVM中的置信度(confidence)。不过置信度始终不是概率,它没有边界,可以无限大,大部分时候也不是以百分比或小数的形式呈现,而SVC判断过程并不是求解一个比例,为了解决这个矛盾,SVC有重要参数probability。

参数含义
probability

可不填,默认为False

是否启用概率估计,进行必须在调用fit之前启用它,启用此功能会减慢SVM的运算速度。

在二分类情况下,SVC将使用Platt缩放来生成概率,即在decision_function生成的距离上进行Sigmoid压缩,并附加训练数据的交叉验证拟合,来生成类逻辑回归的SVM分数。

clf_proba=svm.SVC(kernel="linear",C=1.0,probability=True).fit(x,y)
clf_proba.predict_proba(x) #生成各类标签下的概率
array([[0.6598688 , 0.3401312 ],
       [0.24842973, 0.75157027],
       [0.95680644, 0.04319356],
       ...,
       [0.14716296, 0.85283704],
       [0.33726837, 0.66273163],
       [0.29846324, 0.70153676]])
clf_proba.decision_function(x) #生成距离

值得注意的是,在二分类过程中,decision_function只会生成一列距离,样本的类别由距离的符号来判断,但predict_proba会生成两个类别分别对应的概率。SVM也可以生成概率,我们同样也可以使用和逻辑回归同样的方式来在SVM上设定和调节阈值。

在二分类过程中,有可能出现predict_proba返回的概率小于0.05,但样本依旧被标记为正类的情况,毕竟支持向量机本身并不依赖于概率来完成自己的分类。如果我们的确需要置信度分数,但不一定要是概率,可以将probability设置为False,使用decision_function而不是predict_proba。

3.3 绘制SVM的ROC曲线

        ROC曲线是一条以不同阈值下的假正率FPR为横坐标,不同阈值下召回率Recall为纵坐标。首先,我们来看看如何从混淆矩阵中获得FPR和Recall:

cm=CM(prob.loc[:,"y_true"],prob.loc[:,"pred"],labels=[1,0]) #混淆矩阵
# FPR 被我们预测错误的0占所有真正为0的样本的比例
cm[1,0]/cm[1,:].sum()
# Recall
cm[0,0]/cm[0,:].sum()

开始绘图:

recall=[]
FPR=[]
probrange=np.linspace(clf_proba.predict_proba(x)[:,1].min(),clf_proba.predict_proba(x)[:,1].max(),num=50,endpoint=False)
from sklearn.metrics import confusion_matrix as CM,recall_score as R
import matplotlib.pyplot as plt

for i in probrange:
    y_predict=[]
    for j in range(x.shape[0]):
        if clf_proba.predict_proba(x)[j,1]>i:
            y_predict.append(1)
        else:
            y_predict.append(0)
    cm=CM(y,y_predict,labels=[1,0])
    recall.append(cm[0,0]/cm[0,:].sum())
    FPR.append(cm[1,0]/cm[1,:].sum())
recall.sort()
FPR.sort()

plt.plot(FPR,recall,c="red")
plt.plot(probrange+0.05,probrange+0.05,c="black",linestyle="--")
plt.show()

        ROC曲线的根本目标是追寻Recall和FPR之间的平衡,让我们能够衡量模型在尽量捕捉少数类的时候,误伤多数类的情况会如何变化。模型的横坐标是FPR,代表着模型将多数类判断错误的能力,纵坐标是Recall,代表着捕捉少数类的能力。所以我们希望随着Recall的不断增加,FPR增加得越慢越好,这说明我们可以尽量高效的捕捉少数类,而不会将很多的多数类判断错误。

         中间的虚线代表着当recall增加1%,FPR也增加1%,这种情况下,模型的效果就不好。ROC曲线通常是凸性的,对于一条凸性ROC曲线来说,曲线越靠近左上角越好,曲线如果在虚线的下方,则证明模型完全不可用。但它也有可能是一条凹型的曲线,应该越往右下角越好,凹型曲线代表模型的预测效果与真实情况完全相反,那也不算糟糕,只要我们手动将模型的结果逆转,就可以得到一条左上方的曲线了。

3.4 sklearn中的ROC曲线和AUC面积

3.4.1 sklearn.metrics.roc_curve

        在sklearn中,有计算ROC曲线的横坐标假正率FPR,纵坐标Recall和对应阈值的类,sklearn.metrics.roc_curve(y_true,y_score,pos_label=None,sample_weight=None,drop_intermediate=True)

y_true:真实标签

y_score:置信度分数,可以是正类样本的概率值或置信度分数,或者decision_function返回的距离

pos_label:整数或字符串,默认为None,表示被认为是正类的样本。

sample:weight:形如[n_samples]的类数组结构,可不填,表示样本的权重。

drop_intermediate:布尔值,默认为True,如果设置为True,表示会舍弃一些ROC曲线上不显示的阈值点,这对于计算一个比较轻量的ROC曲线来说非常有用。

这个类返回:FPR,Recall,阈值

from sklearn.metrics import roc_curve
FPR,recall,thresholds=roc_curve(y,clf_proba.decision_function(x),pos_label=1)
FPR.shape
(45,)
recall
array([0.  , 0.02, 0.02, 0.06, 0.06, 0.16, 0.16, 0.2 , 0.2 , 0.22, 0.22,
       0.36, 0.36, 0.42, 0.42, 0.6 , 0.6 , 0.62, 0.62, 0.64, 0.64, 0.68,
       0.68, 0.7 , 0.7 , 0.74, 0.74, 0.76, 0.76, 0.82, 0.82, 0.84, 0.84,
       0.86, 0.86, 0.88, 0.88, 0.92, 0.92, 0.94, 0.94, 0.96, 0.96, 1.  ,
       1.  ])
thresholds #此时的threshold就不是一个概率值,而是距离值中的距离了,所以它可以大于1,也可以为负
array([  3.18236076,   2.18236076,   1.48676267,   1.35964325,
         1.33920817,   1.14038015,   1.13383091,   1.00003406,
         0.85085628,   0.84476439,   0.78571364,   0.60568093,
         0.5389064 ,   0.46718521,   0.44396046,   0.03907036,
        -0.07011269,  -0.10668727,  -0.1258212 ,  -0.13845693,
        -0.14034183,  -0.16790648,  -0.2040958 ,  -0.22137683,
        -0.24381463,  -0.26762451,  -0.34446784,  -0.3467975 ,
        -0.39182241,  -0.40676459,  -0.4589064 ,  -0.46310299,
        -0.49195707,  -0.5088941 ,  -0.53560561,  -0.55152081,
        -0.62628865,  -0.67580418,  -0.78127198,  -0.79874442,
        -0.88438995,  -0.91257798,  -1.01417607,  -1.08601917,
       -10.31959605])

3.4.2 AUC面积 sklearn.metrics.roc_auc_score

sklearn.metrics.roc_auc_score(y_true,y_score,average='marco',sample_weight=None,max_fpr=None) AUC面积的分数使用以上类来进行计算,就是真实标签和与roc_curve一致的置信度分数或者概率值。

from sklearn.metrics import roc_auc_score as AUC
area=AUC(y,clf_proba.decision_function(x))

绘图:

plt.figure()
plt.plot(FPR,recall,color="red",label='ROC curve (area=%0.2f)'%area)
plt.plot([0,1],[0,1],color='black',linestyle='--')
plt.xlim([-0.05,1.05])
plt.ylim([-0.05,1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('Recall')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

对比使用decision_function画出的ROC曲线和强行使用概率画出的曲线,两者非常相似,所以,在无法获取概率模型下,如果有置信度特是可以完成ROC曲线的。

3.5 利用ROC曲线找出最佳阈值 

最佳阈值,即Recall和FPR差距最大的点,这个点,又叫做约登指数。

maxindex=(recall-FPR).tolist().index(max(recall-FPR)) #返回这个最大值在list的索引
plt.figure()
plt.plot(FPR,recall,color="red",label='ROC curve (area=%0.2f)'%area)
plt.plot([0,1],[0,1],color='black',linestyle='--')
plt.scatter(FPR[maxindex],recall[maxindex],c='black',s=30)
plt.xlim([-0.05,1.05])
plt.ylim([-0.05,1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('Recall')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

 

可以看出,这个点其实是图像上李左上角最近,离虚线最远的点,也是ROC的转折点。 

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SVM分类模型的评价指标通常包括以下几个方面: 1. 准确率(Accuracy):分类器正确分类的样本数占总样本数的比例。 2. 精确率(Precision):在所有预测为正例的样本中,真正为正例的样本数占预测为正例的样本数的比例。 3. 召回率(Recall):在所有真正为正例的样本中,被正确预测为正例的样本数占真正为正例的样本数的比例。 4. F1值(F1-score):综合考虑精确率和召回率,是精确率和召回率的调和平均数。 5. AUC(Area Under Curve):ROC曲线下的面积,用于评价二分类模型的性能。 下面是一个示例代码,展示如何使用sklearn库中的metrics模块计算SVM分类模型的评价指标: ```python from sklearn import svm, metrics from sklearn.model_selection import train_test_split import numpy as np # 加载数据集 data = np.loadtxt('data.csv', delimiter=',') X = data[:, :-1] = data[:, -1] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 训练SVM分类器 clf = svm.SVC(kernel='linear', C=1, probability=True) clf.fit(X_train, y_train) # 在测试集上进行预测 y_pred = clf.predict(X_test) y_prob = clf.predict_proba(X_test)[:, 1] # 计算评价指标 accuracy = metrics.accuracy_score(y_test, y_pred) precision = metrics.precision_score(y_test, y_pred) recall = metrics.recall_score(y_test, y_pred) f1_score = metrics.f1_score(y_test, y_pred) auc = metrics.roc_auc_score(y_test, y_prob) # 输出评价指标 print('Accuracy:', accuracy) print('Precision:', precision) print('Recall:', recall) print('F1-score:', f1_score) print('AUC:', auc) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值