理论部分:RMSE、MAE等误差指标整理_UQI-LIUWJ的博客-CSDN博客
1 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
2 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
3 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 |
|
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 |
|
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
6 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“,同时数据二分类时,使用 | |
average | binary | 当分类二分类时适用,只考虑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. ])
7 sklearn.metrics.mutual_info_score
- 两个cluster的互信息
- Ui,Vj是cluster
- 互信息是对称的,MI(U,V)=MI(V,U)
sklearn.metrics.mutual_info_score(
labels_true,
labels_pred,
*,
contingency=None)
y_true | U cluter | |
y_pred | V 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
'''