机器学习算法应用——朴素贝叶斯分类器

朴素贝叶斯分类器

朴素贝叶斯分类器(Naive Bayes Classifier)是一种基于贝叶斯定理和特征条件独立假设的分类方法。它适用于分类任务,特别是文本分类、垃圾邮件识别等领域。

原理

朴素贝叶斯分类器基于以下两个主要假设:

  1. 特征条件独立:给定类别,特征之间是相互独立的。这意味着一个特征的出现不依赖于其他特征的出现。虽然这在现实世界中往往不成立,但这个假设大大简化了计算,使得朴素贝叶斯分类器在实际应用中表现良好。
  2. 贝叶斯定理:用于计算给定特征时某个类别出现的概率。

贝叶斯定理

对于两个随机变量X和Y,贝叶斯定理可以表示为:

[ P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)} ]

其中:

  • ( P(Y|X) ) 是给定X时Y的后验概率。
  • ( P(X|Y) ) 是给定Y时X的条件概率。
  • ( P(Y) ) 是Y的先验概率。
  • ( P(X) ) 是X的边际概率。

在分类任务中,X代表特征向量,Y代表类别。

朴素贝叶斯分类器的步骤

  1. 数据准备:收集带有类别标签的训练数据。
  2. 计算先验概率:计算每个类别的先验概率 ( P(Y) )。
  3. 计算条件概率:对于每个类别和每个特征,计算给定类别时该特征的条件概率 ( P(X_i|Y) )。由于朴素贝叶斯假设特征条件独立,这些计算可以独立进行。
  4. 分类:对于新的、未标记的数据点,计算其在每个类别下的后验概率 ( P(Y|X) )。选择具有最大后验概率的类别作为预测结果。

类型

  • 高斯朴素贝叶斯:当特征连续并且假设它们遵循高斯(正态)分布时使用。
  • 多项式朴素贝叶斯:用于离散特征,常用于文本分类任务,其中特征表示文档中单词的出现次数。
  • 伯努利朴素贝叶斯:也用于离散特征,但假设特征是二元的(例如,单词是否出现)。

优点

  • 实现简单且高效。
  • 对缺失和噪声数据相对鲁棒。
  • 在小数据集上表现良好。

缺点

  • 特征条件独立假设往往不成立,这可能会影响分类性能。
  • 需要大量的训练数据来估计概率。
  • 对于输入数据的预处理很敏感(例如,文本中的停用词和词干提取)。

应用

朴素贝叶斯分类器在文本分类、垃圾邮件过滤、情感分析、新闻分类等领域有广泛应用。

  1. 数据

Universal Bank 是一家业绩快速增长的银行。为了增加贷款业务,该银行探索将储蓄客户转变成个人贷款客户的方式。银行收集了5000条客户数据,包括客户特征(age、experience、income、family、 CCAvg、education、Zip Code)、客户对上一次贷款营销活动的响应( Personal Loan )、客户和银行的关系( mortgage,securities account.online.CD account、credit card)共13个特征,目标值是 Personal Loan,即客户是否接受了个人贷款。

ID

Age

Experience

Income

ZIP Code

账户

年龄

经验

收入

邮政编码

Family

CCAvg

Education

Mortgage

Securities Account

家庭成员人数

信用卡月平均消费

教育水平

按揭贷款数目

证券账户

CD Account

Online

CreditCard

Personal Loan

定期存款

在线

信用卡

个人贷款

(目标值)

在5000个客户中,仅480个客户接受了提供给他们的个人贷款。

数据实例:

IDAgeExperienceIncomeZIP CodeFamilyCCAvgEducationMortgagePersonal LoanSecurities AccountCD AccountOnlineCreditCard
1251499110741.61001000
24519349008931.51001000
339151194720111000000
43591009411212.72000000
53584591330412000001
63713299212140.4215500010
75327729171121.52000010
85024229394310.33000001
93510819008930.6210400010
103491809302318.93010000
1165391059471042.43000000
12295459027730.12000010
1348231149310623.83001000
145932409492042.52000010
15674111291741121001000
166030229505411.53000011
1738141309501044.7313410000
184218819430542.41000000
1946211939160428.13010000
205528219472010.52001001
215631259401540.9211100010
2257276390095323000010
23295629027711.2126000010
244418439132020.7116301000
2536111529552123.9115900001
264319299430530.519700010
274016839506440.23000000

注意:数据集中的编号(ID)和邮政编码(ZIP CODE)特征因为在分类模型中无意义,所以在数据预处理阶段将它们删除。

  1. 使用高斯朴素贝叶斯分类器(特征为连续型变量)对数据进行分类
  • 使用留出法划分数据集,训练集:测试集为7:3
  • #1. 读入数据
    df = pd.read_csv('universalbank.csv')
    y = df['Personal Loan']
    X = df.drop(['ID', 'ZIP Code', 'Personal Loan'], axis = 1)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 0)
    
  • 使用高斯朴素贝叶斯分类器对训练集进行训练
  • #2. 训练高斯朴素贝叶斯模型
    gnb = GaussianNB()
    gnb.fit(X_train, y_train)

  • 使用训练好的模型对测试数据集进行预测并输出预测结果模型准确度
  • # 3. 评估模型
    y_pred = gnb.predict(X_test)
    print('测试数据的预测结果:', y_pred)acc = gnb.score(X_test, y_test)
    print('GaussianNB模型的准确度:',acc)
    

  1. 使用多项式朴素贝叶斯(特征为离散型变量)对数据进行分类
  • 筛选出数据中的离散型特征
  • # 1. 读入数据
    y = df['Personal Loan']
    X = df[['Family', 'Education', 'Securities Account', 
    'CD Account', 'Online', 'CreditCard']]              #只选用6个特征
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
    

  • 使用留出法划分数据集,训练集:测试集为7:3。
  • X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)

  • 使用多项式朴素贝叶斯分类器对训练集进行训练
  • #2. 训练多项式朴素贝叶斯模型
    mnb = MultinomialNB()
    mnb.fit(X_train, y_train)
  • 使用训练好的模型对测试数据集进行预测并输出预测结果模型准确度
  • y_pred = mnb.predict(X_test)
    print('测试数据的预测结果:', y_pred)acc = mnb.score(X_test, y_test)
    print('MultinomialNB模型的准确度:',acc)
    

代码:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB#1. 读入数据
df = pd.read_csv('universalbank.csv')
y = df['Personal Loan']
X = df.drop(['ID', 'ZIP Code', 'Personal Loan'], axis = 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 0)#2. 训练高斯朴素贝叶斯模型
gnb = GaussianNB()
gnb.fit(X_train, y_train)# 3. 评估模型
y_pred = gnb.predict(X_test)
print('测试数据的预测结果:', y_pred)acc = gnb.score(X_test, y_test)
print('GaussianNB模型的准确度:',acc)# 1. 读入数据
y = df['Personal Loan']
X = df[['Family', 'Education', 'Securities Account', 
'CD Account', 'Online', 'CreditCard']]              #只选用6个特征
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)#2. 训练多项式朴素贝叶斯模型
mnb = MultinomialNB()
mnb.fit(X_train, y_train)y_pred = mnb.predict(X_test)
print('测试数据的预测结果:', y_pred)acc = mnb.score(X_test, y_test)
print('MultinomialNB模型的准确度:',acc)

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

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

相关文章

JS_ES6(1)

作用域链: 作用域链是底层变量查找的机制:当函数执行时,优先查找当前函数作用域中有无需要用到的变量,如果找不到,逐级查找父级,直到全局 > 嵌套关系形成作用域链,同一作用域链从小到大查找…

taro3兼容支付宝/微信小程序的自定义拖拽排序组件

描述:列表可以完成拖拽排序 此组件是根据支付宝原生文档改编成taro-vue3的形式,只保留了拖拽的部分,其他功能都去除了,测试下来可以兼容支付宝和微信小程序。 支付宝原生文档: https://opendocs.alipay.com/support/…

BGP(border gateway protocol)边界网关协议初识篇

BGP它是一种路径矢量协议,用于决定数据包在互联网中的最佳路径。 1、工作原理: 自治系统(AS)间路由: BGP主要用于连接不同自治系统之间的路由器,其中每个自治系统(AS)代表一组具有共同路由的网…

编译 fdk-aac

文章目录 关于 fdk-aac编译 fdk-aac在 FFMpeg 编译中启用 关于 fdk-aac A standalone library of the Fraunhofer FDK AAC code from Android. github : https://github.com/mstorsjo/fdk-aac代码托管 : https://sourceforge.net/projects/opencore-am…

最新巨量X-Bogus、_signature参数逆向分析与算法还原

文章目录 1. 写在前面2. 接口分析3. 断点分析4. 扣代码补环境5. 数据解密 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路…

# 从浅入深 学习 SpringCloud 微服务架构(十六)

从浅入深 学习 SpringCloud 微服务架构(十六) 一、SpringCloudStream:自定义消息通道 1、在子工程 stream_product (子模块)中,创建 自定义的消息通道类 MyProcessor.java /*** spring_cloud_demo\stream_product…

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE: Java SE:指Java标准版,适用于各行各业,主要是Java…

【负载均衡式在线OJ项目day5】OJ服务模块概要

前言 经过四天的努力已经完成了编译运行这个大模块,今天将要进入OJ服务模块设计,该模块的本质就是建立一个小型网站 一.功能 为用户提供题目列表页面为用户提供网站首页(用题目列表充当首页)为用户提供指定题目的编辑页面为用户提供提交代码判题功能&a…

FFmpeg常用API与示例(二)—— 解封装与转封装

封装层 封装格式(container format)可以看作是编码流(音频流、视频流等)数据的一层外壳,将编码后的数据存储于此封装格式的文件之内。 封装又称容器,容器的称法更为形象,所谓容器,就是存放内容的器具,饮料是内容&…

【QT学习】补充:qt使用已经存在的类

1.右键项目--》添加现有文件 注意:不是添加新文件!!! 2.添加配置

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度,还增强了用户界面的动态性和交互性,允许开发者将应用界面划分为多个独立、可重用的部分,每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

信息系统项目管理师0102:可行性研究的内容(7项目立项管理—7.2项目可行性研究—7.2.1可行性研究的内容)

点击查看专栏目录 文章目录 7.2项目可行性研究7.2.1可行性研究的内容1.技术可行性分析2.经济可行性分析3.社会效益可行性分析4.运行环境可行性分析5.其他方面的可行性分析记忆要点总结7.2项目可行性研究 可行性研究是在项目建议书被批准后,从技术、经济、社会和人员等方面的条…

OpenWrt项目UCI配置介绍

UCI(Unified Configuration Interface)是 OpenWrt 项目中使用的一种配置管理系统。它旨在为嵌入式设备提供一个统一且易于理解的配置接口。UCI 主要用于简化 OpenWrt 系统的各种配置过程,使得管理网络、服务和其他系统参数变得更加方便。 1 …

String的substring()方法导致的内存泄露问题

JDK 6的实现 String(int offset, int count, char value[]) {this.value value;this.offset offset;this.count count; }public String substring(int beginIndex, int endIndex) {//check boundaryreturn new String(offset beginIndex, endIndex - beginIndex, value);…

r语言数据分析案例-北京市气温预测分析与研究

一、选题背景 近年来,人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放,大量温室气体强烈吸收地面辐射中的红外线,造 成温室效应不断累积,使得地球温度上升,造成全球气候变暖。 气象温度的预测一直以来都是…

[算法][差分][延迟相差][leetcode]2960. 统计已测试设备

题目地址: https://leetcode.cn/problems/count-tested-devices-after-test-operations/description/ 解法一:暴力解法 class Solution {public int countTestedDevices(int[] batteryPercentages) {//特殊条件判断if(null batteryPercentages || ba…

JavaScript DOM 对元素进行的操作

DOM(Document Object Model)是一种用于访问和操作HTML和XML文档的编程接口。JavaScript通过DOM提供的方法和属性可以对网页的元素进行各种操作,比如修改元素的内容、样式、属性等。 下面是一些常见的对DOM元素的操作以及相应的代码示例&…

@RequestMapping path正则规范

RequestMapping 注解是 Spring MVC 中用于映射 HTTP 请求的注解之一。它可以用于处理各种 HTTP 请求,包括 GET、POST、PUT、DELETE 等,并且可以指定请求的路径、请求方法、请求参数等信息。 在使用 RequestMapping 注解时,可以使用正则表达式…

51单片机入门:串口通信

串行通信的初步认识 通信方式分类 1、按照数据传送方式: 并行通信:通信时数据的各个位同时传送,可以实现字节为单位的通信。 但是通信线多,占用资源多,成本高。 串行通信:一次只能发送一位&#xff0c…

python把png转成jpg

在Python中,你可以使用PIL(Python Imaging Library,也称为Pillow)库来读取PNG图片并将其转换为JPG格式。下面是一个简单的示例代码: from PIL import Image# 打开PNG图片 png_image Image.open(input.png)# 保存为JP…