数据挖掘 分类模型选择

news2025/1/16 5:39:26

选择的模型有:
决策树、朴素贝叶斯、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回归和朴素贝叶斯

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二极管:TVS瞬态抑制二极管

一、什么是TVS二极管 TVS(Transient Voltage Suppressors),即瞬态电压抑制器,又称雪崩击穿二极管。 TVS二极管的符号如下图所示 什么是雪崩击穿 雪崩击穿是有必要了解一下的,不然后面还有齐纳击穿,搞不…

PySpark开发环境搭建常见问题及解决

PySpark环境搭建常见问题及解决 1、winutils.exe问题2、SparkURL问题3、set_ugi()问题 本文主要收录PySpark开发环境搭建时常见的一些问题及解决方案,并收集一些相关资源 1、winutils.exe问题 报错摘要: WARN Shell: Did not find winutils.exe: {} ja…

阿里云Arthas使用——在日志没有输出异常情况下,如何进行线上bug定位 stack命令 和 trace命令

前言 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类…

算法学习系列(五):N皇后、数独

目录 引言一、N皇后问题代码实现测试 二、数独问题代码实现测试 引言 这个N皇后问题是很典型的一个递归问题,就是还是要掌握,所谓递归其实就是dfs,一层一层深入下去。数独和N皇后的思路是一样的,只不过一些细节不同而已。 一、N…

【恋上数据结构】前缀树 Tire 学习笔记

Tire 需求分析 如何判断一堆不重复的字符串是否以某个前缀开头? 用 Set\Map 存储字符串(不重复)遍历所有字符串进行判断缺点:时间复杂度 O(n) 有没有更优的数据结构实现前缀搜索? Tire(和 Tree 同音&a…

Linux 和 macOS 的主要区别在哪几个方面呢?

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Unity-Shader - 2DSprite描边效果

实现一个简单的2D精灵图描边效果,效果如下 实现思路: 可以通过判断该像素周围是否有透明度为 0的值,如果有,则说明该像素位于边缘。 所以我们需要打开alpha blend,即: Blend SrcAlpha OneMinusSrcAlpha&am…

腾讯云轻量应用服务器怎么使用宝塔面板?

腾讯云轻量应用服务器宝塔面板怎么用?轻量应用服务器如何安装宝塔面板?在镜像中选择宝塔Linux面板腾讯云专享版,在轻量服务器防火墙中开启8888端口号,然后远程连接到轻量服务器执行宝塔面板账号密码查询命令,最后登录和…

Apache或Nginx在Linux上配置虚拟主机

在Linux上使用Apache或Nginx配置虚拟主机可以让您在同一台服务器上托管多个网站。这样不仅可以充分利用服务器资源,还能降低每个网站的运营成本。以下是使用Apache和Nginx配置虚拟主机的步骤。 使用Apache配置虚拟主机 安装Apache服务器软件。在终端中使用以下命令…

网络安全(三)-- 网络嗅探及协议分析技术

目标 了解网络嗅探的基本含义了解tcpdump工具的基本用法掌握tcpdump工具抓包保存到文件的方法熟悉wireshark工具的基本用法掌握借助wireshark抓包工具分析简单网络协议的方法 6.1. 概述 网络嗅探是一种常用的数据收集、分析的方法: 黑客常通过网络嗅探获取主机或网络的控制权…

资料分析(花生)

基期A(给出BR或BX) 前期:代入、直除、假设分配隔年前期:求出间隔增长率,再变成第一类考法前期差值:假设分配法求得两个前期作差。 现期B 有增量求现期:求出 X,列不等式即可有增速求现…

uniapp 使用 $emit和$on——$on中无法为data中的变量赋值

问题在于this的指向&#xff0c; 解决办法是使用变量保存$on&#xff0c;其次再为data中的值赋值 以下是具体代码&#xff1a; 1、html代码&#xff1a; <view class"form_picker" click"selePositionFun()"><view class""><inp…

Leetcode 77 组合

题意理解&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 如&#xff1a;n3,k2,则有&#xff1a;12 13 23 一般&#xff0c;我们使用回溯法来解决组合问题。 组合问题没有顺序要求&#xff0c;所以 12 21 是同一个组合&#xff08;如…

centos7安装Elasticsearch7系列

背景 今天公司项目需要使用Elasticsearch7.17.7。所有网上搜索了一番&#xff0c;查到一个很不错安装方式分享给大家。 Elasticsearch官网发布 从 Elasticsearch 7.x 版本开始&#xff0c;Elasticsearch 发行版包括了自己的 JDK。因此&#xff0c;您不需要单独安装 Java。以…

Android View.inflate 和 LayoutInflater.from(this).inflate的区别

前言 两个都是布局加载器&#xff0c;而View.inflate是对 LayoutInflater.from(context).inflate的封装&#xff0c;功能相同&#xff0c;案例使用了dataBinding。 View.inflate(context, layoutResId, root) LayoutInflater.from(context).inflate(layoutResId, root, fals…

CLIP在Github上的使用教程

CLIP的github链接&#xff1a;https://github.com/openai/CLIP CLIP Blog&#xff0c;Paper&#xff0c;Model Card&#xff0c;Colab CLIP&#xff08;对比语言-图像预训练&#xff09;是一个在各种&#xff08;图像、文本&#xff09;对上进行训练的神经网络。可以用自然语…

JS箭头函数

箭头函数 1. 基本语法 // // 一般函数const fn function() {console.log(123);}// 箭头函数const fn () > {console.log(123);}fn()const fn (x) > {console.log(x);}fn(1)// 只有一个形参的时候可以省略小括号const fn x > {console.log(x);}fn(1)// 只有一行代…

基于c++版本链队列改-Python版本链队列基础理解

##基于链表的队列实现 可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”&#xff0c;规定队尾仅可添加节点&#xff0c;队首仅可删除节点。 ##图解 ##基于链表的队列实现代码 class ListNode:"""定义链表"""def __init__(self)…

nodejs微信小程序+python+PHP本科生优秀作业交流网站的设计与实现-计算机毕业设计推荐

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将本科生优秀作业交流网站功能模块主要分为管理员模块。管理员添加系统首页、个人中心、用户管理、作业分类管理、作业分享管理、论坛交流、投诉举报、系统管理等操作。 随着信息化社会的形成…