机器学习相关指标计算

机器学习相关的科学计算指标

其实本人也不精通

上代码:

#!/usr/bin/env python

# coding=utf-8

import numpyas np

from sklearn.metricsimport *

import matplotlib.pyplotas plt


def mathematical_calculation(data_list1,data_list2=[]):

    """

        1.误差errors:x1-x2

        2.误差均值mean errors:所以误差值和的均值        

        3.平均差average deviation:每个数据与该组数据平均数之差绝对值的算数平均数        

        4.方差Variance:每个数据与该组数据平均数之差乘方后的均值,用来度量随机变量和其数学期望(即均值)之间的偏离程度       

         5.标准差Standard Deviation:方差平方根

    """

    if data_list2 == []:

        mean_errors= np.mean(data_list1)# 误差均值 是一个数值

        variance= np.var(data_list1)# 方差  是一个数值

        standard_deviation= np.std(data_list1,ddof=1)# 标准差 是一个数值

        average_deviation= (data_list1 - mean_errors).sum()/ data_list1.size# 平均差 是一个数值

        return mean_errors, average_deviation, variance, standard_deviation

    if len(data_list1)== len(data_list2):

        errors= np.array(data_list1)- np.array(data_list2)# 误差 是一个数组

        mean_errors= np.mean(errors)# 误差均值 是一个数值

        variance= np.var(errors)# 方差  是一个数值

        standard_deviation= np.std(errors,ddof=1)# 标准差 是一个数值

        average_deviation= (errors- mean_errors).sum()/ errors.size# 平均差 是一个数值

        return mean_errors, average_deviation, variance, standard_deviation

"""

    | 真 实 |  预  测  结  果|

    | 情 况 |  正  例  |  反 例|

———————————————————————————

    |正  例 |TP(真正例)|FN(假反例)|

    |反  例 |FP(假正例)|TN(真反例)|

"""

def pre_re_ac(y_true,y_pred):  # y_true是真实数据 y_pred是预测数据

    """

    1.precision:查准率 & recall:查全率    

     precision = TP/(TP+FP) 查准率,各类分开计算,再平均   

     recall = TP/(TP+FN) 查全率,各类分开计算,再平均    

     accuracy = (TP + TN) /(TP+TN+FP+FN) 准确率,综合各类来计算不平均

    """

    Precision= precision_score(y_true,y_pred,labels=None, pos_label=1, average='binary', sample_weight=None)

    Recall= recall_score(y_true,y_pred,labels=None,pos_label=1, average='binary',sample_weight=None)

    Accuracy= accuracy_score(y_true,y_pred,normalize=True,sample_weight=None)

    return Precision, Recall, Accuracy


def F1(y_true,y_pred):  # y_true是真实数据 y_pred是预测数据

    """

        4.F1(F1-score) *需要计算结果 - 值       

         F1-score = 2*precision*recall/(precision+recall) # 每个类别的F1

        f_1 = 所有F1和/n

    """

    f_1= f1_score(y_true,y_pred,average='binary')

    # print 2 * Precision * Recall / (Precision + Recall)  也可以根据pre和rec值求F1

    return f_1


def mean_AP(y_true,y_pred):

    """ AP:单个类别的precision的均值        

        mAP:m个类别的AP的平均值(目前只要求单个类计算)

    """


def PR_curve(y_true,y_scores):  # y_true是真实值的array;y_score是阀值array()

    """

        3.PR曲线 *需要绘图,需要计算结果        

        1. F1是基于查准率与查全率的调和平均        

        2. Fβ​是基于查准率与查全率的加权平均1/F1 = 1/2*(1/precision + 1/recall)  # F1 = F1(y_true, y_pred)

        1/Fβ = 1/(1+β**2)*(1/precision + β**2/recall)

    """

    pre_arr, rec_arr, thresholds= precision_recall_curve(y_true,y_scores,pos_label=None, sample_weight=None)

    return pre_arr, rec_arr, thresholds


def roc_Auc(y_true,y_scores):

    """

        5.ROC(Receiver Operating Characteristic) *需要画图 需要结果

        每次计算出假正例率(FPR)与真正例率(TPR),分别以他们作为横纵坐标进行作图       

        TPR = TP/(TP+FN) # 等同于recall  

        FPR = FP/(FP+TN)

        6.AUC(area under curve):roc曲线下的面积,介于0.1和1之间。

         Auc作为数值可以直观的评价分类器的好坏,值越大越好。

    """

    #y = np.array(y_true)

    #scores = np.array(y_scores)

    # scores = model.get_prob(x)

    fpr, tpr, thresholds= roc_curve(y_true,y_scores,pos_label=1)

    Auc= auc(fpr, tpr)

    return fpr, tpr, Auc


def compute_iou(box1,box2,wh=False):  # Intersection over Union

    """

    compute the iou of two boxes.

    Args:

        box1, box2: [xmin, ymin, xmax, ymax] (wh=False) or [xcenter, ycenter, w, h] (wh=True)

        wh: the format of coordinate.

    Return:

        iou: iou of box1 and box2.

    """

    if wh == False:

        xmin1, ymin1, xmax1, ymax1= box1

        xmin2, ymin2, xmax2, ymax2= box2

    else:

        xmin1, ymin1= int(box1[0]- box1[2]/ 2.0),int(box1[1]- box1[3]/ 2.0)

        xmax1, ymax1= int(box1[0]+ box1[2]/ 2.0),int(box1[1]+ box1[3]/ 2.0)

        xmin2, ymin2= int(box2[0]- box2[2]/ 2.0),int(box2[1]- box2[3]/ 2.0)

        xmax2, ymax2= int(box2[0]+ box2[2]/ 2.0),int(box2[1]+ box2[3]/ 2.0)

    # 获取矩形框交集对应的左上角和右下角的坐标(intersection)

    xx1= np.max([xmin1, xmin2])

    yy1= np.max([ymin1, ymin2])

    xx2= np.min([xmax1, xmax2])

    yy2= np.min([ymax1, ymax2])

    # 计算两个矩形框面积

    area1= (xmax1- xmin1)* (ymax1- ymin1)

    area2= (xmax2- xmin2)* (ymax2- ymin2)

    inter_area= (np.max([0, xx2- xx1]))* (np.max([0, yy2- yy1]))# 计算交集

    iou= inter_area/ (area1+ area2- inter_area+ 1e-6)# 计算交并比

    # iou大于0.5算合格

    return iou


if __name__== '__main__':

    # 这些分数和预值是我构造的,原来检查写函数正确性

    y_scores= [0.2,0.4,0.4,0.5,0.5,0.6,0.8,0.9]

    y_pred= [0,1,1,0,1,1,0,1]

    y_true= [1,1,0,0,1,0,1,1]

    Precision, Recall, Accuracy= pre_re_ac(y_true, y_pred)

    F1(y_true, y_pred)

    pre_arr, rec_arr, thresholds= PR_curve(y_true, y_scores)

    fpr, tpr, Auc= roc_Auc(y_true, y_scores)

    # iou = compute_iou(box1, box2, wh=False)


    plt.figure(figsize=(8,10))

    plt.suptitle('Curve Image',fontsize=20,color='teal')

    title= 'Precision:{}; Recall:{}; Accuracy:{}'.format(Precision, Recall, Accuracy)


    plt.subplot(211)

    plt.title(title)

    plt.xlabel('Recall array')

    plt.ylabel('Precision array')

    plt.grid(True)

    plt.plot(rec_arr, pre_arr,marker='o',label='PR Curve')

    plt.legend()

    # plt.savefig('roc.png')


    plt.subplot(212)

    plt.title('auc:{}'.format(Auc))

    plt.xlabel('fpr')

    plt.ylabel('tpr')

    plt.grid(True)

    plt.plot(fpr, tpr,marker='o',label='ROC Curve')

    plt.legend()

    plt.subplots_adjust(wspace=3,hspace=0.3)

    plt.show()


这些方法功能我已经验证过了,但是没有大规模应用到数据分析,当时算法还没学习出结果,就gg了。

请大神批评指正!

你可能感兴趣的:(机器学习相关指标计算)