决策树属于监督式机器学习,一般是通过训练带有标签的数据进行分类,然后来预测没有带有标签的数据 属于那个类别。监督式学习问题可以进一步被分为回归和分类问题。决策树(这里作为一个大类)也包含分类(剪枝决策树分类器、随机森林)和回归(回归随机森林)。
这里列举一些比较好的文章
决策树[1,2,3]
随机森林[1,2,3]
回归随机森林[1,2,3]
决策树的构建是基于样本概率和纯度来进行的,判断数据集是否“纯”可以通过三个公式进行判断:Gini系数、熵(Entropy)、错误率。三个公式的值越大,表示数据越不纯。值越小,表示数据越纯。当计算出各个特征属性的量化纯度值后,使用信息增益度来选择出当前数据集的分割特征属性。如果信息增益度值越大,表示在该特征属性上会损失的纯度越大,那么该属性越应该在决策树的上层。下面是具体的公式
优点:
缺点:
几个注意的点
通用的调参方法:
下面使用鸢尾花数据集,做预测分析,鸢尾花是带有标签的数据。从准确率来看, 决策树CART算法的准确率更高一点。随机森林在一些低维且带有标签的数据上,表现确认不如存粹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
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
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
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