机器学习相关的科学计算指标
其实本人也不精通
上代码:
#!/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了。
请大神批评指正!