CART分类及回归树

决策树模型

概念: 基于树形结构来拟合自变量与因变量之间的关系

划分算法: 选择最佳划分特征及特征中最佳划分点位置的算法

类别:

  • ID3:信息增益判断
  • C4.5:信息增益率判断
  • CAR:GINI系数判断

CART基尼系数法算法流程

  1. 跌代计算每个特征的每个二分切点gini系数
  2. 选取gini最小的特征及对应切分点为最佳分裂点
  3. 进行一次样本划分
  4. 对划分后的两部分样本重复以上迭代过程,逐步向下分裂
  5. 所有样本被分到叶子节点中
  6. 结束

剪枝策略

剪枝目的 :降低模型复杂度,防止过拟合

预剪枝: 在构建树的过程中,先计算当前的因此分裂是否能带来模型泛化能力的提升,如果不能,则不继续生产

后剪枝: 让算法生成一颗完整的决策树之后,然后从最底层向上计算,如果对分裂点剪枝,模型的泛化能力提升,则进行剪枝。

用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:指定样本各类别的的权重

绘图

环境准备:

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())

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jepson2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值