机器学习算法总结
一、Bagging之决策树、随机森林原理与案例
二、boosting之GBDT、XGBT原理推导与案例
三、SVM原理推导与案例
四、逻辑回归与反欺诈检测案例
五、聚类之K-means
一、Bagging之决策树、随机森林原理与案例
1. 决策树
1.1 简介
- 决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据种总结出决策规则,并利用树状图结构呈现这些规则,以解决分类和回归问题。
- 决策树算法研究核心内容:
- 如何从数据集中找出最佳分支点
- 如何让决策树停止生长,防止过拟合
1.2 分支原理
-
使用“贪心策略”,通过每一次局部分裂最优,接近全局最优树
-
分类树
-
预测结果 = 叶子节点上少数服从多数
-
不纯度:用于衡量最佳分枝的指标,分裂后的不纯度越低越好。
-
不纯度计算
-
信息增益(ID3)
1. 信 息 量 定 义 f ( i ) : = − l o g 2 P i 2. 信 息 熵 : E n t r o p y ( t ) = ∑ i = 1 c p i ( − l o g 2 p i ) 注 : 某 一 类 别 比 例 ∗ 其 类 别 所 对 应 的 信 息 量 ( 相 当 于 整 个 概 率 模 型 系 统 期 望 / 加 权 求 和 , 范 围 [ 0 , 1 ] ) 3. 信 息 增 益 = 父 节 点 信 息 熵 − 对 应 所 有 子 节 点 信 息 熵 加 权 平 均 I n f o r m a t i o n G a i n = E n t r o p y ( 父 节 点 ) − ∑ t = 1 T N t N E n t r o p y ( 子 节 点 ) T : 父 节 点 分 裂 后 子 节 点 个 数 ; N t N : 分 裂 后 t 节 点 上 的 样 本 数 / 样 本 总 数 ( 即 分 裂 前 父 节 点 样 本 数 ) I D 3 算 法 缺 点 : 分 支 度 越 高 的 离 散 变 量 往 往 子 节 点 总 信 息 熵 越 小 ( 比 如 训 练 集 中 I D 字 段 , 分 支 , 每 个 i d 分 裂 后 对 应 的 子 节 点 不 纯 度 都 为 0 ) 缺 失 值 和 连 续 值 不 能 处 理 没 有 剪 枝 操 作 , 容 易 过 拟 合 \begin{array}{l} 1.信息量定义f(i):=-log_2P_i\\ 2.信息熵:Entropy(t)=\sum_{i=1}^cp_i(-log_2p_i)\\ \quad 注:某一类别比例*其类别所对应的信息量(相当于整个概率模型系统期望/加权求和,范围[0,1])\\ \\3.信息增益 = 父节点信息熵 - 对应所有子节点信息熵加权平均\\ \quad InformationGain = Entropy(父节点) - \sum_{t=1}^T\frac{N_t}{N}Entropy(子节点)\\ \quad T: 父节点分裂后子节点个数; \frac{N_t}{N}: 分裂后t节点上的样本数/样本总数(即分裂前父节点样本数)\\ \\ ID3算法缺点:\\ \quad \quad 分支度越高的离散变量往往子节点总信息熵越小(比如训练集中ID字段,分支,每个id分裂后对应的子节点不纯度都为0)\\ \quad \quad 缺失值和连续值不能处理\\ \quad \quad 没有剪枝操作,容易过拟合 \end{array} 1.信息量定义f(i):=−log2Pi2.信息熵:Entropy(t)=∑i=1cpi(−log2pi)注:某一类别比例∗其类别所对应的信息量(相当于整个概率模型系统期望/加权求和,范围[0,1])3.信息增益=父节点信息熵−对应所有子节点信息熵加权平均InformationGain=Entropy(父节点)−∑t=1TNNtEntropy(子节点)T:父节点分裂后子节点个数;NNt:分裂后t节点上的样本数/样本总数(即分裂前父节点样本数)ID3算法缺点:分支度越高的离散变量往往子节点总信息熵越小(比如训练集中ID字段,分支,每个id分裂后对应的子节点不纯度都为0)缺失值和连续值不能处理没有剪枝操作,容易过拟合 -
信息增益率(C4.5)
1. 目 的 : 修 正 信 息 增 益 对 分 支 度 高 的 特 征 的 偏 好 2. 信 息 增 益 率 : g a i n r a t i o = I n f o r m a t i o n G a i n I n f o r m a t i o n V a l u e ( 使 用 分 支 度 对 信 息 增 益 偏 好 分 支 度 高 的 特 征 进 行 惩 罚 ) 3. 分 支 度 ( I V : I n f o r m a t i o n V a l u e ) : I n f o r m a t i o n V a l u e = − ∑ i = 1 k p ( v i ) l o g 2 p ( v i ) i : 表 示 父 节 点 的 第 i 个 子 节 点 ; v i : 第 i 个 子 节 点 的 样 本 数 ; p ( v i ) : 第 i 个 子 节 点 的 样 本 数 占 父 节 点 样 本 数 相 当 于 衡 量 整 个 分 裂 情 况 的 信 息 熵 , 分 支 度 越 高 , 分 裂 越 多 , I V 值 越 大 , 对 信 息 增 益 惩 罚 就 越 大 。 C 4.5 算 法 : 使 用 分 支 度 对 信 息 增 益 偏 好 分 支 度 高 的 特 征 进 行 惩 罚 增 加 了 对 连 续 变 量 的 处 理 , 对 连 续 列 从 小 到 大 排 序 , 若 连 续 变 量 有 N 个 值 , c 4.5 中 产 生 N − 1 个 备 选 切 分 点 , 每 一 个 切 分 点 都 代 表 一 种 二 叉 树 的 切 分 方 案 。 \begin{array}{l} 1.目的:修正信息增益对分支度高的特征的偏好\\ 2.信息增益率:gainratio=\frac{InformationGain}{InformationValue}(使用分支度对信息增益偏好分支度高的特征进行惩罚)\\ 3.分支度(IV:Information Value):\\ \quad Information Value = -\sum_{i=1}^kp(v_i)log_2p(v_i)\\ \quad i:表示父节点的第i个子节点;v_i:第i个子节点的样本数;p(v_i):第i个子节点的样本数占父节点样本数\\ \quad 相当于衡量整个分裂情况的信息熵,分支度越高,分裂越多,IV值越大,对信息增益惩罚就越大。 \\ \\ C4.5算法:\\ \quad 使用分支度对信息增益偏好分支度高的特征进行惩罚\\ \quad 增加了对连续变量的处理,对连续列从小到大排序,若连续变量有N个值,c4.5中产生N-1个备选切分点,每一个切分点都代表一种二叉树的切分方案。 \end{array} 1.目的:修正信息增益对分支度高的特征的偏好2.信息增益率:gainratio=InformationValueInformationGain(使用分支度对信息增益偏好分支度高的特征进行惩罚)3.分支度(IV:InformationValue):InformationValue=−∑i=1kp(vi)log2p(vi)i:表示父节点的第i个子节点;vi:第i个子节点的样本数;p(vi):第i个子节点的样本数占父节点样本数相当于衡量整个分裂情况的信息熵,分支度越高,分裂越多,IV值越大,对信息增益惩罚就越大。C4.5算法:使用分支度对信息增益偏好分支度高的特征进行惩罚增加了对连续变量的处理,对连续列从小到大排序,若连续变量有N个值,c4.5中产生N−1个备选切分点,每一个切分点都代表一种二叉树的切分方案。 -
gini基尼系数(cart树)
1. 基 尼 系 数 理 解 : 表 示 在 样 本 集 合 中 随 机 选 中 一 个 样 本 是 错 误 分 类 的 概 率 , 范 围 [ 0 , 0.5 ] G i n i = ∑ i = 1 c p i ( 1 − p i ) = ∑ i = 1 c p i − ∑ i = 1 c p i 2 = 1 − ∑ i = 1 c p i 2 2. C a r t 树 特 点 : 1. 所 有 的 层 都 是 二 叉 树 2. 大 大 减 少 计 算 量 , 采 用 基 尼 系 数 , 不 用 进 行 l o g 运 算 ; I D 3 和 C 4.5 是 多 叉 树 , 一 次 穷 尽 一 个 特 征 列 的 所 有 分 类 信 息 , 含 有 无 用 分 裂 计 算 , C a r t 树 是 二 叉 树 , 每 次 只 计 算 最 有 利 的 的 一 个 分 裂 点 \begin{array}{l} 1.基尼系数理解:表示在样本集合中随机选中一个样本是错误分类的概率,范围[0,0.5]\\ \quad Gini=\sum_{i=1}^cp_i(1-p_i)=\sum_{i=1}^cp_i-\sum_{i=1}^cp_i^2=1-\sum_{i=1}^cp_i^2\\ 2.Cart树特点:\\ \quad \quad 1.所有的层都是二叉树\\ \quad \quad 2.大大减少计算量,采用基尼系数,不用进行log运算;\\ \quad \quad \quad ID3和C4.5是多叉树,一次穷尽一个特征列的所有分类信息,含有无用分裂计算,\\ \quad \quad \quad Cart树是二叉树,每次只计算最有利的的一个分裂点 \end{array} 1.基尼系数理解:表示在样本集合中随机选中一个样本是错误分类的概率,范围[0,0.5]Gini=∑i=1cpi(1−pi)=∑i=1cpi−∑i=1cpi2=1−∑i=1cpi22.Cart树特点:1.所有的层都是二叉树2.大大减少计算量,采用基尼系数,不用进行log运算;ID3和C4.5是多叉树,一次穷尽一个特征列的所有分类信息,含有无用分裂计算,Cart树是二叉树,每次只计算最有利的的一个分裂点
不纯度计算示例:
1. 设 分 裂 后 叶 子 节 点 1 : [ 1 , 1 , 1 , 1 , 1 , 1 ] ; 叶 子 节 点 2 : [ 1 , 1 , 1 , 1 , 1 , 0 ] ; 叶 子 节 点 3 [ 1 , 1 , 1 , 0 , 0 , 0 ] 叶 子 节 点 1 : 信 息 熵 : 1 ∗ l o g 2 1 = 0 基 尼 系 数 : 1 − 1 2 = 0 叶 子 节 点 2 : 信 息 熵 : 5 6 ∗ ( − l o g 2 5 6 ) + 1 6 ∗ ( − l o g 2 1 6 ) = 0.65 基 尼 系 数 : 1 − [ 5 6 2 + 1 6 2 ] = 0.27 叶 子 节 点 3 : 信 息 熵 : 3 6 ∗ ( − l o g 2 3 6 ) + 3 6 ∗ ( − l o g 2 3 6 ) = 1 基 尼 系 数 : 1 − [ 3 6 2 + 3 6 2 ] = 0.5 2. 假 设 父 节 点 [ 1 , 1 , 1 , 1 , 0 , 0 ] , 选 取 a 特 征 分 裂 后 叶 子 节 点 为 [ 0 , 1 , 1 , 1 , 1 ] 和 [ 0 ] , 则 : 信 息 增 益 : [ 4 6 ∗ ( − l o g 2 4 6 ) + 2 6 ∗ ( − l o g 2 2 6 ) ] 父 − [ 5 6 [ 4 5 ∗ ( − l o g 2 4 5 ) + 1 5 ∗ ( − l o g 2 1 5 ) ] + 1 6 1 ∗ ( − l o g 2 1 ) ] 子 = 0.14 信 息 增 益 率 : G a i n R a t i o = I n f o r m a t i o n G a i n I n f o r m a t u o n V a l u e = 0.14 5 6 ∗ ( − l o g 2 5 6 ) + 1 6 ∗ ( − l o g 2 1 6 ) = 0.24 基 尼 系 数 ( 增 益 ) : [ 1 − ( 4 6 2 + 2 6 2 ) ] 父 − [ 5 6 [ 1 − ( 4 5 2 + 1 5 2 ) ] + 1 6 [ 1 − 1 1 2 ] ] 子 = 0.178 选 取 b 分 裂 点 叶 子 节 点 为 [ 1 , 1 , 1 , 1 ] 和 [ 0 , 0 ] 信 息 增 益 : [ 4 6 ∗ ( − l o g 2 4 6 ) + 2 6 ∗ ( − l o g 2 2 6 ) ] 父 − [ 4 6 [ 1 ∗ ( − l o g 2 1 ) ] + 2 6 [ 1 ∗ ( − l o g 2 1 ) ] ] 子 = 0.91 信 息 增 益 率 : G a i n R a t i o = I n f o r m a t i o n G a i n I n f o r m a t u o n V a l u e = 0.92 4 6 ∗ ( − l o g 2 4 6 ) + 2 6 ∗ ( − l o g 2 2 6 ) = 1 基 尼 系 数 ( 增 益 ) : [ 1 − ( 4 6 2 + 2 6 2 ) ] 父 − [ 4 6 [ 1 − 1 1 2 ) ] + 2 6 [ 1 − 1 1 2 ] ] 子 = 0.445 由 上 可 知 选 择 b 特 征 点 进 行 分 裂 , 不 管 从 信 息 熵 还 是 基 尼 系 数 , b 特 征 点 增 益 高 于 a 叶 子 节 点 上 不 纯 度 越 低 , 信 息 熵 和 基 尼 系 数 越 小 , 决 策 树 最 终 优 化 目 标 是 使 分 裂 后 的 叶 子 节 点 加 权 求 和 后 总 不 纯 度 最 低 , 即 衡 量 不 纯 度 的 指 标 最 低 ( 信 息 熵 、 基 尼 系 数 ) \begin{array}{l} 1.设分裂后叶子节点1:[1,1,1,1,1,1];叶子节点2:[1,1,1,1,1,0];叶子节点3[1,1,1,0,0,0]\\ 叶子节点1:\\ \quad 信息熵:1*log_21=0\\ \quad 基尼系数:1-1^2=0\\ 叶子节点2:\\ \quad 信息熵:\frac{5}{6}*(-log_2\frac{5}{6})+\frac{1}{6}*(-log_2\frac{1}{6})=0.65\\ \quad 基尼系数:1-[\frac{5}{6}^2+\frac{1}{6}^2]=0.27\\ 叶子节点3:\\ \quad 信息熵:\frac{3}{6}*(-log_2\frac{3}{6})+\frac{3}{6}*(-log_2\frac{3}{6})=1\\ \quad 基尼系数:1-[\frac{3}{6}^2+\frac{3}{6}^2]=0.5\\ \\ 2.假设父节点[1,1,1,1,0,0],\\ 选取a特征分裂后叶子节点为[0,1,1,1,1]和[0],则:\\ 信息增益:\\ [\frac{4}{6}*(-log_2\frac{4}{6})+\frac{2}{6}*(-log_2\frac{2}{6})]_父\\-[\frac{5}{6}[\frac{4}{5}*(-log_2\frac{4}{5})+\frac{1}{5}*(-log_2\frac{1}{5})]+\frac{1}{6}1*(-log_21)]_子=0.14\\ 信息增益率:GainRatio = \frac{InformationGain}{InformatuonValue}=\frac{0.14}{\frac{5}{6}*(-log_2\frac{5}{6})+\frac{1}{6}*(-log_2\frac{1}{6})}=0.24\\ 基尼系数(增益):[1-(\frac{4}{6}^2+\frac{2}{6}^2)]_父-[\frac{5}{6}[1-(\frac{4}{5}^2+\frac{1}{5}^2)]+\frac{1}{6}[1-\frac{1}{1}^2]]_子=0.178\\ \\ 选取b分裂点叶子节点为[1,1,1,1]和[0,0]\\ 信息增益:\\ [\frac{4}{6}*(-log_2\frac{4}{6})+\frac{2}{6}*(-log_2\frac{2}{6})]_父-[\frac{4}{6}[1*(-log_21)]+\frac{2}{6}[1*(-log_21)]]_子=0.91\\ \\ 信息增益率:GainRatio = \frac{InformationGain}{InformatuonValue}=\frac{0.92}{\frac{4}{6}*(-log_2\frac{4}{6})+\frac{2}{6}*(-log_2\frac{2}{6})}=1\\ \\ 基尼系数(增益):[1-(\frac{4}{6}^2+\frac{2}{6}^2)]_父-[\frac{4}{6}[1-\frac{1}{1}^2)]+\frac{2}{6}[1-\frac{1}{1}^2]]_子=0.445\\ 由上可知选择b特征点进行分裂,不管从信息熵还是基尼系数,b特征点增益高于a\\ \\ 叶子节点上不纯度越低,信息熵和基尼系数越小,\\决策树最终优化目标是使分裂后的叶子节点加权求和后总不纯度最低,即衡量不纯度的指标最低(信息熵、基尼系数) \end{array} 1.设分裂后叶子节点1:[1,1,1,1,1,1];叶子节点2:[1,1,1,1,1,0];叶子节点3[1,1,1,0,0,0]叶子节点1:信息熵:1∗log21=0基尼系数:1−12=0叶子节点2:信息熵:65∗(−log265)+61∗(−log261)=0.65基尼系数:1−[652+612]=0.27叶子节点3:信息熵:63∗(−log263)+63∗(−log263)=1基尼系数:1−[632+632]=0.52.假设父节点[1,1,1,1,0,0],选取a特征分裂后叶子节点为[0,1,1,1,1]和[0],则:信息增益:[64∗(−log264)+62∗(−log262)]父−[65[54∗(−log254)+51∗(−log251)]+611∗(−log21)]子=0.14信息增益率:GainRatio=InformatuonValueInformationGain=65∗(−log265)+61∗(−log261)0.14=0.24基尼系数(增益):[1−(642+622)]父−[65[1−(542+512)]+61[1−112]]子=0.178选取b分裂点叶子节点为[1,1,1,1]和[0,0]信息增益:[64∗(−log264)+62∗(−log262)]父−[64[1∗(−log21)]+62[1∗(−log21)]]子=0.91信息增益率:GainRatio=InformatuonValueInformationGain=64∗(−log264)+62∗(−log262)0.92=1基尼系数(增益):[1−(642+622)]父−[64[1−112)]+62[1−112]]子=0.445由上可知选择b特征点进行分裂,不管从信息熵还是基尼系数,b特征点增益高于a叶子节点上不纯度越低,信息熵和基尼系数越小,决策树最终优化目标是使分裂后的叶子节点加权求和后总不纯度最低,即衡量不纯度的指标最低(信息熵、基尼系数) -
-
-
回归树
-
预测结果 = 叶子节点上标签的平均值/中位数
-
回归树分裂指标:
m i n ( D , S ) [ ∑ i ∈ R 1 ( y i − y ^ i ) 2 + ∑ i ∈ R 2 ( y i − y ^ i ) 2 ] D : 分 裂 前 数 据 集 ; S : 某 个 特 征 分 裂 点 ; R 1 , R 2 : D 数 据 集 以 S 分 裂 点 进 行 分 裂 后 生 成 的 两 个 子 节 点 数 据 集 min_{(D,S)}[\sum_{i\in R_1}(y_i-\hat y_i)^2+\sum_{i\in R_2}(y_i-\hat y_i)^2]\\ D:分裂前数据集;S:某个特征分裂点;\\R1,R2:D数据集以S分裂点进行分裂后生成的两个子节点数据集 min(D,S)[i∈R1∑(yi−y^i)2+i∈R2∑(yi−y^i)2]D:分裂前数据集;S:某个特征分裂点;R1,R2:D数据集以S分裂点进行分裂后生成的两个子节点数据集
-
1.3 重要参数
-
Criterion:用来选择不纯度的计算方法
-
分类树
- “entropy”:信息熵
- “gini”:基尼系数
-
回归树
- “squared_error”:均方误差
- “friedman_mse”:改进后的均方误差
- “absolute_error”:平均绝对误差
-
-
剪枝参数
- max_depth:限制树的最大深度,超过设定深度的分支全部裁剪,建议=3开始尝试
- min_samples_left:限定分支后的每个叶子节点至少包含设定值个样本,否则分支不发生(可以输入整数或浮点数,整数建议=5开始,浮点数表示样本量的百分比)
- min_samples_split:一个节点至少包含设定值个训练样本,才允许被分支
- max_features:暴力限制分支时考虑特征的个数,可能删除重要的特征
- min_impurity_decrease:限制信息增益的大小,过小不分支
- max_leaf_nodes:限制叶子节点的数量
-
random_state & splitter
-
random_state: 控制估计器的随机性
当’ ’ max_features < n_features ’ '时,算法将在每次拆分中随机选择“max_features”,然后找到其中最好的分裂。
可能会遇到information gain相等的两个features,random_state可以决定我们在这种情况下先从哪个feature上split。
-
splitter
用于在每个节点上选择分支的策略。支持策略是“best”选择最佳拆分和“random”选择
最好的随机分割。
-
-
样本权重参数
-
class_weight
-
“{class_label: weight}”:{0:1,1:4}
for four-class multilabel classification weights should be
[{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] instead of
[{1:1}, {2:5}, {3:1}, {4:1}]. -
“balanced”: 权重与输入数据中的类频率成反比
n_samples / (n_classes * np.bincount(y))
-
-
min_weight_fraction_leaf
默认为0。
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_ weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_ fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。
-
1.4 决策树优缺点
-
优点
- 易于理解,可解释性强
- 可分类,可回归
- 可以处理多标签分类
- 可以处理离散型或连续性特征变量
- 不受特征量纲影响
-
缺点
- 不稳定,数据微小变化,可能导致生成完全不同的树(这就需要集成算法随机森林)
- 偏向样本比例大的类别
- 易过拟合,泛化性差,需要剪枝操作
- 学习规则有限,复杂问题不易于学习(XOR异或问题)
1.5 案例
-
导包
import pandas as pd import matplotlib.pyplot as plt import numpy as np # sklearn 内置数据集 from sklearn.datasets import load_breast_cancer,load_digits,load_boston # model_selection 用于比较、验证模型和模型参数。 from sklearn.model_selection import train_test_split,KFold,cross_val_score,cross_validate,GridSearchCV # 特征预处理特征编码 from sklearn.preprocessing import OrdinalEncoder,OneHotEncoder # 特征预处理缺失值填充 # 单变量插补 from sklearn.impute import SimpleImputer # 多变量插补 from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer from sklearn.impute import MissingIndicator # feature_selection 用于模型特征选择,主要过滤法,嵌入法和包装法 from sklearn.feature_selection import VarianceThreshold,SelectFromModel,RFE # tree 树模型 from sklearn.tree import DecisionTreeClassifier # 评估指标 from sklearn.metrics import accuracy_score
-
加载数据集
# 训练数据来源 kaggle # 加载训练集 titanic_train = pd.read_csv('../data/Kaggle-Titanic/train.csv') titanic_train.columns=['id','是否存活','客户等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票','票价','船仓','登录港口'] titanic_train.info() # 加载测试集 titanic_test = pd.read_csv('../data/Kaggle-Titanic/test.csv') titanic_test.columns=['PassengerId','客户等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票','票价','船仓','登录港口'] titanic_test.info()
-
特征处理(简单处理,输出模型不报错即可,重点记录流程)
# 特征处理 train_y = titanic_train['是否存活'] # 性别编码 ordinal = OrdinalEncoder() titanic_train['性别'] = ordinal.fit_transform(titanic_train[['性别']]) titanic_test['性别'] = ordinal.transform(titanic_test[['性别']]) # 查看缺失值 missindicator = MissingIndicator(features='all') miss_matrix = missindicator.fit_transform(titanic_train[['客户等级','性别','年龄','兄弟姐妹个数','父母子女个数','票价']]) # 处理缺失值 # 1.单一变量插值 #simpleImputer = SimpleImputer() #train_x = simpleImputer.fit_transform(titanic_train[['客户等级','性别','年龄','兄弟姐妹个数','父母子女个数','票价']]) # 2.多变量插值 iterImputer = IterativeImputer(random_state=0) train_x = iterImputer.fit_transform(titanic_train[['客户等级','性别','年龄','兄弟姐妹个数','父母子女个数','票价']]) test_x = iterImputer.transform(titanic_test[['客户等级','性别','年龄','兄弟姐妹个数','父母子女个数','票价']])
-
模型训练及预测
# 拆分训练集和验证集 X_train, X_valida, y_train, y_valida = train_test_split(train_x,train_y,test_size=0.1) # 决策树模型 dt = DecisionTreeClassifier( criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, class_weight="balanced") param_grid = {'criterion':["gini", "entropy", "log_loss"], 'max_depth':[3,6,8,9,10,11,12,15], 'min_samples_split':[11,12,13,14,15,16,17,18,19,20]} # 网格搜索最佳参数 grid_dt = GridSearchCV( estimator=dt, param_grid=param_grid, scoring='accuracy', cv=5) grid_dt.fit(X_train,y_train) bdt = grid_dt.best_estimator_ print(f'训练集预测正确率:{accuracy_score(y_train,bdt.predict(X_train))}') print(f'验证集预测正确率:{accuracy_score(y_valida,bdt.predict(X_valida))}') '' 训练集预测正确率:0.8639200998751561 验证集预测正确率:0.7777777777777778 '' # 保存预测结果, 提交kaggle,测试集准确率72-75%(过拟合) titanic_test['Survived'] = dt.predict(test_x) titanic_test[['PassengerId','Survived']].to_csv('gender_submission.csv',index=False)
2. 随机森林
2.1 概述
集成学习方法:1. 袋装法(bagging)、2. 提升法(boosting)、3. stacking
袋装法代表模型:随机森林
构建多个相互独立的评估器(一般为决策树),然后对其预测进行平均或多数表决原则来决定集成评估器的结果(用来组成随机森林的分类树们至少都有50%的预测正确率)
2.2 参数
-
n_estimators=100:基评估器数量,往往越大,模型效果越好(有一定界限)
-
控制基评估器参数:
- criterion=‘gini’:基评估器计算不纯度指标
- max_depth=None:树的最大深度,超过最大深度的树枝都会被剪掉
- min_samples_split=2:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
- min_samples_leaf=1:一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
- min_weight_fraction_leaf=0.0:当sample_weigh 样本权重不一致时,每个叶子节点上最小权重
- max_features=‘sqrt’:max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整
- max_leaf_nodes=None:限制最大叶子节点数
- min_impurity_decrease=0.0:限制信息增益的大小,信息增益小于设定数值的分枝不会发生
-
bootstrap=True:代表使用bootstrap有放回随机抽样(每棵决策树训练时使用样本不一样,形成不同的基学习器)
-
oob_score=False:oob(out of bag data)袋外数据,样本量足够大时,oob占37%,设置为True,可以使用属性oob_score_查看袋外数据测试结果
-
n_jobs=None:要并行运行的作业数(fit,predict,apply,decision_path)
-
random_state=None:
- 控制boostrap过程中样本挑选随机性;
- max_features < n_features时,特征选择随机性;
- 决策树splitter为’random’时,寻找最佳分割随机性
-
verbose=0:Controls the verbosity when fitting and predicting.
-
warm_start=False:设置为True,开启增量学习
-
class_weight=None:样本权重(note:输入类型{“balanced”, “balanced_subsample”}, dict or list of dicts)
-
max_samples=None:从数据集中抽取的最大样本数,int\float
2.3 重要属性及方法
-
属性
-
.estimators_:基评估器集合
-
.oob_score:袋外数据测试分数
-
.feature_importances_:特征重要性
-
-
方法
-
apply(x):返回数据集x分类后所在叶子节点
-
fit(X,y):拟合训练集
-
predict(x):输出预测类别
-
predict_proba(x):返回每个测试样本对应的被分到每一类标签的概率
-
score(X,y):Return the mean accuracy on the given test data and labels
-
2.4 模型优缺点
-
优点
- 在很多数据集上相对其他算法表现良好
- 在高维数据上,特征随机选择,一部分程度上自动进行了特征选择
- 支持增量学习,可以进行大规模数据学习
- 树与树之间相互独立,可以并行计算
- 模型泛化能力强,综合多个基学习器结果,预测结果稳定,方差低
- 大规模数据时,不用划分测试集,可以使用袋外数据进行测试
- 易于理解
-
缺点
- 。。。过拟合
2.5 案例
-
将决策树案例决策树模型改为随机森林,其他操作不修改
# 随机森林模型 rf = RandomForestClassifier( n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight='balanced_subsample', ccp_alpha=0.0, max_samples=1.0, ) param_grid = { 'n_estimators':[50,70,90,100,120], 'criterion':["gini", "entropy"], 'max_depth':[3,6,8,9,10,11], 'min_samples_split':[5,6,7,8,10,11]} # 网格搜索最佳参数 grid_dt = GridSearchCV( estimator=rf, param_grid=param_grid, scoring='accuracy', cv=5) grid_dt.fit(train_x,train_y) bdt = grid_dt.best_estimator_ grid_dt.best_score_ # 保存预测结果, 提交kaggle,测试集准确率76%(过拟合) titanic_test['Survived'] = bdt.predict(test_x) titanic_test[['PassengerId','Survived']].to_csv('gender_submission.csv',index=False)
单颗决策树提交kaggle测试结果accuracy_score在72-75%,随参数调整略有波动;
随机森林预提交kaggke测结果比较稳定,accuracy_score在75-76%,效果比决策树好,且较为稳定。
但从模型调优角度,正确率不太好提高,需要进一步对数据特征进行挖掘(数据决定模型上限)