sklearn 笔记整理:sklearn.metrics

理论部分:RMSE、MAE等误差指标整理_UQI-LIUWJ的博客-CSDN博客

sklearn.metrics.mean_squared_error

sklearn.metrics.mean_squared_error(
    y_true, 
    y_pred, 
    *, 
    sample_weight=None,
    multioutput='uniform_average', 
    squared=True)

1.1 主要参数

y_true正确值
y_pred预测值
squared如果是True,那么就是MSE;否则是RMSE

1.2 使用举例

from sklearn.metrics import mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)
#0.375

sklearn.metrics.mean_absolute_error

sklearn.metrics.mean_absolute_error(
    y_true, 
    y_pred, 
    *, 
    sample_weight=None, 
    multioutput='uniform_average')

2.1 主要参数

y_true正确值
y_pred预测值

2.2 使用举例 

from sklearn.metrics import mean_absolute_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_error(y_true, y_pred)
#0.5

sklearn.metrics.mean_absolute_percentage_error

sklearn.metrics.mean_absolute_percentage_error(
    y_true, 
    y_pred, 
    sample_weight=None, 
    multioutput='uniform_average')

3.1 主要参数

y_true正确值
y_pred预测值

3.2 使用举例 

from sklearn.metrics import mean_absolute_percentage_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_absolute_percentage_error(y_true, y_pred)
#0.3273809523809524

4 sklearn.metrics.accuracy_score

sklearn.metrics.accuracy_score(
    y_true, 
    y_pred, 
    *, 
    normalize=True, 
    sample_weight=None)

在多标签分类中,预测的标签集必须与 y_true 中相应的标签集完全匹配,才算正确分类的样本。 

4.1 主要参数

y_true正确的label
y_pred预测的label
normalize
  • 如果为 False,则返回正确分类的样本数。
  • 否则,返回正确分类样本的分数。

4.2 返回内容

  • 如果 normalize == True,返回正确分类样本的分数(float),否则返回正确分类样本的数量(int)
  • 最好的性能是 1( normalize == True)或者样本数(normalize == False)。

4.3 举例

from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)
#0.5


accuracy_score(y_true, y_pred, normalize=False)
#2


accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))
#0.5
#第一行是[0,1] VS [1,1],所以不算match上的

4.1  sklearn.metrics.balanced_accuracy_score

sklearn.metrics.balanced_accuracy_score(
    y_true, 
    y_pred, 
    *, 
    sample_weight=None, 
    adjusted=False)
  • 计算平衡精度。
  • 处理不平衡数据集分类问题的平衡精度。
  • 被定义为在每个类别上获得的平均召回率。

当 adjusted=False 时,最佳值为 1,最差值为 0。

4.2 主要参数

y_true正确的label
y_pred预测的label
adjusted

为True:结果根据可能性调整

随机的表现将会打分为0,好的表现打分为1

4.3 举例

from sklearn.metrics import balanced_accuracy_score
y_true = [0, 1, 0, 0, 1, 0]
y_pred = [0, 1, 0, 0, 0, 1]
balanced_accuracy_score(y_true, y_pred)
#0.625
#类别0的召回率:需要召回第0,2,3,5号元素,实际上召回0,2,3号元素——召回率0.75
#类别1的召回率:需要召回第2,4号元素,实际上召回第2号元素——召回率0.5
#——>平均召回率0.625


balanced_accuracy_score(y_true, y_pred,adjusted=True)
#0.25
'''
这个值怎么出来的呢?
我们假定有n个类,没有adjust的score为S,adjust的score为AS
AS=(S-1/n)/(1-1/n)
  =(0.625-0.5)/(1-0.5)=0.25
'''

 5 sklearn.metrics.top_k_accuracy_score

sklearn.metrics.top_k_accuracy_score(
    y_true, 
    y_score, 
    *, 
    k=2, 
    normalize=True, 
    sample_weight=None, 
    labels=None)

5.1 主要参数

y_true正确的label
y_pred

目标分数。


这些可以是概率估计或非阈值决策值

 二元分类分数具有形状 (n_samples,),而多元分类分数具有形状 (n_samples, n_classes)。

k如果前k大score中有正确的label,那么就算正确分类
normalize
  • 如果为 False,则返回正确分类的样本数。
  • 否则,返回正确分类样本的分数。
sample_weights采样权重

 5.2 举例

import numpy as np
from sklearn.metrics import top_k_accuracy_score
y_true = np.array([0, 1, 2, 2])
y_score = np.array([[0.5, 0.2, 0.2],  # 0 is in top 2
                     [0.3, 0.4, 0.2],  # 1 is in top 2
                     [0.2, 0.4, 0.3],  # 2 is in top 2
                     [0.7, 0.2, 0.1]]) # 2 isn't in top 2
top_k_accuracy_score(y_true, y_score, k=2)
#0.75

top_k_accuracy_score(y_true, y_score, k=2, normalize=False)
#3

sklearn.metrics.f1_score

  • 计算 F1 分数
  • F1 分数可以解释为精度和召回率的调和平均值,其中 F1 分数达到其最佳值 1 和最差值 0。
  • 在多类和多标签的情况下,这是每个类的 F1 分数的平均值,权重取决于average参数。

 

sklearn.metrics.f1_score(
    y_true, 
    y_pred, 
    *, 
    labels=None, 
    pos_label=1, 
    average='binary', 
    sample_weight=None, 
    zero_division='warn')

6.1 主要参数

y_true正确的label
y_pred预测的label
labels当 average != 'binary' 时要包含的标签集
pos_label如果average是”binary“,同时数据二分类时,使用
averagebinary当分类二分类时适用,只考虑pos_label中涉及的类
micro通过计算真阳性、假阴性和误报的总数来全局计算F1指标
macro计算每个标签的F1指标,并找到它们的未加权平均值。 这没有考虑标签不平衡
weighted

计算每个标签的指标,并找到它们按支持度(每个标签的真实实例数)加权的平均值。

这改变了“宏观”以解释标签不平衡; 它可能导致 F 分数不介于精确率和召回率之间。

samples计算每个实例的F1指标,并找到它们的平均值
None返回每个类的F1指标
sample_weight
zero_divisioin

出现除零情况时的返回值,当所有预测和标签均为负数时会出现除零的情况。

如果设置为“warn”,将返回  0,但也会发出警告。

6.2 举例

 

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro')
# 0.26666666666666666
'''
类别0:召回 1 准确 2/3
类别1:召回 0 准确 0
类别2:召回 0 准确 0

#(2*(2/3*1)/(2/3+1)) /3=0.26666666666666666
'''


f1_score(y_true, y_pred, average='micro')
#0.3333333333333333
'''
总 准确率 2/6 召回率 2/6
(2*(2/6*2/6)/(2/6+2/6))=#0.3333333333333333
'''

f1_score(y_true, y_pred, average='weighted')
# 0.26666666666666666
'''
每个类的ground-truth都是两个,所以权重一样
结果和macro一样
'''

f1_score(y_true, y_pred, average=None)
#array([0.8, 0. , 0. ])

sklearn.metrics.mutual_info_score

  • 两个cluster的互信息
    • M I(U, V)=\sum_{i=1}^{|U|} \sum_{j=1}^{|V|} \frac{\left|U_i \cap V_j\right|}{N} \log \frac{N\left|U_i \cap V_j\right|}{\left|U_i\right|\left|V_j\right|}
    • Ui,Vj是cluster
  • 互信息是对称的,MI(U,V)=MI(V,U)
sklearn.metrics.mutual_info_score(
    labels_true, 
    labels_pred, 
    *, 
    contingency=None)
y_trueU cluter
y_predV cluster

7.1 举例 

import numpy as np
from scipy.stats import entropy
from sklearn.metrics import mutual_info_score


A = np.array([0,0,0,1,1])  
B = np.array([0,1,0,1,0])  
mutual_info_score(A, B)
#0.013844293808390418

7.1.1 推导

from collections import Counter

# 计算A和B的边缘分布的概率质量函数
A_pmf = Counter(A.flatten())
B_pmf = Counter(B.flatten())
A_pmf,B_pmf
#(Counter({0: 3, 1: 2}), Counter({0: 3, 1: 2}))

## 计算A和B的联合的概率质量函数
joint_pmf = Counter(zip(A.flatten(), B.flatten()))
joint_pmf
#Counter({(0, 0): 2, (0, 1): 1, (1, 1): 1, (1, 0): 1})

#计算互信息
mi = 0.0
total_samples = 5
for key, count in joint_pmf.items():
    p_joint = count / total_samples
    p_a = A_pmf[key[0]] / total_samples
    p_b = B_pmf[key[1]] / total_samples
    mi += p_joint * np.log(p_joint / (p_a * p_b))
mi
#0.013844293808390619

'''
2/5 *np.log((2/5)/(3/5*3/5))+
1/5 *np.log((1/5)/(3/5*2/5))+
1/5 *np.log((1/5)/(3/5*2/5))+
1/5 *np.log((1/5)/(2/5*2/5))
=0.01384429380839066
'''

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值