【机器学习】朴素贝叶斯 决策树 随机森林 线性回归

2024-08-23 22:36

本文主要是介绍【机器学习】朴素贝叶斯 决策树 随机森林 线性回归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机器学习分类算法

朴素贝叶斯

条件概率公式 P ( A ∣ B ) = P ( A ∩ B ) P ( B ) P(A \mid B)=\frac{P(A \cap B)}{P(B)} P(AB)=P(B)P(AB)

在B条件发生的情况下,A发生的概率。

事件 A 发生的概率定义为事件 A 发生的情况数除以所有可能情况的总数。

P(A) =(事件 A 发生的情况数)/(所有可能情况的总数 )

联合概率:事件 A 和事件 B 同时发生的概率 P(A∩B)P(AB) 可以看作是同时满足 A 和 B 的情况数除以所有可能情况的总数。

P(A∩B)=(事件 A 和 B 同时发生的情况数)/(/所有可能情况的总数)

条件概率:当我们知道事件 B 已经发生时,所有可能情况的总数就变成了事件 B 包含的所有情况数。事件 A 在事件 B 已经发生的条件下的概率可以表示为事件 A 和 B 同时发生的情况数除以事件 B 发生的情况数。

P(A∣B)=(事件 A 和 B 同时发生的情况数事件)/(B 发生的情况数)

贝叶斯公式
P ( A ∣ B ) = P ( B ∣ A ) ⋅ P ( A ) P ( B ) P(A \mid B)=\frac{P(B \mid A) \cdot P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

全概率公式

样本空间可以被分为多个完备事件组(互斥),一个事件发生的概率就是这个事件分别在这几个完备事件的条件概率下发生的概率之和

P ( B ) = ∑ i = 1 n P ( B ∣ A i ) ∗ P ( A i ) \left.P(B)=\sum_{i=1}^{n} P(B|A_{i}\right) *P{(A_i)} P(B)=i=1nP(BAi)P(Ai)

在n个分类中,有众多的 f 特征。

可以由训练数据得到样本数据的每个分类的概率 P ( c i ) P(c_i) P(ci)

在每个特征中,类别的条件概率 P ( C i ∣ f i ) P(C_i|f_i) P(Cifi)

每个特征的概率 P ( f i ) P(f_i) P(fi)

根据贝叶斯公式可以求,在指定特征条件下,预测样本是哪一种类别的概率,通过比较概率大小,得到分类的目的

P ( c i ∣ f i ) = ( P ( f i ∣ c i ) ∗ P ( c i ) ) / P ( f i ) P(c_i|f_i)=(P(f_i|c_i)*P(c_i))/P(f_i) P(cifi)=(P(fici)P(ci))/P(fi)

其中 P ( f i ∣ c i ) P(f_i|c_i) P(fici)是在指定的类别下,某个特征发生的概率,之后累乘,因为特征是同时发生在一个样本上

由于比较相同的特征集合下的不同分类的概率,所以上式中分母相同,只用比较分子大小

sklearn.naive_bayes.MultinomialNB

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_splitx,y = fetch_20newsgroups(return_X_y=True)
counter = CountVectorizer() # 文本特征提取
x = counter.fit_transform(x)train_x,test_x,train_y,test_y = train_test_split(x,y,test_size = 0.3,random_state=1,shuffle=True)model = MultinomialNB() # 贝叶斯分类器
model.fit(train_x,train_y)
model.score(test_x,test_y)

决策树

通过训练数据,构建一棵根据样本特征分类的树。

根据样本特征的差异,界定范围,就像程序分支一样控制决定的流动,最后到达树的叶节点,输出类别的判断

一些特征可以对样本进行很好的区分,这些特征决定了样本类别的不同。

使用信息增益建立决策树

信息熵,数据的混乱程度

H ( D ) = − ∑ k = 1 N p k log ⁡ 2 p k H(D)=-\sum_{k=1}^{N} p_{k} \log _{2} p_{k} H(D)=k=1Npklog2pk

P k P_k Pk是类别在样本中的概率,N是样本中的类别数量

信息增益

I G ( A ) = H ( D ) − H ( D ∣ A ) I G(A)=H(D)-H(D \mid A) IG(A)=H(D)H(DA)

H(D)是样本的信息熵

H(D|A) 是样本在根据A特征区分下的加权信息熵

通过信息增益确定特征判断的先后。信息增益描述了特征区分样本的能力。信息熵越大,根据这个特征区分

通过比较每个特征的信息增益,确定判断特征的顺序

之后对特征中的进行信息增益的判断,确定特征的边界

sklearn.tree.DecisionTreeClassifier

from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_splitcancer = load_breast_cancer()x,y = cancer.data,cancer.target
scaler = StandardScaler()
x = scaler.fit_transform(x)train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3,random_state=1)model = DecisionTreeClassifier(criterion = 'gini')
model.fit(train_x,train_y)
acc = model.score(test_x,test_y)
print(acc)

集成学习方法随机森林分类器

通过多个模型进行的组合,实现一个效果更好的模型

随机森林就是有多个决策树分类器组合形成的模型

对数据集进行有放回的随机抽取,形成新的数据集

用新的数据集对决策树进行训练,每一个新的数据集训练一个决策树,训练时输入的样本特征也是随机抽取小于总样本特征数量的特征

最后根据多个决策树的结果的投票数,预测哪个分类的多,就把这个分类作为森林的结果

sklearn.ensemble.RandomForestClassfier

n_estimators 森林中的决策树数量 默认100

criterion 构建决策树的方法 gini 基尼系数 entropy 信息增益

max_depth 决策树的最大深度

from sklearn .ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_covtypedata = fetch_covtype()scaler = StandardScaler()  # 标准化
x = scaler.fit_transform(x)x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=1)  # 划分数据集model = RandomForestClassifier(n_estimators = 200, max_depth= 7)  # 创建决策树分类器
model.fit(x_train,y_train)model.score(x_test,y_test)# 0.7048182921267093

线性回归——最小二分法

参考了这篇博文一文让你彻底搞懂最小二乘法(超详细推导)-CSDN博客

回归,就是预测连续的值,分类是预测类别,分类输出的是指定的几个值,而回归是预测连续的值,比如某种物理量的值大小。

线性回归,简单的理解就是通过一些权重,乘以对应的样本特征,加上偏置,得到回归的预测值。

而回归的目的,就是找到最佳的权重和偏置,使得预测值和真实值的差距最小。

如对于一维的线性回归 y = w x + b y=wx+b y=wx+b 通过对样本特征x的输入,调整w和b的值,直到通过函数的输入得到的预测值和真实值差距最小,就可以通过对x的输入预测y的值。

  • 损失函数
    • 通过定义损失函数,评估w和b的好坏。可以理解为损失函数的大小,就是预测的y和真实的y的差异,损失值,就是差距的值,这个值越小,说明差距越小,模型性能越好,y预测越接近真实值。
    • 损失函数的定义,不同的模型有着不同的损失函数。线性回归中,通过预测值和真实值的差异,定义其损失函数。一组x的输入,对应了一个y的预测值输出,也对应了一个y的真实值,每一个样本的差值的平方,在求和,就得到了样本的预测的损失值。收到样本数量的影响,所以除以样本数。这就是均方差损失函数
    • 损失函数,这里设偏置b为0
    • e ˉ = 1 n ∑ i = 1 n x i 2 w 2 − 2 n ∑ i = 1 n x i y i w + 1 n ∑ i = 1 n y i 2 \bar e={\frac{1}{n}}\sum_{i=1}^{n}x_{i}^{2}w^{2}-{\frac{2}{n}}\sum_{i=1}^{n} x_{i}y_{i}w+{\frac{1}{n}}\sum_{i=1}^{n} y_{i}^{2} eˉ=n1i=1nxi2w2n2i=1nxiyiw+n1i=1nyi2

通过对样本的输入得到了关于w的损失函数,通过确定损失函数的最小值,就确定了最优的w,最小值处的w就是回归所求的最优w

这里是关于w的二次方程,通过导数等于零,可以得到损失函数的最小值

  • 矩阵求解

当输入的样本有多个特征时,每个特征的权重w应该不同,所以w也就变成了权重矩阵,x是样本的特征矩阵。

预测的函数(假设偏置b为0)
h = ∑ i n ( w i x i ) 也就是 h = X W h = \sum_i^n(w_ix_i)也就是h=XW h=in(wixi)也就是h=XW
损失函数
l o s s = ∣ ∣ h − y ∣ ∣ 2 loss = ||h-y||^2 loss=∣∣hy2
这里的 ∣ ∣ . ∣ ∣ 2 ||.||^2 ∣∣.∣2是欧几里得范数的平方,也就是矩阵中每个元素的平方和,这里是求每个预测值和真实值的差的平方和

展开
∣ ∣ X W − Y ∣ ∣ 2 = ( X W − Y ) T ( X W − Y ) ||XW-Y||^2 = (XW-Y)^T(XW-Y) ∣∣XWY2=(XWY)T(XWY)

对损失函数求导,导函数等于0时,就是损失函数的最小值

对矩阵求导,使得导函数等于0,可以得出
W = ( X T X ) − 1 X T Y W = (X^TX)^{-1}X^TY W=(XTX)1XTY

  • 链式求导(复合函数求导)

损失函数 l o s s = 1 n ( X W − y ) 2 loss = \frac{1}{n} (XW-y)^2 loss=n1(XWy)2

因为n是一个常数,并不会对求导的结果产生影响,这里定为2,求导可以简化计算

l o s s = 1 2 ( X W − y ) 2 loss=\frac{1}{2}(XW-y)^2 loss=21(XWy)2

l o s s = 1 2 u loss=\frac{1}{2}u loss=21u

u = X W − y u = XW-y u=XWy

u求导使用到矩阵的求导

KaTeX parse error: {equation} can be used only in display mode.

分别求导,在相乘得到

( X W − y ) X T (XW-y)X^T (XWy)XT

令表达式等于0,求出W

W = ( X T X ) − 1 X T Y W = (X^TX)^{-1}X^TY W=(XTX)1XTY

  • 机器学习API

sklearn.linear_model.LinearRegression

fit_intercept 是否计算偏置

模型属性

coef_ 权重

intercept_ 偏置

import numpy as np
from sklearn.linear_model import LinearRegressiondata=np.array([[0,14,8,0,5,-2,9,-3,399],[-4,10,6,4,-14,-2,-14,8,-144],[-1,-6,5,-12,3,-3,2,-2,30],[5,-2,3,10,5,11,4,-8,126],[-15,-15,-8,-15,7,-4,-12,2,-395],[11,-10,-2,4,3,-9,-6,7,-87],[-14,0,4,-3,5,10,13,7,422],[-3,-7,-2,-8,0,-6,-5,-9,-309]])model = LinearRegression(fit_intercept=False)
model.fit(data[:,:-1],data[:,-1])
print(model.coef_)
print(' ')
print(model.intercept_)
print(model.predict([[-3,-7,-2,-8,0,-6,-5,-9]]))'''
[ 0.4243965   7.32281732 15.05217218  3.5996297  12.05805264  1.7697295917.0276393  11.31212591]
0.0
[-309.]
'''

这篇关于【机器学习】朴素贝叶斯 决策树 随机森林 线性回归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100687

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组