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

机器学习分类算法

朴素贝叶斯

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

在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(A∣B)=P(B)P(B∣A)⋅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(B∣Ai)∗P(Ai)

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

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

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

每个特征的概率 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(ci∣fi)=(P(fi∣ci)∗P(ci))/P(fi)

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

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

sklearn.naive_bayes.MultinomialNB

python 复制代码
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_split

x,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(D∣A)

H(D)是样本的信息熵

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

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

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

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

sklearn.tree.DecisionTreeClassifier

python 复制代码
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

cancer = 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 决策树的最大深度

python 复制代码
from sklearn .ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_covtype

data = 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ˉ=n1∑i=1nxi2w2−n2∑i=1nxiyiw+n1∑i=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=i∑n(wixi)也就是h=XW

损失函数
l o s s = ∣ ∣ h − y ∣ ∣ 2 loss = ||h-y||^2 loss=∣∣h−y∣∣2

这里的 ∣ ∣ . ∣ ∣ 2 ||.||^2 ∣∣.∣∣2是欧几里得范数的平方,也就是矩阵中每个元素的平方和,这里是求每个预测值和真实值的差的平方和

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

对损失函数求导,导函数等于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(XW−y)2

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

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

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

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

u求导使用到矩阵的求导

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

分别求导,在相乘得到

( X W − y ) X T (XW-y)X^T (XW−y)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_ 偏置

python 复制代码
import numpy as np
from sklearn.linear_model import LinearRegression

data=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.76972959
 17.0276393  11.31212591]
0.0
[-309.]
'''
相关推荐
古希腊掌管学习的神2 小时前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
海棠AI实验室4 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
IT古董5 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
睡觉狂魔er5 小时前
自动驾驶控制与规划——Project 3: LQR车辆横向控制
人工智能·机器学习·自动驾驶
scan7245 小时前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活6 小时前
理解支持向量机
算法·机器学习·支持向量机
爱喝热水的呀哈喽6 小时前
《机器学习》支持向量机
人工智能·决策树·机器学习
大山同学6 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习
苏言の狗6 小时前
Pytorch中关于Tensor的操作
人工智能·pytorch·python·深度学习·机器学习
bastgia7 小时前
Tokenformer: 下一代Transformer架构
人工智能·机器学习·llm