TP:预测结果为positive,实际也为positive
TN:预测为negative,实际也为negative
FP:预测结果为positive,实际为negative
FN:预测结果为negative,实际positive
分类正确的数量除以总数。最简单最直观的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)
所有预测结果为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)
宏平均精确度(Macro averaged precision)、微平均精确度(Micro averaged precision)和加权精确度(Weighted precision)。
宏平均精确度:对所有类别分别计算精确度,然后对它们求平均。
微平均精确度:计算每个类别的真阳性和假阳性,然后使用它们来计算总体精确度。
加权精确度:与宏平均精确度相同,但在这种情况下,它是根据每个类别中的项目数量进行加权平均的。
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])
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)
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)## 标题
所有真实类别为positive中被正确预测到的比例
R e c a l l = T P / ( T P + F N ) Recall = TP/(TP+FN) Recall=TP/(TP+FN)
当遇到非均衡数据集时,采用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)
对每个类别分别求F1,最后加权平均。
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),会是最佳阈值点。
AUC则是ROC曲线下方的面积,它衡量了分类模型对正负样本区分能力的一个指标。AUC的取值范围在0.5和1之间,值越大表示模型越能够区分正负样本
ROC和AUC经常用于非均衡二分类数据。
关于AUC的具体解释:
假设AUC为0.8,从数据集中随机选择一个正样本和一个负样本,那么正样本将以0.8的概率排名高于负样本。"排名高于"指的是分类模型为每个样本分配一个概率得分,表示该样本属于正类的概率。如果一个样本的得分高于另一个样本,那么可以说这个样本在模型中的排名高于另一个样本。在这个例子中,如果有正样本以0.8的概率排名高于负样本,这意味着正样本在模型中被分配了更高的概率得分,即模型认为它更可能属于正类。
对数损失衡量了模型预测概率与真实标签之间的差异。对于数据集中的多个样本,所有样本的对数损失就是所有单个对数损失的平均值。
需要注意的是,对数损失对于错误预测或预测偏差较大的情况会给予较高的惩罚。也就是说,如果模型对某个样本的预测非常确定,但预测结果却非常错误,那么对数损失会给予较大的惩罚。
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。
将真实标签转换为二进制格式,每一列代表一个标签。然后,我们对每一列分别计算对数损失。
二次加权kappa(Quadratic Weighted Kappa,QWK)是一种高级的度量方法,也被称为Cohen’s kappa。它用于衡量两个“评分”之间的“一致性”。这些评分可以是0到N之间的任意实数,预测值也在同一范围内。一致性可以定义为这些评分彼此接近的程度。因此,它适用于具有N个不同类别/类的分类问题。如果一致性高,则得分接近1.0。如果一致性低,则得分接近0。
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时,表示分类效果与随机分类相同。
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)
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)
R M S E = S Q R T ( M S E ) RMSE = SQRT(MSE) RMSE=SQRT(MSE)
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)
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)
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)
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