- 课程资源 : 传送门
- 编程软件: VScode
- 编程语言: python3.6.6
基本概念
- 熵:描述不确定性的数学量,不确定性越大熵值越大
- 信息增益:表示特性X使得类Y的不确定性减少的程度,可以用熵值的变化来描述
- GINI系数: 和熵值的衡量标准类似,计算防止不同:
G i n i ( p ) = 1 − ∑ k = 1 K p k 2 Gini(p) = 1- \sum_{k=1}^{K} p_k^2 Gini(p)=1−k=1∑Kpk2
决策树的构建
遍历众多特征,计算每一次分类后的信息增益,选取分类后熵值最小的特征作为当前分类节点
决策树剪枝策略
防止过拟合,当每个数据都是一个叶结点的时候,分类正确率是100%,但是树过于庞大。
- 预剪枝:限制深度,叶节点个数,叶节点样本数,信息增益量
- 后剪枝: 通过一定便准衡量 C a ( T ) = C ( T ) + a ⋅ ∣ T l e a f ∣ C_a(T)=C(T)+a·|T_{leaf}| Ca(T)=C(T)+a⋅∣Tleaf∣叶节点越多损失越大
决策树涉及到的参数
- criterion gini or entropy : 选择衡量系数
- splitter best or random : 随机选择一些特征进行建立模型,默认best
- max_features None:选择特征数量,默认所有
- *max_depth:树的最大深度,特征量少不用管
- *min_samples_split:如果某节点样本数小于该值则不会继续选择最优特征进行划分,如果样本数量级很小,样本数量级很大时推荐增大该值
- min_samples_leaf:限制了叶节点最少样本数,如果叶节点数目小于样本数目则会和兄弟节点一起被裁剪,如果样本量不大,不需要这个值,当样本量大于10万时可以使用5
- min_weight_fraction_leaf:限制了叶子节点所有样本的权重和最小值,小于这个值则会被和兄弟节点一起被裁剪默认为0.当有较多的样本缺失值或者分类树样本分布类别偏差很大就会引入样本权重,此时我们要关注这个值。
- max_leaf_nodes:通过限制最大叶节点数目,防止过拟合,默认是None
- class_weight:指定样本各类别的权重
- min_impurity_split:限制树的生长,当节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个值则不再生成叶子结点。
- n_estimators:建立的树的个数
简单的代码实例以及说明
from sklearn.datasets.california_housing import fetch_california_housing
from sklearn import tree
housing = fetch_california_housing()
print(type(housing))
print(housing["data"])
print(type(housing["data"]))
dtr = tree.DecisionTreeRegressor(max_depth=2)
dtr.fit(housing["data"][:,[6,7]],housing["target"])
dot_data = \
tree.export_graphviz(
dtr,
out_file = None,
feature_names=hoseing["feature_names"][6:8],
filled = True,
impurity = False,
rounded = True
)
import os
os.environ["PATH"] += os.pathsep + 'D:/Program Files (x86)/Graphviz2.38/bin/'
#将Graphviz加入环境变量,如果在安装Graphviz时已经添加了环境变量,就不需要这一步
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")
graph.write_png("./res.png")
from sklearn.model_selection import train_test_split
#分割训练集
data_train,data_test,target_train,target_test = \
train_test_split(
housing["data"],
housing["target"],
test_size=0.1,
random_state = 42
)
dtr = tree.DecisionTreeRegressor(random_state = 42)
dtr.fit(data_train,target_train)
print(dtr.score(data_test,target_test))
from sklearn.ensemble import RandomForestRegressor
#系统自己调整参数
rfr = RandomForestRegressor(random_state = 42)
rfr.fit(data_train,target_train)
print(rfr.score(data_test,target_test))