开启成长之旅!这是我参加「日新方案 2 月更文挑战」的第 8 天,点击检查活动概况
一、功能衡量
功能衡量意图是对学习期的泛华才能进行评价,功能衡量反映了使命需求,在对比不同算法的泛华才能时,运用不同的功能衡量往往会导致不同的评判成果。常用衡量有均方差错,过错率与精度,查准率与查全率等。
1.过错率与精度
这两种衡量既适用于二分类使命,也适用于多分类使命。过错率是分类过错的样本数占样本总数的份额,精度则是分类正确的样本数占样本总数的份额。
2.查准率、查全率与F1
查准率(precision)与查全率(recall)是关于需求在信息检索、Web搜索等使用评价功能衡量习惯度高的检测数值。关于二分类问题,可将实在类别与算法猜测类别的组合划分为真正例(ture positive)、假证例(false positive)、真反例(true negative)、假反例(false negative)四种情形。显然TP+FP+TN+FN=样例总数。分类成果为混杂矩阵:
实在状况 猜测成果
正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)
查准率P界说为:
查全率R界说为:
一般来说。查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。通常只要一些简单使命中,才可能使查全率和查准率都很高。
二、代码完成:
1.根据具体二分类问题算法完成代码:
import numpy
import matplotlib
from matplotlib import pyplot as plt
# true = [实在组1,实在组2...实在组N],predict = [猜测组1,猜测组2...猜测组N]
def evaluation(true, predict):
num = len(true) # 确定有几组
(TP, FP, FN, TN) = ([0] * num for i in range(4)) # 赋初值
for m in range(0, len(true)):
if (len(true[m]) != len(predict[m])): # 样本数都不等,显然是有过错的
print("实在成果与猜测成果样本数不一致。")
else:
for i in range(0, len(true[m])): # 对每一组数据别离计数
if (predict[m][i] == 1) and ((true[m][i] == 1)):
TP[m] += 1.0
elif (predict[m][i] == 1) and ((true[m][i] == 0)):
FP[m] += 1.0
elif (predict[m][i] == 0) and ((true[m][i] == 1)):
FN[m] += 1.0
elif (predict[m][i] == 0) and ((true[m][i] == 0)):
TN[m] += 1.0
(P, R) = ([0] * num for i in range(2))
for m in range(0, num):
if (TP[m] + FP[m] == 0):
P[m] = 0 # 防备一些分母为0的状况
else:
P[m] = TP[m] / (TP[m] + FP[m])
if (TP[m] + FN[m] == 0):
R[m] = 0 # 防备一些分母为0的状况
else:
R[m] = TP[m] / (TP[m] + FN[m])
plt.title("P-R")
plt.xlabel("P")
plt.ylabel("R")
#plt.plot(P, R)
#plt.show()
if __name__ == "__main__":
# 简单举例
myarray_ture = numpy.random.randint(0, 2, (3, 100))
myarray_predict = numpy.random.randint(0, 2, (3, 100))
evaluation(myarray_ture,myarray_predict)
下面给出使用鸢尾花数据集制作P-R曲线的代码(首要体现其微互斥性)
2.使用鸢尾花制作P-R曲线
from sklearn import svm, datasets
from sklearn.model_selection import train_test_split
import numpy as np
iris = datasets.load_iris()
# 鸢尾花数据导入
x = iris.data
#每一列代表了萼片或花瓣的长宽,一共4列,每一列代表某个被测量的鸢尾植物,iris.shape=(150,4)
y = iris.target
#target是一个数组,存储了data中每条记载归于哪一类鸢尾植物,所以数组的长度是150,一切不同值只要三个
random_state = np.random.RandomState(0)
#给定状态为0的随机数组
n_samples, n_features = x.shape
x = np.c_[x, random_state.randn(n_samples, 200 * n_features)]
#增加合并生成特征测试数据集
x_train, x_test, y_train, y_test = train_test_split(x[y < 2], y[y < 2],
test_size=0.25,
random_state=0)
#根据此模型训练简单数据分类器
classifier = svm.LinearSVC(random_state=0)#线性分类支撑向量机
classifier.fit(x_train, y_train)
y_score = classifier.decision_function(x_test)
from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt
precision, recall, _ =precision_recall_curve(y_test, y_score)
plt.fill_between(recall, precision,color='b')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.0])
plt.xlim([0.0, 1.0])
plt.plot(recall, precision)
plt.title("Precision-Recall")
plt.show()
效果:
P-R图直观的显示出学习器在样本上的查全率、查准率。在进行比较时,若一个歇息区的P-R曲线被另一个学习器的曲线彻底“包住”,则可断言后者的功能优于前者。为获得比较合理的判断依据,将选用“平衡点”(Break-Even Point,BEP)衡量对比算法的泛华功能强弱。它是“查准率=查全率”时的取值。但BEP仍是过于简化,更常用F1衡量(all为样例总数):