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

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

朴素贝叶斯 假设各个特征之间全部独立 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

相关推荐
海棠AI实验室2 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
XH华2 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_3 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
IT古董3 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
落魄君子3 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡3 小时前
滑动窗口 + 算法复习
数据结构·算法
睡觉狂魔er3 小时前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶
Lenyiin3 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码3 小时前
Cmd命令大全(万字详细版)
python·算法·小程序