目录
1. 监督学习
- 贝叶斯与朴素贝叶斯
- SVM
- 决策树
- 回归
2. 非监督学习 - KMeans聚类
- 主成分分析PCA
1. 监督学习
1.1 贝叶斯与朴素贝叶斯
1.11 贝叶斯
贝叶斯是基于对观测值概率分布的主观判断(先验概率)进行修正的定理。
先验概率是基于主观判断而非样本分布的概率分布;后验概率是根据样本分布和未知参数的先验概率分布求得的条件概率分布。
简单描述:在用概率对某个事件进行推断之前,已知该事件的概率,称为‘先验概率’,在后续研究中通过抽样等消息又得到有关该事件的其他信息,这些信息对先验概率进行修正,被称为后验概率。
两个事件A和B,A事件发生条件下B发生的概率P(B|A),和B事件发生条件下A发生的概率P(A|B)是不同的,贝叶斯法则就是对这种关系的陈述。公式
P(A且B)=P(A)P(B|A)=P(B)P(A|B),所以P(B|A)=P(B)P(A|B)/P(A)*,举例说明举例说明《吸毒者检测》
假设一个对吸毒者的常规检测结果的敏感度与可靠度均为99%,也就是说,当被检者吸毒时,每次检测呈阳性(+)的概率为99%。而被检者不吸毒时,每次检测呈阴性(-)的概率为99%。从检测结果的概率来看,检测结果是比较准确的,但是贝叶斯定理却可以揭示一个潜在的问题。假设某公司将对其全体雇员进行一次鸦片吸食情况的检测,已知0.5%的雇员吸毒。我们想知道,每位检测呈阳性的雇员,他吸毒的概率有多高?
令"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.50.10.5
P(chirs|工作、生活)=0.50.3*0.6
from sklearn import GaussianNB
clf = GaussianNB()
clf.fit(xtrain,ytrian)
pre = clf.predict(xtest)
计算分类器的准确率:
clf.score()
*补充说明朴素贝叶斯算法原理:
问:身高“高”、体重“中”,鞋码“中”,请问这个人是男还是女?
答:这里有三个属性A1=身高“高”,A2=体重“中”,A3=鞋码“中”,男女分为两种类别C1男,C2女。其实就是看在A1A2A3条件下是C1的概率大还是C2的概率大。也就是 P(C1|A1A2A3) 和 P(C2|A1A2A3) 哪个概率大?
- 在这个公式里,因为 P(A1A2A3) 都是固定的,我们想要寻找使得 P(Cj|A1A2A3) 的最大值,就等价于求 P(A1A2A3|Cj)P(Cj) 最大值。
- 我们假定 Ai 之间是相互独立的,那么: P(A1A2A3|Cj)=P(A1|Cj)P(A2|Cj)P(A3|Cj)
然后我们需要从 Ai 和 Cj 中计算出 P(Ai|Cj) 的概率,带入到上面的公式得出 P(A1A2A3|Cj),最后找到使得 P(A1A2A3|Cj) 最大的类别 Cj。 - 分别求下这些条件下的概率:
P(A1|C1)=1/2, P(A2|C1)=1/2, P(A3|C1)=1/4,P(A1|C2)=0, P(A2|C2)=1/2, P(A3|C2)=1/2,所以 P(A1A2A3|C1)=1/16, P(A1A2A3|C2)=0。
因为 P(A1A2A3|C1)P(C1)>P(A1A2A3|C2)P(C2),所以应该是 C1 类别,即男性
1.2 SVM
- 寻找两类数据之间的分割线(也就是超平面),这条线对两个分类均最大化到最近点的距离,这个距离叫做“间隔”。
- 间隔是两个分类中最近点的距离最大化,也叫做“最大间隔超平面”。稳定不会出现分类误差。
- SVM核心就是最大程度提升结果的稳定性,首先考虑分类准确性再考虑间隔最大化,可以容忍个别异常值。因此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越大对训练数据正确分类要求越高,会得到复杂的决策边界,同时容易造成过拟合。平衡光滑的决策边界和训练点分类正确。
虽然svm是基于线性分割的分类器,但是它能实现非线性问题,只需要将特征进行转换,因此需要用到核函数去转换。
- 核函数接受低维度(非线性)输入变量映射到高维度(线性)空间上,然后支持SVM的分类得到解后返回原始空间,得到非线性分割。
- SVM适用:一般来说图像分类适用于核函数=rbf,文本不适用rbf
1.3 决策树
首先决策树既适用于回归也适用于分类
可以用决策树处理多元线性回归问题,个人理解是将每个子节点看成一个线性问题,决策树有多个子节点。
决策树构造:
决策树由根节点、子节点、叶节点构成。
根节点:最顶端根部,一般是判别结果,如:是否减速
子节点:中间节点,熵会影响决策树边界,选择哪个特征会最大化信息增益
叶节点:决策的结果,适当停止分类,如果属性过多容易过拟合,过少容易欠拟合。
过拟合和欠拟合
过拟合:模型被训练的太精细化造成分支过多,把训练集中一些数据的特征看成所有特征,导致泛化能力便变差,在测试集中太过于死板,不能准确分类;还有就是因为训练集数据量较小。
泛化能力:就是分类器举一反三的能力
欠拟合:模型训练结果不理想
熵和纯度:
纯度就是目标变量的分歧最小,比如样本只有一个分类结果纯度最高,样本平均分布纯度最低。
熵就是不纯度的测量值,与纯度成负相关关系,极端情况下熵=0说明样本只有一个类别,熵=1说明样本均匀分布。熵越小数据单一性越高。
熵的公式:Entropy = −∑i(pi)log2(pi),其中pi代表类别的占比。
信息增益ID3:
信息增益=父熵-加权子熵,决策树会最大化信息增益,该方法选择哪个特征作为子节点。
举例说明:
选择温度、湿度、刮风三个特征作为子节点(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
步骤二:
分别计算三个特征的熵,温度举例,已知温度高(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(根据熵与纯度关系也可知)
步骤三:计算信息增益
信息增益=父熵-加权子熵
即:温度信息增益0.985-(4/71+2/71+1/7*0)=0.128,
同理:
湿度信息增益=0.02
刮风信息增益=0.02
天气信息增益=0.02
因此温度作为属性的信息增益最大。
步骤四:
继续根据温度判断其他特征的信息增益取最大值。
结论:因为ID3 就是要将信息增益最大的节点作为父节点 这样可以得到纯度高的决策树,所以我们将温度作为根节点。
ID3的缺点是:
(1)如果子节点A中有最大属性量,每个属性熵=0,那么它的信息增益最大
(2)不能处理连续变量
如何解决过拟合问题?
答案是:剪枝,通过主动去掉分支降低过拟合的风险
- 预剪枝:对每个节点划分前估计,若这个节点划分不能带来决策树的泛化性能提升,那么停止划分,标记为子节点。
- 后剪枝:先训练成完整的决策树,自底向上对非叶子节点评估,若该节点的子树用其叶节点能带来泛化性能提升,那么将该子树替换为叶节点。类标记为这个节点子树中最频繁的那个类
其中{1,2,3,6,7,10,14,15,16,17}为训练集,{4,5,8,9,11,12,13}为测试集
预剪枝
剪枝的目的就是为了简化决策树模型,避免过拟合
是对某节点生成前后的泛化性能做评估
-
在划分前要在训练集中选择类别标记,类别标记通常选择训练样例数较多的,这里好瓜和坏瓜各为5,那就选择好瓜作为训练标记吧。因此测试集中属于类别标记的只有4、5、8正确率为3/7=42.9%
-
根据信息增益,按照脐部进行划分。因为在训练集中脐部凹陷好瓜占比较多(3/5),脐部稍凹好瓜占比较多(2/5),脐部平坦坏瓜占多(2/5)因此
划分后,结果如下:
-
脐部划分基础下,下一个最大信息增益的特征是色泽,划分如下
划分后,结果如下:
- 接着对脐部稍凹进行特征划分,下一个信息增益最大化特征是根蒂
划分后,结果如下:
因此泛化性为71%。
由图可知,预剪枝使得很多分支没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间。但是,有些分支虽当前不能提升泛化性。甚至可能导致泛化性暂时降低,但在其基础上进行后续划分却有可能导致显著提高,因此预剪枝的这种贪心本质,给决策树带来了欠拟合的风险。
后剪枝
-
首先生成完整的树,将测试集标注在上面
-
计算准确度
因此生成的额决策树在测试集上准确率为42.9%。
-
后剪枝是从底部向上剪枝,用叶节点代替。因为对应的是训练集中7、15好坏占比相同,因此选择好瓜进行标记
划分结果如下:
因此按照底部纹理进行剪枝。 -
接着向上剪,色泽部分:由于训练集中满足这一条件的是6、7、15,好瓜多于怀挂,因此好瓜作为标记
划分结果如下:
准确率不变,因此保留。 -
然后看脐部凹陷分支,将色泽剪枝,训练集中1、2、3、14,好瓜多于坏瓜,因此选择好瓜作为标记。
划分结果如下:
因此可以减掉。
-
最后结果如下:
结论:
对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大。
信息增益率C4.5
正是因为ID3的缺点,引出了C4.5
C4.5能够自动完成连续变量离散化,有N个样本就需要离散化N-1,计算量很大,因此可以将连续变量从小到大排序,只有在决策树型变化时才将它分开;
CART决策树
使用基尼系数选取用来划分数据集的特征,使用基尼值度量数据集的纯度。
基尼系数越小纯度越高,划分的越彻底
三个特征,是否有房和婚姻状况离散型变量,收入连续性变量。
步骤一:计算每个特征的基尼系数
假设k个类别,第k个类别概率为pk,那么基尼系数为:
步骤二:对于样本D,如果特征A把样本分位D1和D2,那么在特征A条件下,基尼系数为:
-
CART建立起来的是二叉树,如果特征A有A1,A2,A3三个类别,CART会考虑把A分成{A1},{A2 ,A3}两组,或者是其他两种情况。
-
对于连续性变量,采用两变量之间均值作为分裂点
连续变量中收入=97的基尼系数最小。
步骤三:
选择基尼系数小的作为第一个特征,再根据确定下第一特征基础上选择下一个特征。
分类变量的评价指标
实际是正类预测为正类TF(第一个T代表正确与否,第二个F代表预测情况)
实际是负类预测为负类TP
实际是正类预测为负类FP
实际是负类预测为正类FP
- 准确率
准确率=预测正确的样本/总样本数=(TP+TN)/(TP+TN+FP+FN)
对于有倾向性的问题不能用准确度衡量,比如:银行好客户990人坏客户10人,模型把所有客户判断为好客户准确度99%没有任何意义。 - 精确率
精确率=正类预测为正的样本数/预测为正样本数=TP/(TP+FP) - 召回率
召回率=正类预测为正的样本数/实际为正的样本数=TP/(TP+FN)
比如银行缩减业务,尽可能抓住更多坏客,那么风控要提高召回率recall,即实际为好客也被判断为坏客;;银行扩大业务,尽可能减少好客误抓率,那么风控要提高精确率precision,即实际为坏客也被判断为好客;所以,召回率和精确率无法平衡,因此引入Fscore,利用Recall和Precision的加权调和平均值作为衡量标准。 - Fscore
F值 = 精确率 * 召回率 * 2 / ( 精确率 + 召回率) 当精确率与召回率接近时,F值最大。
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 线性回归
这里的系数wi怎么求呢?常用的是最小二乘法,即实际值与预测值之间的误差平方和最小时得出的公式。
-
线型回归评价指标
(1)R方决定系数
r方=ssr估计值与平均值误差/sst真实值与估计值之间的误差
因为sst=ssr+sse估计值与真实值之间的误差
因此r方=1-sse/sst
取值范围[0,1]越接近于1拟合越好。
(2)RMSE(平方根误差)
(3)MAE(平均绝对误差)
(4)MSE(平均平方误差)
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的问题,用于预估某件事发生的可能性。
为了实现逻辑回归,需要在每个特征上乘以一个回归系数让预测值落在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次在这里选择最优
- 簇的k值如何定?
取决于个人经验或者根据sse多多尝试判断
2.12 主成分分析PCA
降低数据维度,将大量特征缩减至几个特征
原理解释:
解释1:将n维映射到k维上,k维被称为主成分。假设有房屋面积x轴,房间数量y轴两个数据关系构成的二维散点图,通过向量-映射成1维,旋转。
解释2:主成分要选择数据集中最大(即最离散)方差那个方向,因此长轴是。因为当我们以最大方差维度进行映射时,能够保留原始数据中最多的信息第一个新坐标轴是原始数据中方差最大的,第二个新坐标轴是第一个方差最大的,以此类推。
解释3:如何找到最大方差呢?
当将二维映射至一维线上时,每个实际值与映射的新值距离代表相应的信息量。
当我们将方差最大化时,实际上是旧点与其新点之间距离最小化,将丢失信息可能性也最小化。随后我们发现,大部分方差都包含在前面k个坐标轴中,后面坐标轴几乎方差为0,我们可以忽略为0坐标实现降维处理。
解释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)
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)
- 什么情况下使用pca?
(1)希望得到隐藏特征
(2)降维
(3)PCA+SVM可以进行人脸识别
参考:
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