机器学习之决策树

 决策树概述

所谓的决策树就是从跟节点开始一步步走到叶子节点,所有的数据最终都会落到叶子节点上。决策树既可以做分类也可以做回归。

决策数有两大优点:1)决策树模型可以读性好,具有描述性,有助于人工分析;2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。

如何切分特征(选择节点)

我们的目标应该是根节点就像一个老大似的能更好的切分数据(分类的效果更好),根节点下面的节点自然就是二当家了。所有我们的目标就是通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,以此类推。

                                                     这个衡量标准就是-------熵

正经的官方解释是-----熵是表示随机变量不确定性的度量。

说白了就是物体内部的混乱程度,比如杂货商店,里面什么东西都有,这个店里的熵值就大。而专卖店里面只买一个牌子的东西,这个店的熵值就小~~~~

而熵的公式为                           H(X)=- ∑ pi * logpi, i=1,2, ... , n

例如  集合A [1,1,1,1,1,2,2]

         集合B [1,2,3,4,5,6,7]

显然A集合的熵值要低,因为A里面只有两种类别,相对稳定一些而B中类别太多了,熵值就会大很多。
也就是说,不确定性越大,得到的熵值也就越大。。。。。

那么如何选择一个决策树的节点呢?

这就要再考虑------信息增益

信息增益:表示特征X使得类Y的不确定性减少的程度。
这里我们用一个简单的示例,来解释什么叫信息增益

我们一个14天的打球的数据情况

有4种环境变化特征。根据这些我们构建一个决策树。

根据这4个特征一开始我们有4中划分

应该选择哪个当一开始的根节点呢?

这里我们就要用到信息增益了。

在历史数据中(14天)有9天打球,5天不打球。所以此时的熵为

我们先分析基于天气划分的情况

Outlook = sunny时,熵值为0.971
Outlook = overcast时,熵值为0
Outlook = rainy时,熵值为0.971
根据数据统计,outlook取值分别为sunny,overcast,rainy的概率分别为:5/14, 4/14, 5/14

熵值计算:5/14 * 0.971 + 4/14 * 0 + 5/14 * 0.971 = 0.693
信息增益:系统的熵值从原始的0.940下降到了0.693,增益为0.247
同样的方式可以计算出其他特征的信息增益,那么我们选择最大的那个就可以,相当于是遍历了一遍特征,找出来了大当家,然后再其余的中继续通过信息增益找二当家!

上面的概述就是一个决策树的一种算法ID3

ID3算法就是对各个feature信息计算信息增益,然后选择信息增益最大的feature作为决策点将数据分成两部分,然后再对这两部分分别生成决策树。

但是,但是ID3是有问题的

就是如果对于一个特征(在上面例子中加一个ID的特征,ID[1,2,3,4,5,6,7]),那么在进行ID3算法的时候,这个特征的熵是0,而它的信息增益是最大的,这样会影响生成决策树。

在这个算饭(ID3)的基础上,引进C4.5算法。这个算法就是引进了一个信息增益率(在考虑信息增益的前提下,也考虑自身的熵)

信息增益率=信息增益/自身的熵值

还有一种算法是CART,这个算法是使用GINI系数来当做衡量标准。和熵的衡量标准类似,计算方式不相同-

那么对于连续值,应该怎么处理呢。

对于连续值,先排序后进行‘二分’,分成一个左子树一个又子树。然后计算信息增益。多次遍历二分后判断信息增益大的进行拆分。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

决策树剪枝策略

为什么要剪枝:决策树过拟合风险很大,理论上可以完全分得开数据(想象一下,如果树足够庞大,每个叶子节点不就一个数据了嘛)

剪枝策略:预剪枝,后剪枝
预剪枝:边建立树边剪枝,比如一开始有10个特征,如果全部进行决策树,那么树的深度是10,如果我们只采用里面的5个特征,那就能减少树的深度。但是光减少树的深度还是不够的。我们也要减少树的宽度。就是控制叶子节点里面的数据的个数。

后剪枝:当建立完决策树后来进行剪枝操作。

现在普遍是进行预剪枝。可以减少模型的复杂度。加快模型训练的时间。

代码实例

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)

采用sklearn自带的数据集。

from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth = 2)
dtr.fit(housing.data[:, [6, 7]], housing.target)

设置模型参数。开始训练,这里只是采用数据集的第6和第7个特征进行训练。

树模型参数:

  • 1.criterion gini or entropy 衡量标准,熵值还是gini系数。

  • 2.splitter best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)。很少改这个参数。

  • 3.max_features 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 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。

  • n_estimators:要建立树的个数

那到底该选择什么想的参数是最理想的呢。这里我们采用交叉验证的方法。

首先我们先把数据进行切分,分成数据集和测试集

from sklearn.model_selection import train_test_split
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)

先输出一次结果

0.637318351331017

这里random_state是保证每次数据都是一致的。

from sklearn.grid_search import GridSearchCV
tree_param_grid = { 'min_samples_split': list((3,6,9)),'n_estimators':list((10,50,100))}
grid = GridSearchCV(RandomForestRegressor(),param_grid=tree_param_grid, cv=5)
grid.fit(data_train, target_train)
grid.grid_scores_, grid.best_params_, grid.best_score_
([mean: 0.78405, std: 0.00505, params: {'min_samples_split': 3, 'n_estimators': 10},
  mean: 0.80529, std: 0.00448, params: {'min_samples_split': 3, 'n_estimators': 50},
  mean: 0.80673, std: 0.00433, params: {'min_samples_split': 3, 'n_estimators': 100},
  mean: 0.79016, std: 0.00124, params: {'min_samples_split': 6, 'n_estimators': 10},
  mean: 0.80496, std: 0.00491, params: {'min_samples_split': 6, 'n_estimators': 50},
  mean: 0.80671, std: 0.00408, params: {'min_samples_split': 6, 'n_estimators': 100},
  mean: 0.78747, std: 0.00341, params: {'min_samples_split': 9, 'n_estimators': 10},
  mean: 0.80481, std: 0.00322, params: {'min_samples_split': 9, 'n_estimators': 50},
  mean: 0.80603, std: 0.00437, params: {'min_samples_split': 9, 'n_estimators': 100}],
 {'min_samples_split': 3, 'n_estimators': 100},
 0.8067250881273065)

上面的代码中,只选择了2个参数进行(cv=5次)交叉验证。最后打印出结果。

最后我们可以得到最优的结果,参数选择'min_samples_split': 3, 'n_estimators': 100

我们把得到的最优的参数进行模型的训练

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

结果为

0.80908290496531576

以上就是决策树的一些基本概念。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
决策树是常用的机器学习算法之一,通过对数据的分类和特征值计算来完成对未知数据的预测。本文将介绍使用Python实现决策树算法的相关步骤。 首先,需要导入决策树算法工具包,使用以下代码: ```python from sklearn import tree ``` 然后,导入训练数据和测试数据,并进行预处理。为了方便起见,在本文采用生成随机数的方式来生成样本数据,使用以下代码: ```python from sklearn.datasets import make_classification X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=0, random_state=0, shuffle=False) ``` 接下来,使用生成的样本数据进行模型训练。这里使用scikit-learn的DecisionTreeClassifier()函数。 ```python clf = tree.DecisionTreeClassifier() clf = clf.fit(X, y) ``` 训练后,调用predict()方法进行对测试数据的预测,使用以下代码: ```python y_pred = clf.predict(X) ``` 最后,评估模型的准确率,使用以下代码: ```python from sklearn.metrics import accuracy_score print(accuracy_score(y, y_pred)) ``` 这就是使用Python实现决策树算法的基本过程决策树可以根据数据的不同特征进行分类,是一个简单且常用的分类算法。决策树算法也可用于回归问题,例如预测一个数的大小。与其他机器学习算法相比,决策树具有易于理解和可解释的优点,同时还可以处理非线性的分类问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值