常用机器学习算法入门(小白适用)

2020-04-28  本文已影响0人  茶小美

目录
1. 监督学习


1. 监督学习

1.1 贝叶斯与朴素贝叶斯
1.11 贝叶斯

贝叶斯是基于对观测值概率分布的主观判断(先验概率)进行修正的定理。
先验概率是基于主观判断而非样本分布的概率分布;后验概率是根据样本分布和未知参数的先验概率分布求得的条件概率分布。

令"A"为雇员吸毒事件,"C"为雇员不吸毒事件,"B"为检测呈阳性事件。则:
已知P(A)=0.5%
已知P(B|A)=99%
已知P(非B|C)=99%
求P(A|B)?
步骤一:
已知P(A)=0.5%,则P(C)=99.5%
已知P(B|A)=99%,则P(非B|A)=1%,
已知P(非B|C)=99%,则P(B|C)=1%
步骤二:
求P(A|B)即B发生下A的概率,先求P(B)发生的概率,P(B)=不管是否吸毒检查结果为阳性的概率,所以
P(B) = 阳性吸毒+阳性不吸毒=P(B|A)P(A)+P(B|C)P(C)=99%0.5%+1%99.5%=1.49%
步骤三:
因此P(A|B)=P(B|A)*P(A)/P(B)=33.22%——贝叶斯公式
结论:如果某人检测呈阳性,那么此人是吸毒的概率只有大约33%,也就是说此人不吸毒的可能性比较大。我们测试的条件(本例中指A,即雇员吸毒)越难发生,发生误判的可能性越大。

这里的P(A)=0.5%为先验概率,P(B|A)=99%和P(非B|C)=99%为条件概率;P(A|B)=1.49%为后验概率

1.12朴素贝叶斯

贝叶斯是A发生条件下B发生的概率,那么朴素贝叶斯就是AB两个事件独立,发生概率直接P(A)P(B)即可,即不考虑出现的顺序。
举例说明:
比如sara发邮件文本包括爱0.4、生活0.5、工作0.1,chirs文本包括爱0.1、生活0.3、工作0.6,先验概率sara和chirs发邮件概率均为0.5。那么:
P(sara|工作、生活)=0.5
0.10.5
P(chirs|工作、生活)=0.5
0.3*0.6

from sklearn import GaussianNB
clf = GaussianNB()
clf.fit(xtrain,ytrian)
pre = clf.predict(xtest)
计算分类器的准确率:
clf.score()

*补充说明朴素贝叶斯算法原理:


image.png

问:身高“高”、体重“中”,鞋码“中”,请问这个人是男还是女?
答:这里有三个属性A1=身高“高”,A2=体重“中”,A3=鞋码“中”,男女分为两种类别C1男,C2女。其实就是看在A1A2A3条件下是C1的概率大还是C2的概率大。也就是 P(C1|A1A2A3) 和 P(C2|A1A2A3) 哪个概率大?


image.png
1.2 SVM
from sklearn import svm
clf = svm.SVC(kernel='linear线性函数''rbf径向基函数-不规则曲线',c,gamma)
#kernel核函数,c对误差的容忍度,gamma映射到新空间的分布。这三个参数能过避免过拟合
clf.fit(x_train,y_train)
pre=clf.predict(x_test)

c是惩罚系数,c越大对训练数据正确分类要求越高,会得到复杂的决策边界,同时容易造成过拟合。平衡光滑的决策边界和训练点分类正确。

image.png
虽然svm是基于线性分割的分类器,但是它能实现非线性问题,只需要将特征进行转换,因此需要用到核函数去转换。
1.3 决策树

首先决策树既适用于回归也适用于分类
可以用决策树处理多元线性回归问题,个人理解是将每个子节点看成一个线性问题,决策树有多个子节点。

决策树构造:

决策树由根节点、子节点、叶节点构成。
根节点:最顶端根部,一般是判别结果,如:是否减速
子节点:中间节点,熵会影响决策树边界,选择哪个特征会最大化信息增益
叶节点:决策的结果,适当停止分类,如果属性过多容易过拟合,过少容易欠拟合。


image.png
过拟合和欠拟合

过拟合:模型被训练的太精细化造成分支过多,把训练集中一些数据的特征看成所有特征,导致泛化能力便变差,在测试集中太过于死板,不能准确分类;还有就是因为训练集数据量较小。
泛化能力:就是分类器举一反三的能力
欠拟合:模型训练结果不理想

熵和纯度:

纯度就是目标变量的分歧最小,比如样本只有一个分类结果纯度最高,样本平均分布纯度最低。
熵就是不纯度的测量值,与纯度成负相关关系,极端情况下熵=0说明样本只有一个类别,熵=1说明样本均匀分布。熵越小数据单一性越高。
熵的公式:Entropy = −∑i​(pi​)log2​(pi​),其中pi代表类别的占比。

信息增益ID3:

信息增益=父熵-加权子熵,决策树会最大化信息增益,该方法选择哪个特征作为子节点。
举例说明:


image.png

选择温度、湿度、刮风三个特征作为子节点(python实现)
步骤一:
首先计算父熵:
已知根节点7个值3个是4个否

import math
re1 = -4/7*(math.log(4/7,2))
re2 = -3/7*(math.log(3/7,2))
re1+re2=0.985
image.png

步骤二:
分别计算三个特征的熵,温度举例,已知温度高(2是2否)、温度中(1是1否)、温度低(1否)

import math
re1 = -1/2*(math.log(1/2,2))
re2 = -1/2*(math.log(1/2,2))
re1+re2=1-温度高

import math
re1 = -1/2*(math.log(1/2,2))
re2 = -1/2*(math.log(1/2,2))
re1+re2=1-温度中

因此温度高熵=1,温度中熵=1,温度低熵=0(根据熵与纯度关系也可知)


image.png

步骤三:计算信息增益
信息增益=父熵-加权子熵
即:温度信息增益0.985-(4/71+2/71+1/7*0)=0.128,
同理:
湿度信息增益=0.02
刮风信息增益=0.02
天气信息增益=0.02
因此温度作为属性的信息增益最大。

image.png

步骤四:
继续根据温度判断其他特征的信息增益取最大值。

结论:因为ID3 就是要将信息增益最大的节点作为父节点 这样可以得到纯度高的决策树,所以我们将温度作为根节点。
ID3的缺点是:
(1)如果子节点A中有最大属性量,每个属性熵=0,那么它的信息增益最大
(2)不能处理连续变量

如何解决过拟合问题?

答案是:剪枝,通过主动去掉分支降低过拟合的风险

预剪枝

剪枝的目的就是为了简化决策树模型,避免过拟合
是对某节点生成前后的泛化性能做评估

后剪枝

划分结果如下:


image.png

因此可以减掉。

结论:

对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大

信息增益率C4.5

正是因为ID3的缺点,引出了C4.5


image.png
image.png

C4.5能够自动完成连续变量离散化,有N个样本就需要离散化N-1,计算量很大,因此可以将连续变量从小到大排序,只有在决策树型变化时才将它分开;

CART决策树

使用基尼系数选取用来划分数据集的特征,使用基尼值度量数据集的纯度。
基尼系数越小纯度越高,划分的越彻底

image.png
三个特征,是否有房和婚姻状况离散型变量,收入连续性变量。
步骤一:计算每个特征的基尼系数
假设k个类别,第k个类别概率为pk,那么基尼系数为:
image.png
image.png
image.png

步骤二:对于样本D,如果特征A把样本分位D1和D2,那么在特征A条件下,基尼系数为:


image.png
image.png

分类变量的评价指标

实际是正类预测为正类TF(第一个T代表正确与否,第二个F代表预测情况)
实际是负类预测为负类TP
实际是正类预测为负类FP
实际是负类预测为正类FP


image.png
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,recall_score
print(accuracy_score(ytest,y_pre))#准确率
print(precision_score(ytest,y_pre))#精确率
print(recall_score(ytest,y_pre))#召回率
print(confusion_matrix(ytest,y_pre))#得到的矩阵,横向是实际值,纵向是预测值
1.4 回归

回归通俗解释:包括两个以上的自变量,且自变量与因变量是线性关系。对其进行训练模型,得到的结果是连续型变量就是线型回归,结果是离散变量就是分类。回归用于预测。

1.41 线性回归
image.png
这里的系数wi怎么求呢?常用的是最小二乘法,即实际值与预测值之间的误差平方和最小时得出的公式。

(3)MAE(平均绝对误差)


image.png

(4)MSE(平均平方误差)


image.png
from sklearn import linear_model
clf = linear_model.LinearRegression()
lcf.fit(x_train,y_train)
clf.coef_斜率
clf.intercept_截距
reg=clf.predict([x_test])注意这里需要列表格式
reg.score(x_test,y_test)r方,如果过拟合测试集的r方较小
reg.score(x_train,y_train)

from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
from sklearn.metrics import r2_score#R square
#调用
mean_squared_error(y_test,y_predict)
mean_absolute_error(y_test,y_predict)
r2_score(y_test,y_predict)
1.42 逻辑回归

逻辑回归主要解决二分类0or1的问题,用于预估某件事发生的可能性。


sigmond函数.png

为了实现逻辑回归,需要在每个特征上乘以一个回归系数让预测值落在simgmond函数上,大于0.5算为1,小于0,5算为0。

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(x_train,y_trian)
pre = model.predict(x_test)
accuracy_score(y_test, pre)计算准确率

2. 非监督学习

2.1 KMeans聚类

步骤一:人为定义分多少簇K
步骤二:分配
将K个簇随机扔进数据集中
步骤三:优化
自由移动簇,标准簇就是与点的最短距离
步骤四:
重复二三步,直到簇不再变化位置

from sklearn.cluster import KMeans
kmeans=KMeans(n_cluster=8)
kmeans.fit(x_train)
kmeans.labels_#聚类的结果
pre = kmeans.predict(x_test)
KMeans(n_cluster=8,max_iter=300,n_init=10)n_cluster必须定义簇数量,max_iter算法迭代的次数,n_init初始化的数量,跑10次在这里选择最优
2.12 主成分分析PCA

降低数据维度,将大量特征缩减至几个特征
原理解释:
解释1:将n维映射到k维上,k维被称为主成分。假设有房屋面积x轴,房间数量y轴两个数据关系构成的二维散点图,通过向量-映射成1维,旋转。

image.png
解释2:主成分要选择数据集中最大(即最离散)方差那个方向,因此长轴是。因为当我们以最大方差维度进行映射时,能够保留原始数据中最多的信息第一个新坐标轴是原始数据中方差最大的,第二个新坐标轴是第一个方差最大的,以此类推。
image.png
解释3:如何找到最大方差呢?
当将二维映射至一维线上时,每个实际值与映射的新值距离代表相应的信息量。
当我们将方差最大化时,实际上是旧点与其新点之间距离最小化,将丢失信息可能性也最小化。随后我们发现,大部分方差都包含在前面k个坐标轴中,后面坐标轴几乎方差为0,我们可以忽略为0坐标实现降维处理。
image.png
解释4:
将希望所有特征放在PCA中,PCA可以自动组合成新特征并对新特征能力等级划分,

PCA定义:将输入特征转化为其主成分的系统化方式。然后将其用作回归或分类模型中新特征。在所有特征数据中,会使方差最大化将映射时丢失信息可能性降至最低,然后对主成分进行等级划分。数据因特定主成分产生的方差越大,该主成分级别越高,因此产生方差最大的主成分为第一个主成分。注意:主成分之间独立不重叠。主成分等于输入特征的数量。

from sklearn.decomposition import PCA
pca = PCA(n_components=2)#PCA(n_components=0.9)#小数, 保证降维后的数据保持90%的信息
pca.fit(data)
pca.explained_varience_radio#方差比,如第一个主成分占比91%,第二个占比9%PCA(n_components=0.9)# 保证降维后的数据保持90%的信息
first_pca=PCA.components_[0]
sceond_pca=PCA.components_[1]
#成分是一个列表,包含所要求的主成分。
transfor_pca = pca.transform(data)
image.png
image.png
s = pca.explained_variance_
df = pd.DataFrame({'z':s,
                  'z_sum':s.cumsum()/s.sum()})
df['z_sum'].plot(linestyle = '--',marker = 'o')
plt.axhline(0.85)

参考:

https://www.cnblogs.com/favor-dfn/p/12076601.htmlID3
https://www.cnblogs.com/wangleBlogs/p/11131505.htmlC4.5
https://blog.csdn.net/zfan520/article/details/82454814决策树剪枝问题
https://www.cnblogs.com/gispathfinder/p/5770217.html

上一篇 下一篇

猜你喜欢

热点阅读