决策树模型
概念: 基于树形结构来拟合自变量与因变量之间的关系
划分算法: 选择最佳划分特征及特征中最佳划分点位置的算法
类别:
- ID3:信息增益判断
- C4.5:信息增益率判断
- CAR:GINI系数判断
CART基尼系数法算法流程
- 跌代计算每个特征的每个二分切点gini系数
- 选取gini最小的特征及对应切分点为最佳分裂点
- 进行一次样本划分
- 对划分后的两部分样本重复以上迭代过程,逐步向下分裂
- 所有样本被分到叶子节点中
- 结束
剪枝策略
剪枝目的 :降低模型复杂度,防止过拟合
预剪枝: 在构建树的过程中,先计算当前的因此分裂是否能带来模型泛化能力的提升,如果不能,则不继续生产
后剪枝: 让算法生成一颗完整的决策树之后,然后从最底层向上计算,如果对分裂点剪枝,模型的泛化能力提升,则进行剪枝。
用sklearn实现决策树模型
用到的房价预测数据集:https://download.csdn.net/download/d1240673769/20910882
数据读取及xy提取
# 数据读取以及xy提取
import pandas as pd
import matplotlib.pyplot as plt
# 样例数据读取
df = pd.read_excel('realestate_sample_preprocessed.xlsx')
# 根据共线性矩阵,保留与房价相关性最高的日间人口,将夜间人口和20-39岁夜间人口进行比例处理
def age_percent(row):
if row['nightpop'] == 0:
return 0
else:
return row['night20-39']/row['nightpop']
df['per_a20_39'] = df.apply(age_percent,axis=1)
df = df.drop(columns=['nightpop','night20-39'])
# 制作标签变量
price_median = df['average_price'].median()
df['is_high'] = df['average_price'].map(lambda x: True if x>= price_median else False)
print(df['is_high'].value_counts())
# 数据集基本情况查看
print(df.shape)
print(df.dtypes)
# 划分数据集
x = df[['complete_year','area', 'daypop', 'sub_kde',
'bus_kde', 'kind_kde','per_a20_39']]
y = df['is_high']
print(x.shape)
print(y.shape)
构建决策树模型
### 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
# 如果是回归问题,就要引入回归模型
from sklearn.tree import DecisionTreeRegressor
# 建立模型
clf_tree = DecisionTreeClassifier(criterion='gini',
splitter='best',
max_depth=3,
min_samples_split=2,
min_samples_leaf=5,
max_features=None,
max_leaf_nodes=10,
min_impurity_decrease=0.0,
min_impurity_split=None,
class_weight=None)
# 训练决策树模型
clf_tree.fit(x,y)
print(clf_tree)
决策树参数讲解
-
criterion:划分算法 默认是gini,另外一种是entropy就是信息增益, 回归模型可以选择mse或mae
-
splitter:两个选择,best或者random。
-
max_features:控制所搜的特征数量
-
max_depth: 控制树的深度
-
min_samples_split: 任意节点样本量达到多少的时候就不再分裂
-
min_samples_leaf:每一个叶子上最少的样本数
-
max_leaf_nodes:最大叶节点数量
-
min_impurity_decrease: 切分点不纯度最小减少程度
-
min_impurity_split: 切分点最小不纯度
-
class_weight:指定样本各类别的的权重
绘图
环境准备:
- 安装 graphviz 和 pydotplus包
- 安装 Graphviz软件
Graphviz 下载地址:https://graphviz.gitlab.io/_pages/Download/Download_windows.html
下载后,安装到 D:/Program Files/Graphviz
import graphviz
# https://graphviz.gitlab.io/_pages/Download/Download_windows.html
import os
os.environ["PATH"] += os.pathsep + 'D:/Program Files/Graphviz/bin' # 将Graphviz添加到环境变量中
from IPython.display import Image
import pydotplus
features = ['complete_year','area', 'daypop', 'sub_kde',
'bus_kde', 'kind_kde','per_a20_39']
classes=['lower_price','higher_price']
# 定义图像
from sklearn import tree
tree_graph_data = tree.export_graphviz(clf_tree,
feature_names=features,
class_names=classes,
filled=True,
rounded=True)
# 绘图:
tree_graph = pydotplus.graph_from_dot_data(tree_graph_data)
Image(tree_graph.create_png())