机器学习入门到放弃2:朴素贝叶斯

news2024/11/15 12:15:34

1. 算法介绍

1.1 算法定义

  朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入x求出使得后验概率最大的输出y。

1.2 算法逻辑

对于算法的公式,不做过多的推导演算,此处希望以数据案例来做相应的解释。

首先,展示一下虚拟的数据结构:

此处使用流动性,动量,市值和贝塔四个层面的因子作为数据的属性特征,操作列做为分类特征,作为演示的案例数据。

目标是,测算流动性低,动量弱,市值大,贝塔高的标的对应的操作分类,也就是买入还是卖出。为此,以下分别展示了每一个分类下,对应的出现概率:

举例说明:特征为流动性低,方向为买入的概率计算方式为:首先筛选方向为买入的数据,对应有6条;其次在对应6条的数据中筛选流动性为低的数据,对应为2条。因此,对应的概率,2/6=0.33,依次类推,计算出其他分类和特征下对应的概率。

基于训练数据的统计,流动性低,动量弱,市值大,贝塔高的标的对应买入的联合概率(每种情况出现的概率的累乘)为:0.33*0.33*0.33*0.67 = 0.025,以此类推,对应卖出的联合概率为0.003,因为买入的联合概率大于卖出的联合概率,因此流动性低,动量弱,市值大,贝塔高的标的对应的操作分类为买入。案例对应的代码如下:

import pandas as pd
data_dict = {
    '流动性': {0: '低', 1: '中', 2: '高', 3: '低', 4: '中', 5: '高', 6: '低', 7: '中', 8: '高', 9: '低', 10: '中',
               11: '高'},
    '动量': {0: '强', 1: '弱', 2: '弱', 3: '强', 4: '强', 5: '弱', 6: '弱 ', 7: '强', 8: '弱 ', 9: '强', 10: '强',
             11: '强'},
    '市值': {0: '大', 1: '中', 2: '小', 3: '大', 4: '中', 5: '小', 6: '大', 7: '中', 8: '小', 9: '大', 10: '中',
             11: '小'},
    '贝塔': {0: '高', 1: '低', 2: '低', 3: '高', 4: '低', 5: '高', 6: '高', 7: '低', 8: '高', 9: '低', 10: '低',
             11: '低'},
    '操作': {0: '买入', 1: '卖出', 2: '买入', 3: '买入', 4: '卖出', 5: '买入', 6: '卖出', 7: '卖出', 8: '买入',
             9: '卖出', 10: '卖出', 11: '买入'}}
data = pd.DataFrame(data_dict)


def get_dir_data(dir, case):
    # 获取不同结果下,对应特征出现的概率
    data_list = []
    for key in case.keys():
        value = case.get(key)
        print(key, value)
        one_data = data.loc[data['操作'] == dir]
        goal_data = one_data.loc[one_data[key] == value]
        print(goal_data)
        out_dict = {'方向': dir, '特征': key + value, '概率': round(len(goal_data) / len(one_data), 4)}
        data_list.append(out_dict)
    return pd.DataFrame(x for x in data_list)


def jiont(value):
    # 计算对应的联合概率
    out = 1
    for a in value:
        out = out * a
    return out


# 对算法进行相应的介绍
case = {'流动性': '低', '动量': '弱', '市值': '大', '贝塔': '高'}
buy, sell = '买入', '卖出'
buy_data = get_dir_data(buy, case)
sell_data = get_dir_data(sell, case)
buy_rate = jiont(buy_data['概率'])
sell_rate = jiont(sell_data['概率'])

1.3 算法函数 

使用sklearn对应的MultinomialNB()函数,由于某一特征属性下对应的分类概率可能为0,进而对整体的联合概率产生影响,因此,考虑在计算概率的时候使用拉普拉斯平滑,对应参数为alpha。

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB(alpha=1)

1.4 算法评价

朴素贝叶斯算法常用于新闻,电影以及邮件的标签分类,其主要有以下三个优点:

1. 稳定的分类效率

2. 算法比较简单,数据缺失对算法的影响较低

3. 分类的准确度高,速度比较快

尽管朴素贝叶斯的分类功能非常强大,但是其也有一个比较致命的缺点:要求各个属性特征之间均为独立,在实际的数据中非常难满足。如果数据的属性特征存在一定的交集,对分类结果准确度的影响会非常大。

2.算法实例

还是以算法逻辑对应的数据源data为例。

首选,对数据进行相应的特征提取与转换,sklearn有相应的函数(本文的数据没有找到合适的转换),因此使用自定义的函数来进行转换。

def value_transform(one_col):
    # 将原始数据单列的数据按照分类进行转换
    values_list = one_col.drop_duplicates().tolist()
    num_list = [x for x in range(len(values_list))]
    transform_dict = {}
    for x in range(len(values_list)):
        transform_dict[values_list[x]] = num_list[x]
    transform_list = [transform_dict.get(x) for x in one_col]
    return transform_list


def data_transform(data_set):
    # 对原始数据进行相应的转换
    col_list = data_set.columns
    new_data = pd.DataFrame()
    for col_name in col_list:
        new_data[col_name] = value_transform(data_set[col_name])
    return new_data

# 特征提取与转换
new_data = data_transform(data)

对应的结果为:

 然后选择需要的特征数据,并进行训练数据和检验数据的分割:

# 选择需要的特征数据,并切割训练数据和检验数据
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
x = new_data.loc[:, ['流动性', '动量', '市值', '贝塔']]
y = new_data['操作']
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.8, random_state=len(data))

建模,导入数据进行训练,然后进行相应的预测,并对预测结果和实际结果进行打分比较:

# 模型预测
model = MultinomialNB(alpha=1)
model.fit(X_train, y_train)
predictions = model.predict(X_test)

# 模型评价
score_value = round(model.score(X_test, y_test), 4)

对应score_value的值为0.4。说明整体的预测效果并不好,毕竟数据是虚拟的。当然,即使是真实的数据,想要得到一个比较好的结果也是比较苦难的。本文重点是介绍算法的逻辑和运用步骤,对于参数优化以及模型迭代,笔者力之所不能及。

本期分享到此结束,有何问题欢迎随时沟通!

 

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

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

相关文章

oracle 数据库与服务、实例与SID、表空间、用户与表模式

一、数据库与数据库服务: 概念:就是一个数据库的标识,在安装时就要想好,以后一般不修改,修改起来也麻烦,因为数据库一旦安装,数据库名就写进了控制文件,数据库表,很多地方都会用到这个数据库名。是数据库系统的入口,它会内置一些高级权限的用户如SYS,SYSTEM等。我们…

Xilinx 千兆以太网TEMAC IP核 MDIO 配置及物理接口

基于AXI4-Lite接口可以访问MDIO(Management Data Input/Output)接口,而MDIO接口连接MAC外部的PHY芯片,用户可通过AXI4-Lite接口实现对PHY芯片的配置。 1 MDIO接口简介 开放系统互连模型OSI的最低两层分别是数据链路层和物理层,数据链路层的…

探讨欧盟就人工智能监管达成协议

《人工智能法案》是一项具有里程碑意义的立法,它可以创造一个有利的环境,在这种环境中,人工智能的使用将成为一种更优秀的安全和信任的工具,确保整个欧盟的公共和私人机构利益相关者的参与。 历时3天的“马拉松式”谈判圆满结束&…

数据可视化训练第四天(模拟投掷筛子并且统计频次)

投掷一个筛子 import matplotlib.pyplot as plt from random import randint import numpy as npclass Die:"""模拟投掷筛子"""def __init__(self,num_sides6):self.num_sidesnum_sidesdef roll(self):return randint(1,self.num_sides)num1000…

vi\vim编辑器

root用户(超级管理员) 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中,拥有最大权限的账户名为:root(超级管理员) root用户拥有最大的系统操作权限,而普通…

论文盲审吐槽多,谁给盲审不负责的老师买单?如何看待浙江大学「一刀切」的研究生学位论文双盲评审制度?

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

二维数组 和 变长数组

在上一期的内容中,为诸君讲解到了一维数组,在一维数组的基础上,C语言中还有着多维数组,其中,比较典型且运用较为广泛的就是我们今天的主角——二维数组 一 . 二维数组的概念 我们把单个或者多个元素组成的数组定义为一…

DI-engine强化学习入门(七)如何自定义神经网络模型

在强化学习中,需要根据决策问题和策略选择合适的神经网络。DI-engine中,神经网络模型可以通过两种方式指定: 使用配置文件中的cfg.policy.model自动生成默认模型。这种方式下,可以在配置文件中指定神经网络的类型(MLP、CNN等)以及超参数(隐层大小、激活函数等),DI-engine会根据…

【漏洞复现】泛微OA E-Cology XmlRpcServlet文件读取漏洞

漏洞描述: 泛微OA E-Cology是一款面向中大型组织的数字化办公产品,它基于全新的设计理念和管理思想,旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology XmlRpcServlet存在任意文件读取漏洞,允许未经授权的用户读…

三星硬盘格式化后怎么恢复数据

在数字化时代,硬盘作为数据存储的核心部件,承载着我们的重要文件、照片、视频等资料。然而,不慎的格式化操作可能使我们失去宝贵的数据。面对这样的困境,许多用户可能会感到无助和焦虑。本文旨在为三星硬盘用户提供格式化后的数据…

计算机网络实验2:路由器常用协议配置

实验目的和要求 掌握路由器基本配置原理理解路由器路由算法原理理解路由器路由配置方法实验项目内容 路由器的基本配置 路由器单臂路由配置 路由器静态路由配置 路由器RIP动态路由配置 路由器OSPF动态路由配置实验环境 1. 硬件:PC机; 2. 软…

金三银四面试题(二十六):责任链模式知多少?

什么是责任链模式 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在通过将请求的处理分布在一系列对象上,从而使得多个对象可以尝试处理同一个请求。这些对象被链接成一条链,每个对象都可以对请…

stm32——OLED篇

技术笔记! 一、OLED显示屏介绍(了解) 1. OLED显示屏简介 二、OLED驱动原理(熟悉) 1. 驱动OLED驱动芯片的步骤 2. SSD1306工作时序 三、OLED驱动芯片简介(掌握) 1. 常用SSD1306指令 2. …

专业130+总分400+哈尔滨工程大学810信号与系统考研哈工程水声电子信息通信工程,真题,大纲,参考书。

毕业设计刚搞完,总结一下去年考研的复习经历,希望对大家复习有帮助,考研专业课810信号与系统130总分400,如愿上岸哈工程水声。专业课:130 哈工程水声院810专业课信号与系统难度适中,目前数一难度很高&…

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter) 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

TCP三次握手四次挥手 UDP

TCP是面向链接的协议,而UDP是无连接的协议 TCP的三次握手 三次传输过程是纯粹的不涉及数据,三次握手的几个数据包中不包含数据内容。它的应用层,数据部分是空的,只是TCP实现会话建立,点到点的连接 TCP的四次挥手 第四…

JVM堆内存分析

jmap工具查看堆内存 jmap:全称JVM Memory Map 是一个可以输出所有内存中对象的工具,可以将JVM中的heap(堆),以二进制输出成文本,打印出Java进程对应的内存 找到pid jmap -heap 19792 Attaching to process ID 19792…

贪心算法-----柠檬水找零

今日题目:leetcode860 题目链接:点击跳转题目 分析: 顾客只会给三种面值:5、10、20,先分类讨论 当收到5美元时:不用找零,面值5张数1当收到10美元时:找零5美元,面值5张数…

bevformer详解(1):论文介绍

3D 视觉感知任务,包括基于多摄像头的3D检测和地图分割对于自动驾驶系统至关重要。本文提出了一种名为BEVFormer的新框架,它通过使用空间和时间的Transformer 学习统一的BEV表示来支持多个自动驾驶感知任务。简而言之,BEVFormer通过预定义的网格形式的Bev Query与空间和时间空…

icap对flash的在线升级

文章目录 一、icap原语介绍(针对 S6 系列的 ICap),之后可以拓展到A7、K7当中去二、程序1设计2.1信号结构框图2.2 icap_delay设计2.3 icap_ctrl设计(可以当模板使用,之后修改关键参数即可) 三、程序2设计四、…