11.14 机器学习-朴素贝叶斯+决策树算法

news/2024/11/19 22:31:31/

# 贝叶斯底层逻辑 一个数据有可能是几种 结果 选一个概率最高的结果赋给它

# 朴素贝叶斯 假设各个特征之间全部独立 P(A*B*C*D*E)=P(A)*P(B)*P(C)*P(D)*P(E)

# A是特征向量 B是结果

# P(B|A)=P(A|B)*P(B)/P(A)

# P(A|X1,X2,X3,X4,X5)=P(X1,X2,X3,X4,X5|A)*P(A)/P(X1,X2,X3,X4,X5)

# 由于特征之间独立

# P(X1,X2,X3,X4,X5|A)=P(X1|A)*P(X2|A)*P(X3|A)*P(X4|A)*P(X5|A)*P(A)/(P(X1)*P(X2)*P(X3)*P(X4)*P(X5)) #这个式字就可以 用数据集计算出来了

# 拉普拉斯平滑系数 为了防止0概率的出现 这样即使 x2/A一个都没有也不会出现0概率的情况 这个概率要拿去乘的

# P(X2|A)= A发生的概率下x2发生的数量+1 / A发生的数量 + 有多少种X

# API

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import MultinomialNB

import joblib

import pandas as pd

from scipy.stats import mode

def naive_bayes1():

    # sklearn.naive_bayes.MultinomialNB()

    # estimator.fit(x_train, y_train)

    # y_predict = estimator.predict(x_test)

    X,y=load_iris(return_X_y=True)

    X_train,X_test,y_train,y_test=train_test_split(X,y,stratify=y,random_state=666,train_size=0.7)

    # 创建 朴素贝叶斯 预估器

    NB1=MultinomialNB()

    NB1.fit(X_train,y_train)

    score=NB1.score(X_test,y_test)

    print(score)

    # 保存模型

    # joblib.dump(NB1,"assets/model/NB_iris.pkl")

    flow1=[[5,3,2,4],[3,6,2,1],[6,2,4,2]]

    res=NB1.predict(flow1)

    print(load_iris().target_names[res])

    pass

def naive_bayes2():

    df1 = pd.read_csv("assets/csv/titanic.csv")

    x = df1[["age", "sex", "pclass"]]

    y = df1["survived"]

    # 计算 age 列的众数

    age_mode = mode(x["age"].dropna())[0]  # 使用 dropna() 去掉 NaN 值后计算众数

    # print(age_mode)

    # 用众数填充 age 列中的 NaN 值

    x["age"].fillna(age_mode, inplace=True)

    # 处理 性别字符串变为 数字

    x["sex"] = x["sex"].map({"female": 1, "male": 0}) #方式1

    # # 方式2

    # x2=x["sex"]=="female"

    # x["sex"]=x2

    # 处理 pclass字符串变为 数字

    x["pclass"] = x["pclass"].map({"1st": 1, "2nd": 2,"3rd":3})

    X_train,X_test,y_train,y_test=train_test_split(x,y,stratify=y,random_state=666,train_size=0.7)

    # 创建 朴素贝叶斯 预估器

    NB1=MultinomialNB()

    NB1.fit(X_train,y_train)

    score=NB1.score(X_test,y_test)

    print(score)

    # print(y)

if __name__=="__main__":

    # naive_bayes1()

    naive_bayes2()

    pass

# 1、决策节点

# 通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。

# 2、叶子节点

# 没有子节点的节点,表示最终的决策结果。

# 3、决策树的深度

# 所有节点的最大层次数。

# 决策树具有一定的层次结构,根节点的层次数定为0,从下面开始每一层子节点层次数增加

# 4、决策树优点:

# ​      可视化 - 可解释能力-对算力要求低

#  5、 决策树缺点:

# ​      容易产生过拟合,所以不要把深度调整太大了。

# 基于信息增益决策树的建立 根据信息增益决定先判断谁 信息增益高的先判断

# 信息增益决策树倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息,算法只能对描述属性为离散型属性的数据集构造决策树

# 信息熵描述的是不确定性。信息熵越大,不确定性越大。信息熵的值越小,则D的纯度越高。

# 算结果的信息熵 每个特征的信息增益=结果的信息熵 - 本身的信息熵

#  基于基尼指数决策树的建立(了解)

# API

# class sklearn.tree.DecisionTreeClassifier(....)

# 参数:

# criterion "gini" "entropy” 默认为="gini"

#   当criterion取值为"gini"时采用 基尼不纯度(Gini impurity)算法构造决策树

#   当criterion取值为"entropy”时采用信息增益( information gain)算法构造决策树.

# max_depth int, 默认为=None  树的最大深度

# # 可视化决策树

# function sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)

# 参数:

#   estimator决策树预估器

#   out_file生成的文档

#     feature_names节点特征属性名

# 功能:

#     把生成的文档打开,复制出内容粘贴到"http://webgraphviz.com/"中,点击"generate Graph"会生成一个树型的决策树

from sklearn.tree import DecisionTreeClassifier,export_graphviz

from sklearn.datasets import load_iris

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

def decision_tree_classifier():

    model1=DecisionTreeClassifier(criterion="entropy",max_depth=2) # criterion 构建决策树的方式 entropy 为信息增益方式 默认为gini方式 max_depth决策树的深度 默认为2

    X,y=load_iris(return_X_y=True)

    X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=0.7,random_state=666)

    sacler1=StandardScaler()

    x_stand_train=sacler1.fit_transform(X_train)

    x_stand_test=sacler1.transform(X_test)

    model1.fit(x_stand_train,y_train)

    score= model1.score(x_stand_test,y_test)

    print(score)

    # 决策树可视化

    export_graphviz(model1,feature_names=load_iris().feature_names,out_file="assets/dot/iris_tree.dot")

   



 

if __name__=="__main__":

    decision_tree_classifier()

    pass


http://www.ppmy.cn/news/1548338.html

相关文章

ue5入门教程:EventGraph

EventGraph(事件图表)是Unreal Engine 5(UE5)中蓝图系统的一个重要组成部分,它用于展示不同节点和它们之间的事件流。以下是关于UE5中EventGraph的详细教程: 一、EventGraph基础概念 事件(Eve…

leetcode_二叉树最大深度

对二叉树的理解 对递归调用的理解 对内存分配的理解 基础数据结构(C版本) - 飞书云文档 每次函数的调用 都会进行一次新的栈内存分配 所以lmax和rmax的值不会混在一起 /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

ubuntu 22.04 shell

原因:在ubuntu(18.04)默认是指向bin/dash解释器的,dash是小巧的shell(阉割版的bash),其功能远没有bash强大和丰富。上述问题就是dash不支持let和i运算等功能造成的。 ls -la /bin/sh lrwxrwxrw…

【青牛科技】D54123 漏电保护电路介绍及应用

1、具体应用: 相关产品介绍: D54123 应用框图: D54123 方案介绍: 当正常电源电流流过时,电容滤波至少保证 VS端电压为12V R1、R2可根据所用电网交流电压值来选择 C4 应大于 1μF,C2小于 1μF 必须接入 RP&…

Android OpenGLES2.0开发(八):Camera预览

严以律己,宽以待人 引言 终于到该章节了,还记得Android OpenGLES2.0开发(一):艰难的开始章节说的吗?写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时,总是CtrlC、CtrlV从来没有研究…

Vue3-02

toRef 作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。 语法:const name toRef(person,‘name’) 应用: 要将响应式对象中的某个属性单独提供给外部使用时。 扩展:toRefs与toRef功能一致,但可以批量创…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中,我们通常会将某些常见组件进行二次封装,以便更好地实现特定的业务需求。然而,在封装 Table 组件时,遇到一个问题:Table 内部暴露的方法,在封装之后的组件获取不到。 代码展示为: …

芯原科技嵌入式面试题及参考答案

Linux 相关驱动怎么写? 在 Linux 中编写驱动主要有以下步骤。 首先,需要了解设备的硬件特性。这包括设备的工作原理、寄存器地址和功能、中断号等信息。例如,对于一个简单的 GPIO 设备,要知道其数据寄存器、方向寄存器的位置以及读写操作的规则。 然后是模块的初始化部分。…