决策树和随机森林
程序员文章站
2024-03-19 21:18:46
...
决策树之特征选择依据
决策树由根节点、非叶子节点和叶子节点三部分组成。
信息熵:代表了信息的程度,类别数越多,熵值越大,信息越丰富;类别数越少,熵值越小,信息量越小。
实例:,我们有14天的打球情况数据,有4个特征,如何选择特征构造决策树?我们以信息熵为例讲解一下。
决策树算法除了以信息增益为依据,还可以以有信息增益率,基尼系数等。
信息增益率
对于基于天气划分的信息增益率:
0.247/(0.971+0+0.971)
基尼系数
依然以天气特征作为例子:
根据天气数据可以分为三个部分(sunny、overcast和rainy),分别有5个,4个,5个。在sunny部分有一天打球;在overcast有4天打球,在rainy有3天打球
剪枝策略
创建决策树模型以及查看决策树
本代码以经纬度作为特征数据进行试验
import pandas as pd
import matplotlib.pyplot as plt
#sklearn 的数据集有好多个种
#自带的小数据集(packaged dataset):sklearn.datasets.load_<name>
#可在线下载的数据集(Downloaded Dataset):sklearn.datasets.fetch_<name>
#计算机生成的数据集(Generated Dataset):sklearn.datasets.make_<name>
#svmlight/libsvm格式的数据集:sklearn.datasets.load_svmlight_file(...)
#从买了data.org在线下载获取的数据集:sklearn.datasets.fetch_mldata(...)
from sklearn.datasets.california_housing import fetch_california_housing#导入波士顿房屋数据
from sklearn import tree
from IPython.display import Image
import pydotplus
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
housing=fetch_california_housing()#导入房屋数据
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 = 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())#转化为.png
graph.write_png("dtr.png")#保存到本地
选择更新决策树参数在训练
#决策树
housing.data_train,housing.data_test,housing.target_train,housing.target_test=train_test_split(housing.data[:,[6,7]],
housing.target,test_size=0.1,
random_state=42)
dtr1=tree.DecisionTreeRegressor(random_state=42)
dtr1.fit(housing.data_train,housing.target_train)
print("决策树验证集得分:"+str(dtr1.score(housing.data_test,housing.target_test)))
#决策树参数选择
tree_param_grid = { 'max_depth': list((2,4,6)),'min_samples_split':list((2,5,7))}
grid_tree=GridSearchCV(tree.DecisionTreeRegressor(),param_grid=tree_param_grid, cv=5)
grid_tree.fit(housing.data_train, housing.target_train)
#print("具体用法模型不同参数下交叉验证的结果:",grid_tree.cv_results_)
print("最佳模型下的分数和最佳模型参数" ,grid_tree.best_params_, grid_tree.best_score_)
dtrnew=tree.DecisionTreeRegressor(max_depth=6,min_samples_split=7)
dtrnew.fit(housing.data_train,housing.target_train)
print("决策树参数更新验证集得分:"+str(dtrnew.score(housing.data_test,housing.target_test)))