数据挖掘 分类模型选择

选择的模型有:
决策树、朴素贝叶斯、K近邻、感知机
调用的头文件有:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import Perceptron
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import warnings
from sklearn.metrics import roc_curve, auc

稍微解释一下调用的头文件,好歹别不能分不出来

numpy:提供了强大的数值计算功能,包括对多维数组对象的支持、广播功能、线性代数、傅里叶变换等,是进行科学计算的基础库。

pandas:提供了数据结构DataFrame和Series,使得数据处理变得更加简单高效,能够进行数据清洗、重塑、切片、聚合等操作,常用于数据预处理和数据分析中。

matplotlib:提供了丰富的绘图工具,可以创建各种类型的静态、交互式、嵌入式图表,用于数据可视化和结果展示。

sklearn.linear_model:包含了许多线性模型,如线性回归、逻辑回归、感知机等,用于解决回归和分类问题。

sklearn.naive_bayes:实现了朴素贝叶斯分类器,用于处理分类问题,尤其在文本分类等领域应用广泛。

sklearn.neighbors:包含了近邻算法,如K近邻分类器和回归器,用于解决分类和回归问题。

sklearn.tree:包含了决策树相关的算法,如决策树分类器和回归器,用于解决分类和回归问题。

sklearn.model_selection:提供了交叉验证、参数调优等功能,用于评估模型性能和选择最佳参数。

warnings:用于控制警告信息的输出和处理,可以帮助我们在开发过程中更好地管理警告信息。

sklearn.metrics:提供了常见的模型评估指标,如准确率、精确率、召回率、ROC曲线等,用于评估模型性能。

具体代码:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import Perceptron
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import warnings
from sklearn.metrics import roc_curve, auc

warnings.filterwarnings("ignore")#将警告信息的输出暂时忽略,从而在代码执行过程中不显示警告信息。这对于一些已知的、无关紧要的警告信息,或者在模型训练过程中产生的非致命性警告,可以减少干扰并简化输出结果。
df = pd.read_csv("balance.dat", sep=',')#read_csv支持读取.dat文件
df[" Class"] = df[" Class"].map({" L": 1, " R": -1, " B": np.nan})#将类别标签转换为数值标签
df = df.dropna()#去掉不想要的值
X = df[["Left-weight", " Left-distance", " Right-weight", " Right-distance"]]
Y = df[' Class']
scores, names_model = [], []
metrics = ["precision", "f1", "recall"]#精确率(Precision):表示模型在预测为正例的样本中,真正例的比例metrics = ["precision", "f1", "recall"]#精确率(Precision):表示模型在预测为正例的样本中,真正例的比例召回率(Recall):表示模型能够正确预测为正例的样本在总体正例中的比例。
for model in [DecisionTreeClassifier(), GaussianNB(), KNeighborsClassifier(n_neighbors=3), Perceptron()]:
    names_model.append(str(model).replace('()', ''))#str()函数将当前迭代中选取的模型转换为字符串。这里的模型是从一个列表中选取的,如前面提到的决策树分类器(DecisionTreeClassifier())。调用字符串的replace()方法,将其中的空括号()替换为空字符串''。这是因为在模型的字符串表示中,通常会包含这些括号,但它们对于后续处理并不重要。
    model.fit(X, Y)
    tempt = []
    for scoring in metrics:#三个指标轮流来
        score = cross_val_score(model, X, Y, cv=10, scoring=scoring)#10折交叉验证 scoring:性能度量的得分
        tempt.append(score.mean())#10个数的平均值
    scores.append(tempt)
scores = pd.DataFrame(scores, index=names_model, columns=metrics)#得分、每个模型的名字、每个性能指标的名称
print(f'''F度量下最优模型为{scores['f1'].idxmax()}''')#三引号是大引号,用二引号是不行的

model_dt = DecisionTreeClassifier()#决策树
model_dt.fit(X, Y)
model_nb = GaussianNB()#朴素贝叶斯
model_nb.fit(X, Y)

y_prob_dt = model_dt.predict_proba(X)[:, 1]#决策树模型会返回每个类别的概率,而[:, 1]表示我们只关心预测为正类别的概率值。
y_prob_nb = model_nb.predict_proba(X)[:, 1]
fpr_dt, tpr_dt, _ = roc_curve(Y, y_prob_dt)#fpr_dt:false positive rate,即假正率,也就是当真实标签为负类时,被模型错误地预测为正类的样本比例。tpr_dt:true positive rate,即真正率,也就是当真实标签为正类时,被模型正确地预测为正类的样本比例。_:阈值,该值在此处被忽略。在roc_curve()函数中,阈值的值会被计算出来,但在大多数情况下,我们不需要直接使用它。因为在绘制ROC曲线和计算AUC时,我们关注的是不同阈值下的假正率(FPR)和真正率(TPR)的变化趋势,而不是具体的阈值值。我们使用_来忽略阈值的返回值,因为我们只关心fpr_dt和tpr_dt
roc_auc_dt = auc(fpr_dt, tpr_dt)
fpr_nb, tpr_nb, _ = roc_curve(Y, y_prob_nb)#ROC曲线可以帮助我们理解模型在不同阈值下的性能表现,从而选择合适的阈值。AUC是ROC曲线下方的面积,它反映了分类器性能的综合指标。AUC越大,分类器的性能越好,因为它意味着分类器在不同阈值下都有较低的假正率和较高的真正率。通常,AUC值在0.5到1之间,越接近1说明分类器的性能越好。
roc_auc_nb = auc(fpr_nb, tpr_nb)
print(f'决策树模型和朴素贝叶斯模型的AUC值分别为{roc_auc_dt}{roc_auc_nb}')
plt.figure(figsize=(8, 8))
plt.plot(fpr_dt, tpr_dt, color='darkorange', lw=2, )#假正率 真正率 橙色 线宽为2
plt.plot(fpr_nb, tpr_nb, color='blue', lw=2, )
plt.plot([0, 1], [0, 1], color='gray', lw=1, linestyle='--')# 灰色
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.show()

格式化后的代码:(跟上面一样,看你喜欢看哪个)

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.linear_model import Perceptron
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import warnings
from sklearn.metrics import roc_curve, auc

warnings.filterwarnings(
    "ignore")  # 将警告信息的输出暂时忽略,从而在代码执行过程中不显示警告信息。这对于一些已知的、无关紧要的警告信息,或者在模型训练过程中产生的非致命性警告,可以减少干扰并简化输出结果。
df = pd.read_csv("balance.dat", sep=',')  # read_csv支持读取.dat文件
df[" Class"] = df[" Class"].map({" L": 1, " R": -1, " B": np.nan})  # 将类别标签转换为数值标签(预处理)
df = df.dropna()  # 去掉不想要的值
X = df[["Left-weight", " Left-distance", " Right-weight", " Right-distance"]]
Y = df[' Class']
scores, names_model = [], []
metrics = ["precision", "f1",
           "recall"]  # 精确率(Precision):表示模型在预测为正例的样本中,真正例的比例metrics = ["precision", "f1", "recall"]#精确率(Precision):表示模型在预测为正例的样本中,真正例的比例召回率(Recall):表示模型能够正确预测为正例的样本在总体正例中的比例。
for model in [DecisionTreeClassifier(), GaussianNB(), KNeighborsClassifier(n_neighbors=3), Perceptron()]:
    names_model.append(str(model).replace('()',
                                          ''))  # str()函数将当前迭代中选取的模型转换为字符串。这里的模型是从一个列表中选取的,如前面提到的决策树分类器(DecisionTreeClassifier())。调用字符串的replace()方法,将其中的空括号()替换为空字符串''。这是因为在模型的字符串表示中,通常会包含这些括号,但它们对于后续处理并不重要。
    model.fit(X, Y)
    tempt = []
    for scoring in metrics:  # 三个指标轮流来
        score = cross_val_score(model, X, Y, cv=10, scoring=scoring)  # 10折交叉验证 scoring:性能度量的得分
        tempt.append(score.mean())  # 10个数的平均值
    scores.append(tempt)
scores = pd.DataFrame(scores, index=names_model, columns=metrics)  # 得分、每个模型的名字、每个性能指标的名称
print(f'''F度量下最优模型为{scores['f1'].idxmax()}''')  # 三引号是大引号,用二引号是不行的

model_dt = DecisionTreeClassifier()  # 决策树
model_dt.fit(X, Y)
model_nb = GaussianNB()  # 朴素贝叶斯
model_nb.fit(X, Y)

y_prob_dt = model_dt.predict_proba(X)[:, 1]  # 决策树模型会返回每个类别的概率,而[:, 1]表示我们只关心预测为正类别的概率值。
y_prob_nb = model_nb.predict_proba(X)[:, 1]
fpr_dt, tpr_dt, _ = roc_curve(Y,
                              y_prob_dt)  # fpr_dt:false positive rate,即假正率,也就是当真实标签为负类时,被模型错误地预测为正类的样本比例。tpr_dt:true positive rate,即真正率,也就是当真实标签为正类时,被模型正确地预测为正类的样本比例。_:阈值,该值在此处被忽略。在roc_curve()函数中,阈值的值会被计算出来,但在大多数情况下,我们不需要直接使用它。因为在绘制ROC曲线和计算AUC时,我们关注的是不同阈值下的假正率(FPR)和真正率(TPR)的变化趋势,而不是具体的阈值值。我们使用_来忽略阈值的返回值,因为我们只关心fpr_dt和tpr_dt
roc_auc_dt = auc(fpr_dt, tpr_dt)
fpr_nb, tpr_nb, _ = roc_curve(Y,
                              y_prob_nb)  # ROC曲线可以帮助我们理解模型在不同阈值下的性能表现,从而选择合适的阈值。AUC是ROC曲线下方的面积,它反映了分类器性能的综合指标。AUC越大,分类器的性能越好,因为它意味着分类器在不同阈值下都有较低的假正率和较高的真正率。通常,AUC值在0.5到1之间,越接近1说明分类器的性能越好。
roc_auc_nb = auc(fpr_nb, tpr_nb)
print(f'决策树模型和朴素贝叶斯模型的AUC值分别为{roc_auc_dt}{roc_auc_nb}')
plt.figure(figsize=(8, 8))
plt.plot(fpr_dt, tpr_dt, color='darkorange', lw=2, )  # 假正率 真正率 橙色 线宽为2
plt.plot(fpr_nb, tpr_nb, color='blue', lw=2, )
plt.plot([0, 1], [0, 1], color='gray', lw=1, linestyle='--')  # 灰色
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.show()

图像:(把标题放下面太麻烦了,我也没整明白,将就着看吧)
在这里插入图片描述
相比之下:在这个数据集中,决策树比朴素贝叶斯要好

补充一下

处理数据的时候别忘记数据预处理和数据归一化
上面这段代码并未执行归一化,当然也不太需要

对于分类模型的话:比较推荐logic回归和朴素贝叶斯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/221455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试面试题解析--什么题是必问的?

设计测试用例的主要方法有哪些?简述一下缺陷的生命周期?测试流程?项目流程?验收测试中和β测试区别?如何维护测试用例?每天测多少用例怎么分配的测试的一天能找多少bug你在上一家公司,写没写过测…

github首次将文件合到远端分支,发现名字不是master,而是main

暂存区和本地仓库的信息都存储在.git目录中其中 其中,暂存区和本地仓库的信息都存储在.git目录中 在自己的github上实践 1、刚开始,git clone gitgithub.com:lingze8678/my_github.git到本地 2、在克隆后的代码中加入一个pdf文件 3、在git bash中操作…

基本网络安全概述:保护您的数字生活

数字时代给我们的生活带来了无与伦比的连通性和便利,但也带来了新的威胁和漏洞。随着我们越来越依赖技术,网络安全概述的重要性怎么强调都不为过。在这篇文章中,我们将深入探讨网络安全的重要性、其关键组成部分、最佳实践、常见威胁以及该领…

WeakMap

WeakMap简介 作为es6一种新的数据结构,他是一种键值对的集合。与Map最大的区别有两个 1. 是其中的键必须是对象或非全局注册的符号。 全局注册的符号 const s1 Symbol.for(mySymbol) 非全局注册的符号 const s1 Symbol(mySymbol)了解Symbol.for 2. 不会创建对它…

Ansys Zemax | 手机镜头设计 - 第 3 部分:使用 STAR 模块和 ZOS-API 进行 STOP 分析

附件下载 联系工作人员获取附件 本文是 3 篇系列文章的一部分,该系列文章将讨论智能手机镜头模组设计的挑战,从概念、设计到制造和结构变形的分析。本文是三部分系列的第三部分。它涵盖了使用 Ansys Zemax OpticStudio Enterprise 版本提供的 STAR 技术…

ATECLOUD电源自动测试系统打破传统 助力新能源汽车电源测试

随着新能源汽车市场的逐步扩大,技术不断完善提升,新能源汽车测试变得越来越复杂,测试要求也越来越严格。作为新能源汽车的关键部件之一,电源为各个器件和整个电路提供稳定的电源,满足需求,确保新能源汽车的…

Homework 3: Higher-Order Functions, Self Reference, Recursion, Tree Recursion

Q1: Compose 编写一个高阶函数composer,它返回两个函数func和func_adder。 func是一个单参数函数,它应用到目前为止已经组合的所有函数。这些函数将首先应用最新的函数(参见doctests和示例)。 func_adder用于向我们的组合添加更多…

ESP32-Web-Server编程-在网页中插入图片

ESP32-Web-Server编程-在网页中插入图片 概述 图胜与言,在网页端显示含义清晰的图片,可以使得内容更容易理解。 需求及功能解析 本节演示在 ESP32 Web 服务器上插入若干图片。在插入图片时还可以对图片设置一个超链接,用户点击该图片时&a…

统计项目代码行数轻松搞定:使用 Node.js 脚本自动统计代码量

说在前面 在软件开发领域,了解项目的代码规模和复杂度对于项目管理、团队协作以及技术评估都至关重要。通过统计项目代码行数,我们能够更好地把握项目的整体情况,包括但不限于代码量的大小、不同类型文件的分布情况以及项目的结构和复杂度。这…

数据结构之选择排序

目录 直接选择排序 选择排序的时间复杂度 堆排序 向上调整算法 向下调整算法 向上调整算法建立堆 向下调整算法建立堆 堆排序整体代码 堆排序的时间复杂度 直接选择排序 在之前讲插入排序时,我们讲了这样的一个应用场景,我们在斗地主摸牌时&…

CoreDNS实战(十一)-分流与重定向

本文主要介绍了目前CoreDNS服务在外部域名递归结果过程中出现的一些问题以及使用dnsredir插件进行分流和alternate插件进行重试优化的操作。 1 自建DNS服务现状 一般来说,无论是bind9、coredns、dnsmasq、pdns哪类dns服务器,我们自建的监听在UDP53端口…

【已解决】页内切换<router-view>使得url变化导致菜单高亮消失

在写项目时&#xff0c;我们常会用到侧边菜单栏&#xff0c;而具体页面中经常使用<router-view>切换子组件。 但是按照我们平时的写法&#xff0c;切换子组件后会导致url改变&#xff0c;从而使得菜单高亮消失&#xff0c;这是非常影响用户体验的。 所以&#xff0c;我…

圈子社交系统:打破时间与空间的限制。APP小程序H5三端源码交付,支持二开!

在现代社会&#xff0c;社交已成为人们生活中不可或缺的一部分。然而&#xff0c;传统的社交方式往往受制于时间和空间的限制&#xff0c;使得人们难以充分发挥社交的潜力。为了解决这一问题&#xff0c;圈子社交系统应运而生。 圈子社交系统通过技术手段打破时间与空间的限制&…

想考研到电子类,未来从事芯片设计,目前该怎么准备?

最近看不少天坑学子想考研微电子专业&#xff0c;但却不知道该怎么准备&#xff1f;接下来就带大家一起来具体了解一下~ 首先是目标院校的选择&#xff1f; 目前所设的微电子专业学校里&#xff0c;比较厉害的有北京大学、清华大学、中国科学院大学、复旦大学、上海交通大学、…

探索人工智能领域——每日20个名词详解【day9】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

flex 布局防止元素被挤换行

刚开始是这样的代码&#xff1a; <div class"flex"><span>选择模型&#xff1a;</span><n-select :options"state.chatModelOptions" /> </div>选择模型换行了…不行&#xff0c;这个效果不行&#xff0c;修改后&#xff1…

基于STM32驱动的压力传感器实时监测系统

本文介绍了如何使用STM32驱动压力传感器进行实时监测。首先&#xff0c;我们会介绍压力传感器的工作原理和常见类型。然后&#xff0c;我们将介绍如何选择合适的STM32单片机和压力传感器组合。接下来&#xff0c;我们会详细讲解如何使用STM32驱动压力传感器进行数据采集和实时监…

647. Palindromic Substrings 516. Longest Palindromic Subsequence

647. Palindromic Substrings Given a string s, return the number of palindromic substrings 回文子串 in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous sequence of characters within the string. nomal: …

玄子Share-CSS3 弹性布局知识手册

玄子Share-CSS3 弹性布局知识手册 Flexbox Layout&#xff08;弹性盒布局&#xff09;是一种在 CSS 中用于设计复杂布局结构的模型。它提供了更加高效、简便的方式来对容器内的子元素进行排列、对齐和分布 主轴和交叉轴 使用弹性布局&#xff0c;最重要的一个概念就是主轴与…

服务器数据恢复—重装系统导致XFS文件系统分区丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器使用磁盘柜RAID卡搭建了一组riad5磁盘阵列。服务器上层分配了一个LUN&#xff0c;划分了两个分区&#xff1a;sdc1分区和sdc2分区。通过LVM扩容的方式&#xff0c;将sdc1分区加入到了root_lv中&#xff1b;sdc2分区格式化为XFS文件系统。…