分类模型的三种评价标准
分类模型有三种评价标准,分别是:混淆矩阵,ROC曲线和AUC面积
第一种标准:混淆矩阵
混淆矩阵:如下图
<1.>各个参数的含义:
N/P=negative/positive:表示猜结果为错误(negative)或猜结果为正确(positive)。
T/F=true/false:表示预测成功(True)或预测失败(False)。
TN:表示猜结果应该为错误(negative即0),预测成功(true),真正的结果也是0。
FP:表示猜结果应该为正确的(positive,即1),但是真正的结果却是0,即预测失败了(false)。
预测结果(P/N)放在后面,预测结果是否正确(F/T)放在前面。
<2.>混淆矩阵的的各个评价指标:
正确率ACCuracy:即预测结果成功/所有结果总数:=(TP+TN)/(TP+TN+FP+FN)。
精确率Prevision:即预测结果成功/积极预测总数=TP/(TP+FP)。
召回率recall/灵敏度Sensitivity:即positive预测结果成功/结果真正为正确的总数=TP/(TP+FN)。
特异度Specificity:negative预测成功/结果真正为错误的总数=TN/(TN+FP)。
F1 Score:精准率(prevision)和召回率(recall)的调和平均数:
F1 score=(2 * prevision * recall)/(previson + recall)
F1 score是衡量二分模型精确度的指标,兼顾了精确率和召回率。
这里用sklearn自带的鸢尾花的数据集演示一下混淆矩阵的用法
from sklearn import datasets#导入数据集
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix#导入混淆矩阵
from sklearn.metrics import precision_score,recall_score,f1_score#导入混淆矩阵的评价指标
#metrics衡量
df=datasets.load_iris()
X=df.data
y=df.target
#画分布散点图
plt.scatter(X[y==0,0],X[y==0,1],color='r')
plt.scatter(X[y==1,0],X[y==1,1],color='g')
#plt.scatter(X[y==2,0],X[y==2,1],color='b')
plt.show()
#由于鸢尾花有三种类型,但这里只做二分类,所有取y<2的数据
X=X[y<2]
y=y[y<2]
#划分数据
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
#建立逻辑分类模型
logic=LogisticRegression()
logic.fit(X_train,y_train)#数据填充
y_predict=logic.predict(X_test)#结果预测
logic_score=logic.score(X_test,y_test)#预测结果得分
print('预测分类值:',y_predict)
print('混淆矩阵:',confusion_matrix(y_test,y_predict))
print('精准率:',precision_score(y_test,y_predict))
print('召回率:',recall_score(y_test,y_predict))
print('f1_score:',f1_score(y_test,y_predict))
#输出结果如下:
预测分类值: [0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 0 0 0]
混淆矩阵:
[[ 9 0]
[ 0 11]]
精准率: 1.0
召回率: 1.0
f1_score: 1.0
由于是标准数据且分类十分明显,所以精准率和召回率都是100%,说明预测的结果非常准确,f1_score得分为1.0即100分,说明这个分类模型准确无误。
散点图如下:
不同颜色的散点代表了不同种类的鸢尾花,通过散点的落点位置可以判断是属于哪一种鸢尾花。
ROC曲线与AUC面积
ROC曲线是根据混淆矩阵的评价标准组成的,横轴为FPR(false positive rate)=FP/(FP+TN),纵轴为TPR(True positive rate)=TP/(TP+FN)
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.metrics import precision_score,recall_score,f1_score
#metrics衡量
df=datasets.load_iris()
X=df.data
y=df.target
plt.scatter(X[y==0,0],X[y==0,1],color='r')
plt.scatter(X[y==1,0],X[y==1,1],color='g')
#plt.scatter(X[y==2,0],X[y==2,1],color='b')
plt.show()
X=X[y<2]
y=y[y<2]
#划分数据
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
#建立逻辑分类模型
logic=LogisticRegression()
logic.fit(X_train,y_train)
y_predict=logic.predict(X_test)
logic_score=logic.score(X_test,y_test)
print('预测分类值:',y_predict)
print('混淆矩阵:',confusion_matrix(y_test,y_predict))
print('精准率:',precision_score(y_test,y_predict))
print('召回率:',recall_score(y_test,y_predict))
print('f1_score:',f1_score(y_test,y_predict))
from sklearn.metrics import roc_curve,roc_auc_score
decision_score=logic.decision_function(X_test)#点到超平面的距离,即点到决策边界的距离
print(decision_score)
fprs,tprs,thesholds=roc_curve(y_test,decision_score)
print(thesholds)#临界值
plt.plot(fprs,tprs)
plt.xlabel('False POsitive Rate')
plt.ylabel('True Positive Rate')
plt.show()
上面是鸢尾花的ROC曲线,这条曲线覆盖下的面积即AUC面积,可以用微积分得出,AUC面积越大,分类的精准度越高。