1、 常用数据挖掘算法总结及 Python 实现 V1.0 By Xuejun Yang 2016.09.18 目录 第一部分 数据挖掘与机器学习数学基础 3 第一章 机器学习的统计基础 3 第二章 探索性数据分析( EDA) . 11 第二部分 机器学习概述 14 第三章 机器学习概述 14 第三部分 监督学习 -分类与回归 16 第四章 KNN( k 最邻近分类算法) 16 第五章 决策树 19 第六章 朴素贝叶斯分类 29 第七章 Logistic 回归 . 32 第八章 SVM 支持向量机 42 第九章 集成学习 (Esemble Learning) 43 第十一章 模型评估 46 第四部
2、分 非监督学习 -聚类与关联分析 50 第十二章 Kmeans 聚类分析 . 50 第十三章 关联分析 Apriori . 52 第十四章 数据预处理之数据降维 54 第五部分 Python 数据预处理 . 57 第十五章 Python 数据分析基础 . 57 第十六章 Python 进行数据清洗 . 77 第六部分 数据结构与算法 82 一、二叉树(前、中、后遍历) 82 二、几种基本排序方法 82 第七部分 SQL 知识 . 86 第八部分 数据挖掘案例分析 87 案例一 A Journey through Titanic 597c770e . 87 案例二 Analysis for ai
3、rplane-crashes-since-1908 94 案例三 贷款预测问题 98 案例四 KNN 算法实现葡萄酒价格模型预测及交叉验证 107 第一部分 数据挖掘与机器学习数学基础 第一章 机器学习的 统计 基础 1.1 概率论 1.概率论基本概念 样本空间 我们将随机实验 E 的一切可能基本结果组成的集合称为 E 的样本空间,记为 S。样本空间的元素,即E 的每一个可能的结果,称为样本点。样本空间又叫基本事件空间。 例 : 拍拍贷用户的学历 S=研究生或以上 , 本科 , 大专 , 高中 , 中专 , 初中及以下 , A=研究生或以上 , 本科 , 大专 事件 事件 A 是样本空间的子集
4、,可分为四种类型 空事件 : 样本空间的空子集 ; 原子事件 : 仅包含一个元素的样本空间 ; 混合事件 : 包含多个元素的样本空间 ; 样本空间本身也是一个事件 . 集合 概率论定义 概率用来描述一件事的不确定性。假设 A 是投硬币的一个结果(比如正面朝上),如果重复投硬币很多次,直到 A 出现的机会逼近一个极限 p。那么可以说出现 A 的概率是 p 对于事件 A 和 B,联合概率 Pr(AB)表示事件 A 和 B 同时发生的概率。 概率定律 事件的概率: P(A) 满足: P(A) 0 ; P(S) = 1;对于一连串的互斥事件: i ii i APAP )()( S A 条件概率 发生事
5、件 A 的情况下,发生 B 的概率称作条件概率 P(B|A). ()( | ) ()P B AP B A PA 独立性 事件发生和其它事件无关。 如果 P(B|A)=P(B), 我们称 B 和 A 统计独立,当且仅当: ( ) ( ) ( )P A B P A P B 如果 A 和 B 统计独立,那么 B 与 A 也统计独立 总概率 P(A) = P()+P(A) = P(A|B)P(B)+P(A|)P() 贝叶斯理论 ( | ) ( )( | ) ()P A B P BP B A PAP(B) : B 的 先验概率 ,非条件概率,或者边际概率 P(A|B): 给定 B 条件下的 A 的条件概
6、率 , 也被称作 “似然 ” P(A): A 的 边际概率 ,也作为 B 的后验概率的归一化常量 P(B|A): B 的 后验概率 2.随机变量,期望,方差 随机变量 X 是随机试验的数值型结果 相关概念: 观测值: 其中一个结果成为观测值 数据: 多个观测值集合为数据 总体: 所有的结果称为总体 有两种类型的随机变量 离散变量: 值数目可数 对于离散型随机变量,我们关心每个特定数值出现的概率 eg.客户的婚姻情况 连续变量: 数值在一定范围内 对于连续性变量,某一个特定值出现的概率为 0,我们只关心区间的概率 Eg.客户的投资金额 概率分布 随机变量的分布就是它所有可能的输出以及它们的概率集
7、合 概率密度函数 随机变量的概率密度函数描述该随机变量在某个取值发生的可能性 离散变量: P(X=x)=p(x) 连续变量: ba dxxpbXaP )()( 累积分布函数 x 处的累积分布函数是负无穷到 x 点的概率密度函数的累加和 期望 期望是指所有可能值的加权和。其权重对于离散值而言就是该值出现的概率,而对于连续值而言就是其密度函数。 离散情况: 连续情况: x all )( )p(xxXE ii dxxp(x)XE x al l)( 方差 用来描述该随机变量值和平均值的离散程度 离散情况 连续情况 x a l l 2)()( )p(xXExXVar ii dxp ( x )XExXV
8、a r x all 2)()( 3.常用概率分布 离散分布:伯努利分布(二项分布) 概率密度函数 : xx ppxp 1)1()( 均值 : pXE )( 方差 : )1()( ppXVar 连续分布 正态分布是最常用的一种连续分布 。 密度函数的特点是 : 关于均值 对称 , 并在 处取最大值 ,在正 ( 负 ) 无穷远处取值为 0, 图像是一条位于 x 轴上方的钟形曲线 。 期望值 决定了分布的位置 ,标准差 决定了分布的幅度 。 当 =0, 2 =1 时 , 称为标准正态分布 , 记为 N(0,1)。 概率密度函数 222 )(221)( xexf 期望 )(XE 方差 2)( XVar
9、 4.统计量估计和中心极限定理 从一个数据集(样本)估计它的分布情况 统计直方图:直观地显示了数据的分布 描述性指标: 衡量据中趋势 期望值的估计: = 最大值 /最小值: 2500 万用户的最大 /最小借款金额 中值: 按照借款金额排序,最中间的值 众数: :出现次数最多的借款金额 衡量变化性 范围:最大最小的借款金额之差 方差的估计: 两个重要定理 大数定律 中心极限定理 大数定理 大数定理描述的是一组独立同分布随机变量的均值的极限。在这些随机变量个数趋于无穷时,其均值依概率收敛于这些随机变量的数学期望 指明样本均值的收敛趋势 中心极限定理 设随机变量 X1, X2, Xn 相互独立,服从
10、同一分布,且具有数学期望和方差 0)(,)( 2 ii XVarXE 则随机变量的均值 = 1+2+ 渐进地服从正态分布,并且期望和方差分别为 0)(,)( 2 ii XVarXE 指明样本均值的分布与样本量的关系 1.2 假设检验 1.假设检验概述 作用:检查观察到的样本究竟是否支持对总体的假设,帮助进行决策 假设检验在数据分析中的应用 理解分析建模的结果 需要读懂相关性分析,归回等建模的结果 AB Test 什么是假设检验 假设检验是数理统计学中根据一定假设条件由样本推断总体的一种方法。 -对总体做 假设 -由样本做 检验 假设检验的要素 原假设( Null Hypothesis) 备择假
11、设( Alternative Hypothesis):即与原假设相悖的陈述 检验统计量:用采样数据基于原假设计算出的统计量,用来检验原假设和备择假设 拒绝域:在该区间,拒绝原假设,而趋向于备择假设 错误类型 类型 I: 在给定原假设是正确的情况下拒绝原假设的概率 (False positive) = P(reject H0 | H0 true) 拒真 类型 II: 在给定备择假设是正确的情况下接受原假设的概率 (False negative) = P(accept H0 | H1 true) 取伪 P-value 比观测值更极端的情况出现的概率,衡量样本数据相对于原假设的置信强,也称作观测的显
12、著性水平 )(: obszZPpvalP 用于做拒绝决定: 如果 p-value a, 不拒绝原假设 如果 p-value Z/2 or Z t/2 or T 0,分布呈尖峰状态;峰度 0,表示两变量存在正的线性相关关系; 0.8 表示两变量之间具有较强的线性关系 绝对值 data 对应着打斗次数和接吻次数 5. labels = np.array(1,1,1,2,2,2) #labels 则是对应 Romance 和 Action 6. knn.fit(data,labels) #导入数据进行训练 7. #Out: KNeighborsClassifier(algorithm=auto, l
13、eaf_size=30, metric=minkowski, 8. metric_params=None, n_jobs=1, n_neighbors=5, p=2, 9. weights=uniform) 10. knn.predict(18,90) 说明: 首先,用 labels 数组中的 1 和 2 代表 Romance 和 Aciton,因为 sklearn 不接受字符数组作为标志,只能用 1,2 这样的 int 型数据来表示,后面处理可以将 1 和 2 映射到 Romance 和 Action 上来。 fit 则是用 data 和 labels 进行训练, data 对应的是打斗次数
14、和接吻次数构成的向量,称之为特征向量。 labels则是这个数据所代表的电影所属的类型。调用 predict 进行预测,将未知 电影的特征向量代入,则能分析出该未知电影所属的类型。此处计算结果为 1,也就是该未知电影属于 Romance,和直觉相符。 第 五 章 决策树 5.1. 决策树基本概念及算法优缺点 1. 什么是决策树 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。 决策树( Decision Tree),又称判定树,是一种以树结构(包括二叉树和多叉树)形式来表达的预测分析模型
15、。 通过把实例从根节点排列到某个叶子节点来分类实例 叶子节点即为实例所属的分类 树上每个节点说明了对实例的某个属性的测试,节点的每个后继分支对应于该属性的一个可能值 2. 决策树结构 3. 决策树种类 分类树 -对离散变量做决策树 回归树 -对连续变量做决策树 4. 决策树算法(贪心算法) 有监督的学习 非参数学习算法 自顶向下递归方式构造决策树 在每一步选择中都采取在当前状态下 最好 /优的选择 决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各 个子数据集有一个最好的分类的过程。 在决策树算法中, ID3 基于 信息增益 作为属性选择的度量, C4.5 基
16、于 信息增益比 作为属性选择的度量, CART 基于 基尼指数 作为 属性选择 的度量 5.决策树学习过程 特征选择 决策树生成:递归结构 ,对应于模型的局部最优 决策树 剪枝:缩小树结构规模、缓解过拟合 ,对应于模型的全局选择 6. 决策树优缺点 优点: (1) 速度快: 计算量相对较小,且容易转化成分类规则。只要沿着树根向下一直走到叶,沿途的分裂条件就能够唯一确定一条分类的谓词。 (2) 准确性高: 挖掘出的分类规则准确性高,便于理解,决策树可以清晰的显示哪些字段比较重要,即可以生成可以理解的规则。 (3)可以处理连续和种类字段 (4)不需要任何领域知识和参数假设 (5)适合高维数据 缺点
17、: (1) 对于各类别样本数量不一致的数据,信息增益偏向于哪些具有更多数值的特征 (2) 易于过拟合 (3) 忽略属性之间的相关性 5.2 决策树数学知识 1.信息论: 若一事假有 k 种结果,对应的概率为 ,则此事件发生后所得到的信息量 I 为: I = (1 2(1)+2 2(2)+ 2() = 2=12. 熵: 给定包含关于某个目标概念的正反样例的样例集 S,那么 S 相对这个布尔型分类的熵为:Entropy(S) 2 2其中 P+代表正样例, p-代表反样例 3. 条件熵 : 假设随机变量 ( X, Y), 其联合分布概率为 P(X=xi,Y=yi)=Pij,i=1,2,n;j=1,2
18、,m 则条件熵 H(Y|X)表示在已知随机变量 X 的条件下随机变量 Y 的不确定性,其定义为 X 在给定条件下Y 的条件概率分 布的熵对 X 的数学期望 5.3 决策树算法 Hunt 在 Hunt 算法中,通过递归的方式建立决策树。 1)如果数据集 D 中所有的数据都属于一个类,那么将该节点标记为为节点。 2)如果数据集 D 中包含属于多个类的训练数据,那么选择一个属性将训练数据划分为较小的子集,对于测试条件的每个输出,创建一个子女节点,并根据测试结果将 D 中的记录分布到子女节点中,然后对每一个子女节点重复 1, 2 过程,对子女的子女依然是递归的调用该算法,直至最后停止。 5.4. 决策
19、树算法 ID3 1. 分类系统信息熵 2.条件熵 分类系统中的条件熵指的是当样本的某一特征 X 固定时的信息熵 因此样本特征 X 取值为 xi 的概率是 Pi,该特征被固定为值 xi 时的条件信息熵就是 H(C|X=xi),那么H(C|X)就是分类系统中特征 X 被固定时的条件熵 ( X=( x1, x2, , xn): 3.信息增益 Gain( S, A)定义 4. 属性选择度量 使用信息增益,选择 最高信息增益 的属性作为当前节点的测试属性 5.算法不足 使用 ID3 算法构建决策树时,若出现各属性值取值数分布偏差大的情况,分类精度会大打折扣 ID3 算法本身并未给出处理连续数据的方法 I
20、D3 算法不能处理带有缺失值的数据集,故在算法挖掘之前需要对数据集中的缺失值进行预处理 ID3 算法只有树的生成 ,所以该算法生成的树容易产生过拟合 6. 算法流程 7. 算法 Python 实现 1) Python 实现熵的计算 def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCounts = for featVec in dataSet: currentLabel = featVec-1 if currentLabel not in labelCounts.keys(): labelCountscurrentLabel
21、 = 0 labelCountscurrentLabel += 1 shannonEnt = 0.0 for key in labelCounts: prob = float(labelCountskey)/numEntries shannonEnt -= prob*log(prob,2) return shannonEnt 2) Sklearn.tree 参数介绍及使用建议 官网: http:/scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html class sklearn.tre
22、e.DecisionTreeClassifier(criterion=gini, splitter=best, max_depth=None, min_samples_split=2,min_samples_leaf=1, max_features=None, random_state=None, min_density=None, compute_importances=None,max_leaf_nodes=None) 比较重要的参数: criterion :规定了该决策树所采用的的最佳分割属性的判决方法,有两种: “gini”, “entropy”。 max_depth :限定了决策树的
23、最大深度,对于防止过拟合非常有用。 min_samples_leaf :限定了叶子节点包含的最小样本数,这个属性对于防止上文讲到的数据碎片问题很有作用 模块中一些重要的属性方法: n_classes_ :决策树中的类数量。 classes_ :返回决策树中的所有种类标签。 feature_importances_ : feature 的重要性,值越大那么越重要。 fit(X, y, sample_mask=None, X_argsorted=None, check_input=True, sample_weight=None) 将数据集 x,和标签集 y 送入分类器进行训练,这里要注意一个参数
24、是: sample_weright,它和样本的数量一样长,所携带的是每个样本的权重。 get_params(deep=True) 得到决策树的各个参数。 set_params(*params) 调整决策树的各个参数。 predict(X) 送入样本 X,得到决策树的预测。可以同时送入多个样本。 transform(X, threshold=None) 返回 X 的较重要的一些 feature,相当于裁剪数据。 score(X, y, sample_weight=None) 返回在数据集 X,y 上的测试分数,正确率。 使用建议 当我们数据中的 feature 较多时,一定要有足够的数据量来支撑
25、我们的算法,不然的话很容易overfitting PCA 是一种避免高维数据 overfitting 的办法。 从一棵较小的树开始探索,用 export 方法打印出来看看。 善用 max_depth 参数,缓慢的增加并测试模型,找出最好的那个 depth。 善用 min_samples_split 和 min_samples_leaf 参数来控制叶子节点的样本数量,防止 overfitting。 平衡训练数据中的各个种类的数据,防止一个种类的数据 dominate。 3) Sklearn.tree 实战 测试数据 data.txt 1.5 50 thin 1.5 60 fat 1.6 40 t
26、hin 1.6 60 fat 1.7 60 thin 1.7 80 fat 1.8 60 thin 1.8 90 fat 1.9 70 thin 1.9 80 fat Python 实战代码 # -*- coding: utf-8 -*- import numpy as np from sklearn import tree from sklearn.metrics import precision_recall_curve from sklearn.metrics import classification_report from sklearn.cross_validation impor
27、t train_test_split #数据读入 data= labels= with open(C:UsersAllenDesktopdata.txt) as ifile: for line in ifile: tokens=line.strip().split( ) data.append(float(tk) for tk in tokens:-1) labels.append(tokens-1) x=np.array(data) labels=np.array(labels) y=np.zeros(labels.shape) #标签转化为 0,1 ylabels=fat=1 #拆分训练数
28、据和测试数据 x_train,x_test,y_train,y_test=train_test_split(x, y, test_size = 0.2) #使用信息熵作为划分标准,对决策树进行训练 clf=tree.DecisionTreeClassifier(criterion=entropy) print clf #DecisionTreeClassifier(class_weight=None, criterion=entropy, max_depth=None, #max_features=None, max_leaf_nodes=None, min_samples_leaf=1, #
29、min_samples_split=2, min_weight_fraction_leaf=0.0, #presort=False, random_state=None, splitter=best) clf.fit(x_train,y_train) #把决策树写入文件 with open(“tree.dot“, w) as f: f = tree.export_graphviz(clf, out_file=f) # digraph Tree # node shape=box ; # 0 label=“X1 1 labeldistance=2.5, labelangle=45, headlab
30、el=“True“ ; # 2 label=“entropy = 0.0nsamples = 2nvalue = 0, 2“ ; # 1 - 2 ; # 3 label=“entropy = 0.0nsamples = 3nvalue = 3, 0“ ; # 1 - 3 ; # 4 label=“entropy = 0.0nsamples = 3nvalue = 0, 3“ ; # 0 - 4 labeldistance=2.5, labelangle=-45, headlabel=“False“ ; # #系数反映每个特征的影响力。越大表示该特征在分类中起到的作用越大 print(clf.f
31、eature_importances_) #测试结果的打印 answer=clf.predict(x_train) print(x_train) print(answer) print(y_train) print(np.mean(answer=y_train) #准确率与召回率 #准确率:某个类别在测试结果中被正确测试的比率 #召回率:某个类别在真实结果中被正确预测的比率 #测试结果: array( 0., 1., 0., 1., 0., 1., 0., 1., 0., 0.) #真实结果: array( 0., 1., 0., 1., 0., 1., 0., 1., 0., 1.) #分为
32、 thin 的准确率为 0.83。是因为分类器分出了 6 个 thin,其中正确的有 5 个,因此分为 thin 的准确率为5/6=0.83。 #分为 thin 的召回率为 1.00。是因为数据集中共有 5 个 thin,而分类器把他们都分对了(虽然把一个 fat 分成了thin!),召回率 5/5=1。 #分为 fat 的准确率为 1.00。不再赘述。 #分为 fat 的召回率为 0.80。是因为数据集中共有 5 个 fat,而分类器只分出了 4 个(把一个 fat 分成了 thin!),召回率 4/5=0.80。 #本例中,目标是尽可能保证找出来的胖子是真胖子(准确率),还是保证尽可能找到
33、更多的胖子(召回率)。 precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train) answer = clf.predict_proba(x):,1 print(classification_report(y, answer, target_names = thin, fat) 5.5 决策数算法 C4.5 1. 属性选择度量 C4.5 算法用信息增益率来选择属性,即选用信息增益比选择最佳特征 2. 信息增益比率度量 信息增益比率度量是用 ID3 算法中的增益度量 Gain(D, X)
34、和分裂信息度量 SplitInformation(D, X)来共同定义的 。 分裂信息度量 SplitInformation(D, X) 就相当于特征 X( 取值为 x1, x2, , xn, 各自的概率为 P1, P2, ., Pn, Pk就是样本空间中特征 X 取值为 Xk的数量除上该样本空间总数)的熵。 SplitInformation(D, X) = -P1 log2(P1)-P2 log2(P)-,.,-Pn log2(Pn) GainRatio(D,X) = Gain(D,X)/SplitInformation(D,X) 3. 对连续分布特征的处理 C4.5 先把连续属性转换为离散
35、属性再进行处理。如果有 N 条样本,那么我们有 N-1 种离散化的方法:vj 的分到右子树。计算这 N-1 种情况下最大的信息增益率。 1)对特征的取值进行升序排序 2)两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益( InforGain)。优化算法就是只计算分类属性发生改变的那些特征取值。 3)选择修正后信息增益 (InforGain)最大的分裂点作为该特征的最佳分裂点 4)计算最佳分裂点的信息增益率( Gain Ratio)作为特征的 Gain Ratio。 4.相比 ID3 算法的改进 对数据集排序以每个数据为阈值划分数据集计算各划分的信息增益
36、根据最大增益选择阈值使用阈值对数据集进行划分 使用 信息增益比例 而非 信息增益 作为分裂标准 处理含有带缺失值的样本 方法为将这些值并入最常见的某一类中或以最常用的值代替 处理 连续值 属性 规则的产生:规则集存储于一个二维数组中,每一行代表决策树的一个规则 交互验证: 训练开始之前,预留一部分数据, 训练之后,使用这部分数据对学习的结果进行验证 5.6 叶子裁剪 1.剪枝的原因和目的 解决决策树对训练样本的过拟合问题 2.决策树 常用剪枝方法 预剪枝 (Pre-Pruning)和 后剪枝 (Post-Pruning) 3. 预剪枝: 预剪枝是根据一些原则及早的停止树增长,如树的深度达到用户
37、所要的深度、节点中样本个数少于用户指定个数、不纯度指标下降的最大幅度小于用户指定的幅度等。 4. 后剪枝: 通过在完全生长的树上剪去分枝实现的,通过删除节点的分支来剪去树节点,可以使用的后剪枝方法有多种,比如: 代价复杂性剪枝、最小误差剪枝、悲观误差剪枝 等等 修剪方式有: 1)用叶子节点来替换子树,叶节点的类别由子树下面的多类决定 2)用子树最常用的分支来替代子树 5.7 决策树算法 CART 参考: http:/ 1.分类与会归树( calssification and regression tree, CART)是在给定输入随机变量 X 条件下输出随机变量 Y 的条件概率分布的学习方法。
38、 CART 假设决策树是二叉树,内部结点特征的取值为 是 和否。这样的决策树等同 于递归地二分每个特征,将输入控件即特征空间划分为有限个单元,并在这些单元上确定预测地概率分布。 2.决策树的生成就是递归地构建二叉决策树的过程,对 回归树 用 平方误差最小化准则 ,对 分类树 用GINI 指标(基尼指数) 最小化准则进行特征选择,生成二叉树。 3.最小二乘回归树生成算法 已知 X, Y 分别为输入和输出变量,并且 Y 是连续变量 输入:训练数据集 D 输出:回归树 f(x) 在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域的输出值,构建二叉决策树 4. 基尼指数 分
39、类问题中,假设有 K 个类,样本点属于第 k 类的概率为 , 则概率分布的基尼指数定义为:Gini() = (1) = 1 2=1=1 对于给定的样本集合,其基尼指数为 Gini(D) = 1 (|)2=1 ,其中 Ck 是 D 中属于第 k 类的样本子集, K 是类的个数。 若样本集合 D 根据特征 A 是否取某一可能值 a 被分割成 D1和 D2两部分, 即 1 = (,) |() = ,2 = 1 则在特征 A 的条件下,集合 D 的基尼指数定义为: Dini(D,A) = |1| (1)+|2| (2) 基尼指数 Gini(D)表示集合 D 的不确定性,基尼指数越大,样本的不确定性越大
40、 5.分类树用 基尼指数 选择最优特征,同时决定 该特征的最优二值切分点。 6.CART 生成算法 输入:训练数据集 D,停止计算得条件 输出: CART 决策树 根据训练数据集,从根节点开始,递归地对每个节点进行以下操作,构建二叉决策树: ( 1)设终点训练数据集为 D,计算现有特征对该数据集的基尼指数,此时对每个特征 A,其可能取的每个值 a,样本点对 A=a 的测试为“是”或“否”将 D 分割成 D1和 D2两部分,计算 A=a 时的基尼指数 ( 2)在所有可能的特征 A 以及他们所有可能的切分点 a 中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依据最优特征与最优
41、切分点,从现结点生成两个子节点,将训练数据集依特征分配到两个子结点中。 ( 3)对两个子结点递归地调用( 1),( 2),直到满足条件为止。 ( 4)生成 CART 决策树 算法停止的条件是节点中的样本个数小于预订阈值或样本集的基尼指数小于预订 阈值(样本属于同一类),或者没有更多特征 5.8 随机森林 1.概念:随机森林 利用随机的方式将许多决策树组合成一个森林,每个决策树在分类的时候决定测试样本的最终类别 2.随机森林简介 3. Python 实现 #Import Lib From sklearn.ensemble import RandomForestClassifier #use Ra
42、ndomForestRegressor for regression problem #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset # Create Random Forest object model= RandomForestClassifier(n_estimators=1000) # Train the model using the training sets and check score model.fit(X,
43、 y) #Predict Output predicted= model.predict(x_test) 随机森林1.随机选择样本给定训练样本集,数量为 N, 有放回 采样到 N个样本(会重复)2.随机选择特征总量为 M的特征向量中,随机选择 (无放回) m个特征没然后计算 m个特征的增益( mM)3.构建决策树Information Gain( ID3)Gain Ratio( C4.5)4.随机森林投票分类重复上述过程 H次,投票机制获取最终分类结果5.优缺点分析优点能够处理高纬度的数据,并且不做特征选择每次学习使用不同训练集,一定程度避免过拟合缺点在某些噪音较大的分类或回归问题上会过拟合级
44、别划分较多的属性会对随机森林产生更大的影响第六章 朴素贝叶斯分类 6.1 朴素贝叶斯分类数学基础 1.贝叶斯定理 假设对于某个数据集,随机变量 C 表示样本为 C 类的概率, F1 表示测试样本某特征出现的概率,套用基本贝叶斯公式,则如下所示: 上式表示对于某个样本,特征 F1 出现时,该样本被分为 C 类的条件概率。 对于该公式,需要熟知的概念: 先验概率( Prior) : P(C)是 C 的先验概率,可以从已有的训练集中计算分为 C 类的样本占所有样本的比重得出。 证据( Evidence): 即上式 P(F1),表示对于某测试样本,特征 F1 出现的概率。同样可以从训练集中F1 特征对
45、应样本所占总样本的比例得出。 似然( likelihood): 即上式 P(F1|C),表示如果知道一个样本分为 C 类,那么他的特征为 F1 的概率是多少 对于多特征而言: 贝叶斯定理是基于假设的先验概率给定假设下观察到不同数据的概率,提供了一种计算后验概率的方法 6.2 朴素贝叶斯分类 1.思想基础 对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。 2.假设条件 1) 特征之间相互独立 2) 每个特征同等重要 3.朴素的概念 1) “朴素的认为各个特征相互独立 ” 分子简化成 P(C)*P(F1|C)*P(F2|C).P(Fn|C) 2
46、)工作原理为计算 P(C=0|F1.Fn)和 P(C=1|F1.Fn),并取最大值的那个作为其分类 而二者的分母是一模一样的。因此,我们又可以 省略分母计算 ,从而进一步简化计算过程。 3) 贝叶斯公式推导能够成立有个重要前期,就是各个证据( evidence)不能为 0。也即对于任意特征Fx, P(Fx)不能为 0。 处理方法: A 把所有计数进行 +1( 加法平滑 (additive smoothing,又叫 拉普拉斯平滑 (Laplace smothing)) B 如果通过增加一个大于 0 的可调参数 alpha 进行平滑,就叫 Lidstone 平滑 。 4)当特征很多的时候,大量小数值的小数乘法会有溢出风险。因此,通常的实现都是将其转换为 log: logP(C)*P(F1|C)*P(F2|C).P(Fn|C) = logP(C)+logP(F1|C) + . +logP(Fn|C) 将乘法转换为加法,就彻底避免了乘法溢出风险。 4.算法原理 5.优缺点 优点 可以和决策树、神经网络分类算法相媲美,能运用于大型数据库 方法简单,分类准确率高,速度快,所需估计的参数少,对于缺失数据不敏感 缺点 假设一个属性对分类的影响独立于其他的属性值,这往往不成立 (即实际上难以满足的相互独立 ) 需要知道先验概率