决策树(判断谁会电脑游戏)

原理概述

树模型
     决策树:从根节点开始一步步走到叶子节点(决策)
     所有数据最终都会落到叶子节点,既可以做分类也可以做回归。


举例:

现在家里有五个人,我要做一个类任务。判断谁会电脑游戏,首先判断年龄是否是小于15岁,只要大于15岁就假定他不愿意玩;小于15岁时,再判断性别,认为男的会玩,女的不会玩。
在这里插入图片描述
所有数据都是从根节点开始一步步往下走,最终走到叶子节点。决策树不仅能做分类,也能做回归。


为什么把年龄放在根节点呢?
    因为年龄判断的效果会比性别好,一般会把效果好的放在根节点。

树的组成:
根节点:第一个选择点
非叶子节点与分支:中间过程
叶子节点:最终决策的结果

节点

增加节点就像是在数据中切一刀,左边为根据年龄切一刀结果,右边为根据年龄切一刀。越多特征,越多节点,切的刀数越多。
在这里插入图片描述在这里插入图片描述
表面上看,切的刀数越多越好

决策树的训练和测试
训练阶段:从给定的训练集构造出一棵树(从根节点开始选择特征,如何进行特征切分)。主要问题。
测试阶段:根据构造出来的树的模型从上到下走一遍。(把数据在模型中从上到下走一遍)
一旦构造哈喽决策树,分类任务或者预测任务就很简单了,只需要走一遍就可以了,那么难点就在于如何构造一棵树出来。
如何切分特征(选择节点)
问题:根节点的选择该用哪个特征?接下来呢?如何切分呢?

根节点就像是一个老大能是一个能更好切分数据的节点,比如上面年龄和性别这两个特征,在玩电脑游戏的问题上年龄是老大,而性别这个特征就像是二当家。选了根节点之后,就在剩下的特征中继续选出剩下的特征中效果最好的,以此类推。


衡量标准——熵

    :熵表示随机变量的不确定性。说白了就是物体内部的混乱程度,比如在杂货市场里面什么都有,是混乱的,熵值高;而专卖店里面只卖一个牌子,就稳定的多,熵值低。比如说我要买一双XX运动鞋,我在杂货市场买到它的概率是很低的,而我在XX专卖店里买大奥它的概率是很大的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

决策树构造实例

在14天的打球数据中,根据天气,温度,湿度,风力判断是否适合打球
在这里插入图片描述
划分方式
在这里插入图片描述
在这个四个特征中把哪个当做根节点呢?


天气
在这里插入图片描述
当outlook-sunny时,计算:-2/5log22/5-3/5log23/5=0.971
在这里插入图片描述

决策树剪枝策略

过拟合:在训练集上结果表现很好,在测试集上很差。
剪枝可以防止过拟合。
在这里插入图片描述

预剪枝:边建立边剪枝,可以控制树的深度。(更使用)
后剪枝:先建立好决策树,然后在剪枝。

在这里插入图片描述



代码

树模型参数

在这里插入图片描述
1.衡量标准:gini(基尼系数)和entropy(信息熵)
2.默认是best,best是所有特征中找最好的,random是部分特征数据(适合数据量大的)
3.默认是所有
4.最大深度:限制最大深度是预剪枝最核心的一块,特征多的时候可限制一下。
5.6.控制叶子节点的样本数
7.控制叶子节点的权重
8.控制最大叶子节点数,防止过拟合
在这里插入图片描述
9.指定样本各类别权重
10.限制决策树的增长
11.建立数的个数(比如随机森林就是有很多棵树的)

1. 导入库

# 导入库
import matplotlib.pyplot as plt
import pandas as pd

2.导入数据集

# 导入内置数据集,房价数据集
from sklearn.datasets.california_housing import fetch_california_housing

housing = fetch_california_housing()
print(housing.DESCR)

输出结果

.. _california_housing_dataset:
California Housing dataset
--------------------------
**Data Set Characteristics:**
    :Number of Instances: 20640
    :Number of Attributes: 8 numeric, predictive attributes and the target
    :Attribute Information:
        - MedInc        median income in block
        - HouseAge      median house age in block
        - AveRooms      average number of rooms
        - AveBedrms     average number of bedrooms
        - Population    block population
        - AveOccup      average house occupancy
        - Latitude      house block latitude
        - Longitude     house block longitude
    :Missing Attribute Values: None
This dataset was obtained from the StatLib repository.
http://lib.stat.cmu.edu/datasets/
The target variable is the median house value for California districts.
This dataset was derived from the 1990 U.S. census, using one row per census
block group. A block group is the smallest geographical unit for which the U.S.
Census Bureau publishes sample data (a block group typically has a population
of 600 to 3,000 people).
It can be downloaded/loaded using the
:func:`sklearn.datasets.fetch_california_housing` function.
.. topic:: References
    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,
      Statistics and Probability Letters, 33 (1997) 291-297

# (20640, 8)两万条数据,8个属性
housing.data.shape

输出结果

(20640, 8)

housing.data[0]

输出结果

[   8.3252       41.            6.98412698    1.02380952  322.
    2.55555556   37.88       -122.23      ]

3.设定参数,构造数模型

# 一般注意设置这两个参数,树的最大深度是2
dtr = tree.DecisionTreeRegressor(max_depth=2)
# 构造树模型,指定特征建模
# housing.data[:, [6, 7]]取第6/7列
dtr.fit(housing.data[:, [6, 7]], housing.target)

print(dtr)

输出结果

DecisionTreeRegressor(criterion='mse', max_depth=2, max_features=None,
                      max_leaf_nodes=None, min_impurity_decrease=0.0,
                      min_impurity_split=None, min_samples_leaf=1,
                      min_samples_split=2, min_weight_fraction_leaf=0.0,
                      presort=False, random_state=None, splitter='best')

构造数是没有指定的参数都会有一个默认参数

4.画出树
要画出树模型,首先要装一个工具graphviz

下载地址
https://graphviz.gitlab.io/_pages/Download/Download_windows.html


下载安装
在这里插入图片描述
下载完成后一直next安装即可


安装好后配置环境变量
1.添配置统变量
在这里插入图片描述
2.在path中加入
在这里插入图片描述
3.打开命令窗口,使用dot -version命令出现如下图即可
在这里插入图片描述

# 要可视化显示需要安装graphviz
dot_data = \
    tree.export_graphviz(
        dtr,
        out_file=None,
        feature_names=housing.feature_names[6:8],
        filled=True,
        impurity=False,
        rounded=True
    )

安装pydotplus

pip install pydotplus

在这里插入图片描述

import pydotplus

graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")

from IPython.display import Image

Image(graph.create_png())
# 保存图片
graph.write_png("dtr_white_background.png")

可能出现错误

若出现以下错误,'GraphViz\'s executables not found
在这里插入图片描述
添加以下代码:

import os
# 路径为你安装graphviz的安装路径
os.environ["PATH"] += os.pathsep + 'C:/mysoft/graphviz2-38/bin'

最终保存图片:一般保存都会选择png,png会比jpg清晰度好些。
在这里插入图片描述

5.数据切分

# 切分数据
from sklearn.model_selection import train_test_split

# test_size=0.1  取10%作为测试集  random_state随机种子
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)
a3 = dtr.score(data_test, target_test)
print(a3)

输出结果:

0.637355881715626

6.随机森林

# 随机森林
from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(random_state=42)
rfr.fit(data_train, target_train)
a4 = rfr.score(data_test, target_test)
print(a4)

输出结果:

0.7910601348350835

我们要选择一个参数,但是不知道哪个参数合适,我们可以进行一个遍历找出合适的,就可以使用sklearn的grid_search模块(网格搜索模块)。


rfr = RandomForestRegressor(min_samples_split=3, n_estimators=100, random_state=42)
rfr.fit(data_train, target_train)
a5 = rfr.score(data_test, target_test)
print(a5)

输出结果:

0.8088623476993486


a6 = pd.Series(rfr.feature_importances_, index=housing.feature_names).sort_values(ascending=False)
print(a6)

输出结果

MedInc 0.524257 AveOccup 0.137947 Latitude 0.090622
Longitude 0.089414 HouseAge 0.053970 AveRooms 0.044443
Population 0.030263

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值