使用“贪心策略”,通过每一次局部分裂最优,接近全局最优树
分类树
预测结果 = 叶子节点上少数服从多数
不纯度:用于衡量最佳分枝的指标,分裂后的不纯度越低越好。
不纯度计算
信息增益(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分裂点进行分裂后生成的两个子节点数据集
Criterion:用来选择不纯度的计算方法
分类树
回归树
剪枝参数
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)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。
优点
缺点
导包
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)
集成学习方法:1. 袋装法(bagging)、2. 提升法(boosting)、3. stacking
袋装法代表模型:随机森林
构建多个相互独立的评估器(一般为决策树),然后对其预测进行平均或多数表决原则来决定集成评估器的结果(用来组成随机森林的分类树们至少都有50%的预测正确率)
n_estimators=100:基评估器数量,往往越大,模型效果越好(有一定界限)
控制基评估器参数:
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:
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
属性
.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
优点
缺点
将决策树案例决策树模型改为随机森林,其他操作不修改
# 随机森林模型
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%,效果比决策树好,且较为稳定。
但从模型调优角度,正确率不太好提高,需要进一步对数据特征进行挖掘(数据决定模型上限)