%matplotlib inline # 如果不是jupyter notebook 可无视
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets.california_housing import fetch_california_housing
from sklearn import tree
import pydotplus
from IPython.display import Image
from sklearn.model_selection import train_test_split
housing = fetch_california_housing()
print(housing.DESCR)
housing.data.shape
dtr = tree.DecisionTreeRegressor(max_depth = 2) # 最大深度设定为2
dtr.fit(housing.data[:, [6, 7]], housing.target) # 第7列和第8列代表经纬度数据
决策树DecisionTreeRegressor的参数:
1.criterion: gini or entropy(默认Gini,entropy为C4.5)
2.splitter: best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)(默认为best)
3.max_features: int or None,log2,sqrt,N 特征小于50的时候一般使用所有的
4.max_depth: (最常用,预剪枝里面最核心模块)数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下
5.min_samples_split: (最常用)如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
6.min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值,大些如10W可是尝试下5
7.min_weight_fraction_leaf: (不常用)这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
8.max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。
9.class_weight: 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。
10.min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
11.n_estimators:要建立树的个数
dot_data = tree.export_graphviz(
dtr, # 需要改
out_file = None,
feature_names = housing.feature_names[6:8], # 需要改
filled = True,
impurity = False,
rounded = True
)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")
Image(graph.create_png())
graph.write_png("dtr_white_background.png")
可视化export_graphviz参数
1.decision_tree : 决策树回归器或分类器。要导出到GraphViz的决策树。
2.out_file: 文件对象或字符串,可选(默认值=无)。输出文件的句柄或名称。如果为无,结果将作为字符串返回。
3.max_depth: int,可选(默认值=无)。表示的最大深度。如果没有,则完全生成树。
4.feature_names: 字符串列表,可选(默认=无),每个功能的名称。
5.class_names: 字符串列表,布尔或无,可选(默认为无),每个目标类的名称以升序排列。仅与分类相关,不支持多输出。如果为真,则显示类名的符号表示。
6.label: {‘all ‘,’ root ‘,’ none’},可选(默认='all '),是否显示杂质的信息标签等。选项包括“全部”显示在每个节点,“根”仅显示在顶部根节点,或“无”不显示在任何节点。
7.filled: bool,可选(默认值=False),当设置为“真”时,绘制节点以指示分类的多数类、回归的极值或多输出的节点纯度。
8.leaves_parallel: bool,可选(默认值=False),当设置为“真”时,在树的底部绘制所有叶节点。
9.impurity: 布尔值,可选(默认值=真),当设置为真时,显示每个节点的杂质。
10.node_ids: bool,可选(默认值=False),当设置为真时,显示每个节点上的标识号。
11.proportion: 布尔值,可选(默认值=假),当设置为真时,将“值”和/或“样本”的显示分别更改为比例和百分比。
12.rotate: 布尔型,可选(默认值=假),当设置为真时,从左到右而不是从上到下定向树。
13.rounded: bool,可选(默认值=假),当设置为真时,用圆角绘制节点框,并使用Helvetica字体而不是罗马体。
14.special_characters: bool,可选(默认值=假),设置为假时,忽略特殊字符以保证PostScript兼容性。
15.precision: int,可选(默认值=3),每个节点的杂质值、阈值和值属性中浮点精度的位数。
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)
dtr.score(data_test, target_test) # 模型的精度值
train_test_split的参数: