Julia机器学习---- 决策树(决策树-CART、随机森林、回归随机森林)

1、算法说明

决策树属于监督式机器学习,一般是通过训练带有标签的数据进行分类,然后来预测没有带有标签的数据 属于那个类别。监督式学习问题可以进一步被分为回归和分类问题。决策树(这里作为一个大类)也包含分类(剪枝决策树分类器、随机森林)和回归(回归随机森林)。

1.1 实现原理

这里列举一些比较好的文章

决策树[1,2,3]

随机森林[1,2,3]

回归随机森林[1,2,3]

1.2 决策树量化纯度

决策树的构建是基于样本概率和纯度来进行的,判断数据集是否“纯”可以通过三个公式进行判断:Gini系数、熵(Entropy)、错误率。三个公式的值越大,表示数据越不纯。值越小,表示数据越纯。当计算出各个特征属性的量化纯度值后,使用信息增益度来选择出当前数据集的分割特征属性。如果信息增益度值越大,表示在该特征属性上会损失的纯度越大,那么该属性越应该在决策树的上层。下面是具体的公式

1.3 在使用决策树之前重点看下随机森林优缺点

优点:

  1. 正如上文所述,随机森林算法能解决分类与回归两种类型的问题,并在这两个方面都有相当好的估计表现;
  2. 随机森林对于高维数据集的处理能力令人兴奋,它可以处理成千上万的输入变量,并确定最重要的变量,因此被认为是一个不错的降维方法。此外,该模型能够输出变量的重要性程度,这是一个非常便利的功能。
  3. 在对缺失数据进行估计时,随机森林是一个十分有效的方法。就算存在大量的数据缺失,随机森林也能较好地保持精确性;
  4. 当存在分类不平衡的情况时,随机森林能够提供平衡数据集误差的有效方法;
  5. 模型的上述性能可以被扩展运用到未标记的数据集中,用于引导无监督聚类、数据透视和异常检测;

缺点:

  1. 随机森林在解决回归问题时并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续型的输出。当进行回归时,随机森林不能够作出超越训练集数据范围的预测,这可能导致在对某些还有特定噪声的数据进行建模时出现过度拟合。
  2. 对于许多统计建模者来说,随机森林给人的感觉像是一个黑盒子——你几乎无法控制模型内部的运行,只能在不同的参数和随机种子之间进行尝试。

几个注意的点

  1. 随机森林有2个参数需要人为控制,一个是森林中树的数量,一般建议取很大。另一个是m的大小,推荐m的值为M的均方根。
  2. 随机森林:之前的两个随机采样(行和列)的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。【单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。

通用的调参方法:

  1. grid search 网格搜索。 sklearn 提供了相应的方GridSearchCV。即使用cross validation,对模型迭代的选用候选参数进行交叉验证,取结果最好的参数,优点:效果好,相当于穷举的思想,调参得到了候选参数里全局最优化结果。 缺点:计算复杂。 一般做竞赛的小项目选这个啦。
  2. 基于贪心的坐标下降搜索。即固定其他参数,把某个参数取得最好。这样迭代一遍得到最终结果。优点:计算量少,缺点:可能不是全局最优值、陷入局部最优解。
  3. 随机网格搜索:防止 网格搜索间隔过大而跳过最优值,而随机可以相对单个参数取到更多的值。
  4. n_estimators越多结果更稳定(方差越小),所以只要允许内,数目越大越好, 但计算量会大增。只有这个参数对结果的影响是越大越好,其他参数都是中间取得最优值。
  5.  “分裂条件”(criterion)对模型的准确度的影响也不一样,该参数需要在实际运用时灵活调整,可取gini或者信息增益比?。
  6. 每棵树最大特征数(max_features) 一般用sqrt(总特征数)。
  7. 调整“最大叶节点数”(max_leaf_nodes)以及“最大树深度”(max_depth)之一,可以粗粒度地调整树的结构:叶节点越多或者树越深,意味着子模型的偏差越低,方差越高;同时,调整“分裂所需最小样本数”(min_samples_split)、“叶节点最小样本数”(min_samples_leaf)及“叶节点最小权重总值”(min_weight_fraction_leaf),可以更细粒度地调整树的结构:分裂所需样本数越少或者叶节点所需样本越少,也意味着子模型越复杂。

2 、Julia 代码实现

下面使用鸢尾花数据集,做预测分析,鸢尾花是带有标签的数据。从准确率来看, 决策树CART算法的准确率更高一点。随机森林在一些低维且带有标签的数据上,表现确认不如存粹CART算法。

2.1 决策树使用示例(CART算法)

using MLBase
using DecisionTree
using RDatasets
using Distributions

features, labels = load_data("iris")
features = float.(features)
labels   = string.(labels)

# 训练并得到决策树分类器
model = build_tree(labels, features)
#  修剪树:合并纯度大于等于90%的叶子(默认值:100%)
model = prune_tree(model, 0.9)
# 打印树, 深度为5(可选)
print_tree(model, 5)

# 应用所学模型
apply_tree(model, [5.9,3.0,5.1,1.9])

# 推测所有节点
preds = apply_tree(model, features)

# 生成混淆矩阵,以及准确度和kappa分数
confusion_matrix(labels, preds)

# 得到每个标签的概率
apply_tree_proba(model, [5.9,3.0,5.1,1.9], ["Iris-setosa", "Iris-versicolor", "Iris-virginica"])

# 对修剪过的树进行三次交叉验证
n_folds=3
accuracy = nfoldCV_tree(labels, features, n_folds)

####决策树算法的停止条件,就是一组分类参数和各自的默认值
# pruning_purity: 修剪纯度:用于修剪后的纯度阈值(默认值:1.0,不修剪)
# max_depth: 决策树的最大深度(默认值:-1,无最大值)
# min_samples_leaf: 每个叶子节点需要的最小采样数(默认值:1)
# min_samples_split: 拆分所需的最小采样数(默认值:2)
# min_purity_increase: 分割所需的最小纯度(默认值:0.0)
# n_subfeatures: 要随机选择的特征数(默认值:0,全部保留)

n_subfeatures=0;
max_depth=-1;
min_samples_leaf=1;
min_samples_split=2
min_purity_increase=0.0;
pruning_purity = 1.0

model    =   build_tree(labels, features,
                        n_subfeatures,
                        max_depth,
                        min_samples_leaf,
                        min_samples_split,
                        min_purity_increase)

accuracy = nfoldCV_tree(labels, features,
                        n_folds,
                        pruning_purity,
                        max_depth,
                        min_samples_leaf,
                        min_samples_split,
                        min_purity_increase)

print_tree(model, 5)

# 准确率
# 3-element Array{Float64,1}:
#  1.0
#  1.0
#  1.0

2.2 随机森林决策树

using MLBase
using DecisionTree
using RDatasets
using Distributions

features, labels = load_data("iris")
features = float.(features)
labels   = string.(labels)

# 训练随机森林分类器
# 使用2个随机特征,10棵树,每棵树使用一半的样本(0.5),最大树深6
model = build_forest(labels, features, 2, 10, 0.5, 6)
# 应用所学模型
apply_forest(model, [5.9,3.0,5.1,1.9])

# 适配每个标签的概率
apply_forest_proba(model, [5.9,3.0,5.1,1.9], ["Iris-setosa", "Iris-versicolor", "Iris-virginica"])
# 对森林运行k 为3 的交叉验证,每个分割使用2个随机特征
n_folds=3; n_subfeatures=2
accuracy = nfoldCV_forest(labels, features, n_folds, n_subfeatures)

####决策树算法的停止条件,就是一组分类参数和各自的默认值
# n_subfeatures: 每次拆分要随机考虑的特征数(默认值:-1,sqrt(特征数量))
# n_trees:要训练的树的个数 (默认: 10)
# partial_sampling: 用于训练每棵树的样本占比(默认值:全部样本的0.7)
# max_depth: 决策树的最大深度 (默认没有最大值)
# min_samples_leaf: 每个叶子节点需要的最小样本数  (默认 5)
# min_samples_split:拆分所需的最小样本数(default: 2)
# min_purity_increase:分离所需的最低纯度 (默认 0.0)

n_subfeatures=-1
n_trees=10
partial_sampling=0.7
max_depth=-1
min_samples_leaf=5
min_samples_split=2
min_purity_increase=0.0

model    =   build_forest(labels, features,
                          n_subfeatures,
                          n_trees,
                          partial_sampling,
                          max_depth,
                          min_samples_leaf,
                          min_samples_split,
                          min_purity_increase)

accuracy = nfoldCV_forest(labels, features,
                          n_folds,
                          n_subfeatures,
                          n_trees,
                          partial_sampling,
                          max_depth,
                          min_samples_leaf,
                          min_samples_split,
                          min_purity_increase)
# 应用所学模型
apply_forest(model, [5.9,3.0,5.1,1.9])

# 适配每个标签的概率
apply_forest_proba(model, [5.9,3.0,5.1,1.9], ["Iris-setosa", "Iris-versicolor", "Iris-virginica"])

# 准确率
# 3-element Array{Float64,1}:
#  0.92
#  1.0
#  0.98

2.3、自适应增强决策树分类

using MLBase
using DecisionTree
using RDatasets
using Distributions

features, labels = load_data("iris")
features = float.(features)
labels   = string.(labels)

# 训练自适应增强树,使用7次迭代
model, coeffs = build_adaboost_stumps(labels, features, 7);
# 应用模型
apply_adaboost_stumps(model, coeffs, [5.9,3.0,5.1,1.9])
# 适配每个标签的概率
apply_adaboost_stumps_proba(model, coeffs, [5.9,3.0,5.1,1.9], ["Iris-setosa", "Iris-versicolor", "Iris-virginica"])
#  使用7次迭代,并对增强树进行3次交叉验证
n_iterations=7; n_folds=3
accuracy = nfoldCV_stumps(labels, features,
                          n_folds,
                          n_iterations)
#准确率
# 3-element Array{Float64,1}:
#  0.92
#  0.88
#  0.94

2.4、回归随机森林

 

using MLBase
using DecisionTree
using RDatasets
using Distributions

features, labels = load_data("iris")
features = float.(features)
labels   = string.(labels)

# 训练回归森林,使用2个随机特征,10棵树,
# 每个叶子节点 5个样本, 每棵树拥有全部样本的 0.7
model = build_forest(labels, features, 2, 10, 0.7, 5)
# 应用模型
apply_forest(model, [-0.9,3.0,5.1,1.9,0.0])
#  在回归森林上运行 k 为 3交叉验证,每个分割使用2个随机特征
n_subfeatures=2; n_folds=3
r2 = nfoldCV_forest(labels, features, n_folds, n_subfeatures)

####决策树算法的停止条件,就是一组分类参数和各自的默认值
# n_subfeatures: 每次拆分要随机考虑的特征数(默认值:-1,sqrt(特征数量))
# n_trees:要训练的树的个数 (默认: 10)
# partial_sampling: 用于训练每棵树的样本占比(默认值:全部样本的0.7)
# max_depth: 决策树的最大深度 (默认没有最大值)
# min_samples_leaf: 每个叶子节点需要的最小样本数  (默认 5)
# min_samples_split:拆分所需的最小样本数(default: 2)
# min_purity_increase:分离所需的最低纯度 (默认 0.0)

n_subfeatures=-1
n_trees=10
partial_sampling=0.7
max_depth=-1
min_samples_leaf=5
min_samples_split=2
min_purity_increase=0.0

model = build_forest(labels, features,
                     n_subfeatures,
                     n_trees,
                     partial_sampling,
                     max_depth,
                     min_samples_leaf,
                     min_samples_split,
                     min_purity_increase)

r2 =  nfoldCV_forest(labels, features,
                     n_folds,
                     n_subfeatures,
                     n_trees,
                     partial_sampling,
                     max_depth,
                     min_samples_leaf,
                     min_samples_split,
                     min_purity_increase)

# 准确率
# 3-element Array{Float64,1}:
#  0.94
#  1.0
#  0.96
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

October-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值