机器学习--评估指标

机器学习算法的评估指标:

在这里插入图片描述

分类

其实多分类的评价指标的计算方式与二分类完全一样,只不过我们计算的是针对于每一类来说的召回率、精确度、准确率和 F1分数。

混淆矩阵

混淆矩阵Predicted as PositivePredicted as Negative
Labeled as PositiveTrue Positive(TP)False Negative(FN)
Labeled as NegativeFalse Positive(FP)True Negative(TN)
  • 真正例(True Positive, TP):真实类别为正例, 预测类别为正例

  • 假负例(False Negative, FN): 真实类别为正例, 预测类别为负例

  • 假正例(False Positive, FP): 真实类别为负例, 预测类别为正例

  • 真负例(True Negative, TN): 真实类别为负例, 预测类别为负例

  • 真正率(True Positive Rate, TPR): 被预测为正的正样本数 / 正样本实际数

T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP

  • 假负率(False Negative Rate, FNR): 被预测为负的正样本数/正样本实际数

F N R = F N T P + F N FNR=\frac{FN}{TP+FN} FNR=TP+FNFN

  • 假正率(False Positive Rate, FPR): 被预测为正的负样本数/负样本实际数,

F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP

  • 真负率(True Negative Rate, TNR): 被预测为负的负样本数/负样本实际数,

T N R = T N F P + T N TNR=\frac{TN}{FP+TN} TNR=FP+TNTN

  • 准确率(Accuracy)

A C C = T P + T N T P + F N + F P + T N ACC=\frac{TP+TN}{TP+FN+FP+TN} ACC=TP+FN+FP+TNTP+TN

  • 精准率

P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP

  • 召回率

R = T P T P + F N R=\frac{TP}{TP+FN} R=TP+FNTP

  • F1-Score

2 F 1 = 1 P + 1 R \frac{2}{F_1}=\frac{1}{P}+\frac{1}{R} F12=P1+R1

  • ROC
    ROC曲线的横轴为“假正例率”,纵轴为“真正例率”. 以FPR为横坐标,TPR为纵坐标,那么ROC曲线就是改变各种阈值后得到的所有坐标点 (FPR,TPR) 的连线,画出来如下。红线是随机乱猜情况下的ROC,曲线越靠左上角,分类器越佳。
  • AUC(Area Under Curve)
    AUC就是ROC曲线下的面积. 真实情况下,由于数据是一个一个的,阈值被离散化,呈现的曲线便是锯齿状的,当然数据越多,阈值分的越细,”曲线”越光滑。
    在这里插入图片描述
    用AUC判断分类器(预测模型)优劣的标准:

AUC = 1 是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

下面我们通过一个简单例子来看看精确率和召回率。假设一共有10篇文章,里面4篇是你要找的。根据你的算法模型,你找到了5篇,但实际上在这5篇之中,只有3篇是你真正要找的。

那么算法的精确率是3/5=60%,也就是你找的这5篇,有3篇是真正对的。算法的召回率是3/4=75%,也就是需要找的4篇文章,你找到了其中三篇。以精确率还是以召回率作为评价指标,需要根据具体问题而定。

示例:
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.metrics import f1_score
y_true = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,5,5,6,6,6,0,0,0,0] #真实值
y_pred = [1, 1, 1, 3, 3, 2, 2, 3, 3, 3, 4, 3, 4, 3,5,1,3,6,6,1,1,0,6] #预测值

#计算准确率
print("accuracy:", accuracy_score(y_true, y_pred))
#计算精确率
#计算macro_precision
print("macro_precision", precision_score(y_true, y_pred, average='macro'))
#计算micro_precision
print("micro_precision", precision_score(y_true, y_pred, average='micro'))
#计算召回率
#计算macro_recall
print("macro_recall", recall_score(y_true, y_pred, average='macro'))
#计算micro_recall
print("micro_recall", recall_score(y_true, y_pred, average='micro'))
#计算F1
#计算macro_f1
print("macro_f1", f1_score(y_true, y_pred, average='macro'))
#计算micro_f1
print("micro_f1", f1_score(y_true, y_pred, average='micro'))
accuracy: 0.5217391304347826
macro_precision 0.7023809523809524
micro_precision 0.5217391304347826
macro_recall 0.5261904761904762
micro_recall 0.5217391304347826
macro_f1 0.5441558441558441
micro_f1 0.5217391304347826

回归

  1. MSE(Mean Squared Error)

M S E ( y , f ( x ) ) = 1 N ∑ i = 1 N ( y − f ( x ) ) 2 MSE(y,f(x))=\frac{1}{N}\sum_{i=1}^{N}(y-f(x))^2 MSE(y,f(x))=N1i=1N(yf(x))2

  1. MAE(Mean Absolute Error)

M S E ( y , f ( x ) ) = 1 N ∑ i = 1 N ∣ y − f ( x ) ∣ MSE(y,f(x))=\frac{1}{N}\sum_{i=1}^{N}|y-f(x)| MSE(y,f(x))=N1i=1Nyf(x)

  1. RMSE(Root Mean Squard Error)

R M S E ( y , f ( x ) ) = 1 1 + M S E ( y , f ( x ) ) RMSE(y,f(x))=\frac{1}{1+MSE(y,f(x))} RMSE(y,f(x))=1+MSE(y,f(x))1

  1. Top-k准确率

T o p k ( y , p r e y ) = { 1 , y ∈ p r e y 0 , y ∉ p r e y Top_k(y,pre_y)=\begin{cases} 1, {y \in pre_y} \\ 0, {y \notin pre_y} \end{cases} Topk(y,prey)={1,yprey0,y/prey

聚类

轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。最早由 Peter J. Rousseeuw 在 1986 提出。它结合内聚度和分离度两种因素。可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

轮廓系数的计算步骤如下:

1.计算样本i到同一类中其他样本的平均距离ai。ai越小,说明样本i与同类中其他样本的距离越近,即越相似。我们将ai称为样本i的类别内不相似度。
2.计算样本i到其他类别的所有样本的平均距离bi,称为样本i与其他类之间的不相似度。bi越大,说明样本i与其他类之间距离越远,即越不相似。
3.根据样本i的簇内不相似度ai和簇间不相似度bi ,定义样本i的轮廓系数为:

在这里插入图片描述
判断:
si的值介于[-1,1]之间,
1.越接近于1说明bi越大ai越小,类别内部越相似,类别之间越不相似;
2.越接近于0说明类别内部和类别之间的距离差不多,分界线很不明显;
3.越接近于-1说明类别之间越相似类别内部反而不相似。

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np


X, y = make_blobs(n_samples=500,
                  n_features=2,
                  centers=4,
                  cluster_std=1,
                  center_box=(-10.0, 10.0),
                  shuffle=True,
                  random_state=1)
score = []
for n in range(2,20):
    kmeans = KMeans(n_clusters = n,random_state = 0)
    kmeans.fit(X)
    pred_y = kmeans.predict(X)  # 预测点在哪个聚类中
    score.append([n,silhouette_score(X, pred_y)])
pd.DataFrame(score).set_index(0).plot(legend = False)
plt.xlabel("聚类个数")
plt.ylabel("轮廓系数")

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值