机器学习:性能度量篇-Python利用鸢尾花数据绘制P-R曲线

简介: 机器学习:性能度量篇-Python利用鸢尾花数据绘制P-R曲线

前言


本人大数据专业初入大三刚刚接触机器学习这一课程,教材是最典型的西瓜书,第一次作业当然就是利用本专业语言多功能python语言结合书内容尝试自己构建P-R曲线以及延伸指标曲线。当然初入一些算法和机器学习的一些库还不是很熟练掌握,有待提升自己的编程结合能力。在此领域本人有诸多不明确疑问,可能文章会有些许错误,望大家在评论区指正,本篇文章错误将会不断更正维护。


提示:以下是本篇文章正文内容,下面案例可供参考


一、性能度量


性能度量目的是对学习期的泛华能力进行评估,性能度量反映了任务需求,在对比不同算法的泛华能力时,使用不同的性能度量往往会导致不同的评判结果。常用度量有均方误差,错误率与精度,查准率与查全率等。


1.错误率与精度


这两种度量既适用于二分类任务,也适用于多分类任务。错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本总数的比例。


2.查准率、查全率与F1


查准率(precision)与查全率(recall)是对于需求在信息检索、Web搜索等应用评估性能度量适应度高的检测数值。对于二分类问题,可将真实类别与算法预测类别的组合划分为真正例(ture positive)、假证例(false positive)、真反例(true negative)、假反例(false negative)四种情形。显然TP+FP+TN+FN=样例总数。分类结果为混淆矩阵:


image.png

查准率P定义为:


image.png


查全率R定义为:


image.png



一般来说。查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。通常只有一些简单任务中,才可能使查全率和查准率都很高。


二、代码实现:

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()


效果:20200924002308127.png


P-R图直观的显示出学习器在样本上的查全率、查准率。在进行比较时,若一个休息区的P-R曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者。为取得比较合理的判断依据,将采用“平衡点”(Break-Even Point,BEP)度量对比算法的泛华性能强弱。它是“查准率=查全率”时的取值。但BEP还是过于简化,更常用F1度量(all为样例总数):


image.png

总结


还有ROC与AUC没有提到,下篇再叙述,写完已经到1点了,明天还有课顶不住先睡觉了。

目录
相关文章
|
10月前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
390 7
|
8月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1078 12
Scikit-learn:Python机器学习的瑞士军刀
|
11月前
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
Python与机器学习:使用Scikit-learn进行数据建模
|
10月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
10月前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
231 0
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
488 0
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
583 14
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
576 1
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)

热门文章

最新文章

推荐镜像

更多