在数据本身严重有偏的情况下,准确率很容易达到一个很高的数值,因此需要寻找另外的性能评价方法。
混淆矩阵
混淆矩阵:将数据按待分的类别分组后,统计各组中模型分类或预测结果的矩阵
-
总例数: T o t a l = T P + F P + F N + T N \small{Total = TP + FP + FN + TN} Total=TP+FP+FN+TN
-
准确率: A C C = T P + T N T o t a l \small{ACC} = \frac{TP+TN}{Total} ACC=TotalTP+TN
-
TPR or Sen = T P T P + F N \frac{TP}{TP +FN} TP+FNTP (真阳性率、召回率、敏感性、检出率)
取值 [ 0,1 ] 越接近 1 性能越好 -
TNR or Spe = T N F P + T N \frac{TN}{FP +TN} FP+TNTN (真阴性率、特异性、选择性)
取值 [ 0,1 ] 越接近 1 性能越好 -
PPV or precision = T P T P + F P \frac{TP}{TP +FP} TP+FPTP (精度、阳性预测值)
取值 [ 0,1 ] 越接近 1 性能越好 -
NPV = T N T N + F N \frac{TN}{TN +FN} TN+FNTN (阴性预测值)
mport pandas as pd
import numpy as np
from sklearn import datasets
from scipy import stats
import matplotlib.pyplot as plt
iris = datasets.load_iris() #可直接获取鸢尾花数据集
plt.figure(figsize=(12,15))
for n in range(4):
print(n)
for m in range(3):
x=(iris.data[m*50:m*50+50,n]-iris.data[m*50:m*50+50,n].mean()) / iris.data[m*50:m*50+50,n].std()
plt.subplot(4, 3, n*3 + m + 1)
stats.probplot(x, dist='norm', plot=plt)
plt.text(-2,2,iris.feature_names[n])
if n == 0:
plt.title(iris.target_names[m])
else:
plt.title('')
plt.xlim([-2.5,2.5])
plt.ylim([-2.5,2.5])
plt.plot([-2.5,2.5],[-2.5,2.5],c='g')
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target,test_size=0.2,random_state=0)
from sklearn.naive_bayes import GaussianNB
clf=GaussianNB()
clf.fit(X_train, Y_train)
y_pred=clf.predict(X_test)
Y = pd.DataFrame(np.transpose([Y_test, y_pred]), columns={'true_type','predict_type'})
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_pred, Y_test))
from sklearn.metrics import classification_report
print(classification_report(y_pred, Y_test))
线性二分类(ROC曲线进行评价)
- 可以就参数的区分性能做专门评价
- ROC曲线(接收者操作特征曲线)
- 绘制方法:对同样的测试集,改变线性划分的阈值,随着阈值的改变,分类的敏感性和特异性都会改变,以敏感性为纵坐标,1-特异性为横坐标,将选取不同阈值的结果在图中以散点画出,散点连成的曲线就是ROC曲线。
- ROC曲线越远离45度对角线,分类性能越好。
- 量化指标:采用曲线下面积 AUC,AUC
∈
\in
∈ [ 0,1 ]
越靠近 1,参数线性区分性能越好;靠近 0.5 时,接近随机划分;小于 0.5 时,分类倒置。