文章目录
0.关于TP、TN、FP、FN
TP:预测结果为positive,实际也为positive
TN:预测为negative,实际也为negative
FP:预测结果为positive,实际为negative
FN:预测结果为negative,实际positive
1.分类问题
1.1Accuracy
分类正确的数量除以总数。最简单最直观的metric,可用于均衡数据集的二分类问题。但是对于非均衡比例极端的二分类数据集,则毫无意义。
另一种计算方式:
A
c
c
u
r
a
c
y
S
c
o
r
e
=
(
T
P
+
T
N
)
/
(
T
P
+
T
N
+
F
P
+
F
N
)
Accuracy Score = (TP+TN)/(TP+TN+FP+FN)
AccuracyScore=(TP+TN)/(TP+TN+FP+FN)
1.2Precision(P)
1.2.1二分类中的precision
所有预测结果为positive中真实值也是positive所占的比例
P r e c i s i o n = T P / ( T P + F P ) Precision = TP/(TP+FP) Precision=TP/(TP+FP)
1.2.2Precision at k (P@k):多分类中的precision
宏平均精确度(Macro averaged precision)、微平均精确度(Micro averaged precision)和加权精确度(Weighted precision)。
-
宏平均精确度:对所有类别分别计算精确度,然后对它们求平均。
-
微平均精确度:计算每个类别的真阳性和假阳性,然后使用它们来计算总体精确度。
-
加权精确度:与宏平均精确度相同,但在这种情况下,它是根据每个类别中的项目数量进行加权平均的。
1.2.3Multi-Label Classfication
- Precision at k
def pk(y_true,y_pred,k):
if k == 0:
return 0
y_pred = y_pred[:k]
pred_set = set(y_pred)
true_set = set(y_true)
common_values = pred_set.intersection(true_set)#求交集
return len(common_values)/len(y_pred[:k])
- Average Precision at k
def apk(y_true,y_pred,k):
pk_values = []
for i in range(1,k+1):
pk_values.append(pk(y_true,y_pred,i))
if len(pk_values) == 0:
return 0
return sum(pk_values)/len(pk_values)
- Mean average precision at k
def mapk(y_true,y_pred,k):
apk_values =[]
for i in range(len(y_true)):
apk_values.append(apk(y_true[i],y_pred[i],k=k))
return sum(apk_values)/len(apk_values)## 标题
1.3Recall ®
所有真实类别为positive中被正确预测到的比例
R e c a l l = T P / ( T P + F N ) Recall = TP/(TP+FN) Recall=TP/(TP+FN)
1.4F1 score (F1)
1.4.1二分类中的F1
当遇到非均衡数据集时,采用acc作为评价指标显然不是一种好的选择,此时就可以采用f1分数。
将精度(precision)和召回率(recall)联系起来,定义为精度和召回率的加权平均值:
F 1 = 2 P R / ( P + R ) F1 = 2PR/(P+R) F1=2PR/(P+R)
或者
F 1 = 2 T P / ( 2 T P + F P + F N ) F1 = 2TP/(2TP+FP+FN) F1=2TP/(2TP+FP+FN)
1.4.2多分类中的F1:weighted_f1:
对每个类别分别求F1,最后加权平均。
1.5Area under the ROC (Receiver Operating Characteristic) curve or simply AUC (AUC)
1.5.1ROC
ROC曲线是一条概率曲线,它展示了分类模型在不同阈值下的真阳性率(TPR)和假阳性率(FPR)之间的关系。其中:
T P R = T P / ( T P + F N ) TPR = TP/(TP+FN) TPR=TP/(TP+FN)
F P R = F P / ( T N + F P ) FPR = FP/(TN+FP) FPR=FP/(TN+FP)
提高阈值会降低假阳性率(FPR),但同时也会降低真阳性率(TPR),降低阈值则相反。因此ROC曲线可以用来根据实际情况选取最佳阈值。通常来说,在ROC曲线的左上方的点(y轴是TPR),会是最佳阈值点。
1.5.2AUC
AUC则是ROC曲线下方的面积,它衡量了分类模型对正负样本区分能力的一个指标。AUC的取值范围在0.5和1之间,值越大表示模型越能够区分正负样本
ROC和AUC经常用于非均衡二分类数据。
关于AUC的具体解释:
假设AUC为0.8,从数据集中随机选择一个正样本和一个负样本,那么正样本将以0.8的概率排名高于负样本。"排名高于"指的是分类模型为每个样本分配一个概率得分,表示该样本属于正类的概率。如果一个样本的得分高于另一个样本,那么可以说这个样本在模型中的排名高于另一个样本。在这个例子中,如果有正样本以0.8的概率排名高于负样本,这意味着正样本在模型中被分配了更高的概率得分,即模型认为它更可能属于正类。
1.6Log loss
1.6.1二分类或多分类
对数损失衡量了模型预测概率与真实标签之间的差异。对于数据集中的多个样本,所有样本的对数损失就是所有单个对数损失的平均值。
需要注意的是,对数损失对于错误预测或预测偏差较大的情况会给予较高的惩罚。也就是说,如果模型对某个样本的预测非常确定,但预测结果却非常错误,那么对数损失会给予较大的惩罚。
L o g L o s s = − 1.0 ∗ ( t a r g e t ∗ l o g ( p r e d i c t i o n ) + ( 1 − t a r g e t ) ∗ l o g ( 1 − p r e d i c t i o n ) ) Log Loss = -1.0*(target*log(prediction)+(1-target)*log(1-prediction)) LogLoss=−1.0∗(target∗log(prediction)+(1−target)∗log(1−prediction))
其中target是0 or 1,prediction是计算出来的probability。
1.6.2Multi-Label Classfication
将真实标签转换为二进制格式,每一列代表一个标签。然后,我们对每一列分别计算对数损失。
1.7Quadratic Weighted Kappa(QWK)
二次加权kappa(Quadratic Weighted Kappa,QWK)是一种高级的度量方法,也被称为Cohen’s kappa。它用于衡量两个“评分”之间的“一致性”。这些评分可以是0到N之间的任意实数,预测值也在同一范围内。一致性可以定义为这些评分彼此接近的程度。因此,它适用于具有N个不同类别/类的分类问题。如果一致性高,则得分接近1.0。如果一致性低,则得分接近0。
1.8Matthew’s Correlation Coefficient (MCC)
M C C = T P ∗ T N − F P ∗ F N [ ( T P + F P ) ∗ ( F N + T N ) ∗ ( F P + T N ) ∗ ( T P + F N ) ] ( 0.5 ) MCC =\frac{TP*TN-FP*FN}{[(TP+FP)*(FN+TN)*(FP+TN)*(TP+FN)]^(0.5)} MCC=[(TP+FP)∗(FN+TN)∗(FP+TN)∗(TP+FN)](0.5)TP∗TN−FP∗FN
MCC的取值范围为-1到1。当MCC为1时,表示分类完全正确;当MCC为-1时,表示分类完全错误;当MCC为0时,表示分类效果与随机分类相同。
2.回归问题
2.1Mean absolute error MAE
- Error = True Value - Predicted Value
- Absolute Error = Abs(True Value - Predicted Value)
- MAE:Mean Absolute Error
def MAE(y_true,y_pred):
error = 0
for yt,yp in zip(y_true,y_pred):
error += np.abs(yt-yp)
return error/len(y_true)
2.2Mean squared error (MSE)
S q u a r e d E r r o r = ( T r u e V a l u e − P r e d i c t e d V a l u e ) 2 Squared Error = (True Value - Predicted Value)^2 SquaredError=(TrueValue−PredictedValue)2
def MSE(y_true,y_pred):
error = 0
for yt,yp in zip(y_true,y_pred):
error += (yt-yp)**2
return error/len(y_true)
2.3Root mean squared error (RMSE)
R M S E = S Q R T ( M S E ) RMSE = SQRT(MSE) RMSE=SQRT(MSE)
2.4Mean squared logarithmic error (MSLE)
def MSLE(y_true,y_pred):
error = 0
for yt,yp in zip(y_true,y_pred):
error += (np.log(1+yt)-np.log(1+yp))**2
return error/len(y_true)
2.5Root mean squared logarithmic error (RMSLE)
2.6Mean percentage error (MPE)
P e r c e n t a g e E r r o r = ( ( T r u e V a l u e − P r e d i c t e d V a l u e ) / T r u e V a l u e ) ∗ 100 Percentage Error = ((True Value - Predicted Value)/True Value)*100 PercentageError=((TrueValue−PredictedValue)/TrueValue)∗100
def MPE(y_true,y_pred):
error = 0
for yt,yp in zip(y_true,y_pred):
error += (yt-yp)/yt
return error/len(y_true)
2.7Mean absolute percentage error (MAPE)
def MAPE(y_true,y_pred):
error = 0
for yt,yp in zip(y_true,y_pred):
error += np.abs(yt-yp)/yt
return error/len(y_true)
2.8R^2
R 2 = 1 − ∑ i = 1 N ( y t i − y p i ) 2 ∑ i = 1 N ( y t i − y t m e a n ) R^2 = 1 - \frac{\sum_{i=1}^{N}(y_{t_{i}}-y_{p_{i}})^2}{\sum_{i=1}^{N}(y_{t_{i}}-y_{t_{mean}})} R2=1−∑i=1N(yti−ytmean)∑i=1N(yti−ypi)2
def r2(y_true,y_pred):
mean_true_value = np.mean(y_true)
numerator = 0
denominator = 0
for yt,yp in zip(y_true,y_pred):
numerator += (yt-yp)**2
denominator += (yt-mean_true_value)**2
ratio = numerator/denominator
return 1-ratio