python机器学习手写算法系列——决策树

本系列另一篇文章《线性回归》
https://blog.csdn.net/juwikuang/article/details/78420337

本文源代码地址:
https://github.com/juwikuang/machine_learning_step_by_step

你也可以直接看源代码,我用了jupyter notebook,源代码中有详细的说明。

数据集

数据来源于我的Github项目。 Data from here:

https://github.com/juwikuang/china_job_survey

我爬了全国的招聘信息,然后以上海为例子,选择了收入最高的25%和最低的25%,以他们作为两类。通过机器学习的分类模型,找出程序员如何成功(成为收入最高的25%)的秘诀。
最近正好朋友介绍了一本书,成功的公式。它也是通过大量数据,找出成功的公式的。我决心好好分析数据,找出程序员成功的Formula。

数据集已经通过GitHub共享。

字段说明

dataset 说明,

low=工资是否低,low=0表示高工资,low=1表示低工资。这是我们的label,或者说y,或者叫应变量。其他的叫features,或者叫X,或者叫自变量。

注意我这里y是小写,X是大写,因为y是vector,X是matrix

ageism=是否有年龄歧视,我检查招聘信息里面,是否有【岁】字,是则是年龄歧视。

career_algorithm, career_architect, career_software_engineer=这里对职业(career),进行了one-hot-encoding。

其他100多个feature就不一一解释了。这里并不是写论文,等他们出现了再说。

为了简单起见,所有的feature都是bool型的

决策树

决策树其实很容易理解,我们先看看相亲决策树吧。

在这里插入图片描述
对,这就是决策树。现在你有了感性认识了。

决策树Decision Tree(DT),是通过某种选择机制(entropy或者gini),找到能够把数据分成正负两组的特征。往往需要多次划分,才能得到满意的结果,所以,最后得到的模型,看起来就像一颗树。所以叫决策树。

这个算法,概括的来说,就是不断的寻找一个最优解(最优特征+最优分割点),把数据集一分为二,使集合纯度最高(label为true的和false尽量分开),直到分了n层。

具体来说,就是:

加载数据,遍历每个特征,用每个特征去划分数据集。

这里的特征,可能是bool型的,那就最好了,true的一组,false的一组,直接分成了两组。

也可能是数值型的,那就要把数据从小到大排序,不断的增大切割点的数值,只到找到最优的解。

如果特征是字典型的(categorical,如天气分为晴天,阴天,下雨)的,现在一般是用one-hot-encoding转化成几个bool型。

每个特征的最优解,都是用entropy或者gini表示的,等遍历完了所有的特征,就比较他们的entrop或者gini,选出最优的。

用最优解把数据集一分为二,再对子数据集运用上面的步骤,直到决策树已经达到了一定深度。

决策树的flow chart
在这里插入图片描述

集合纯度

集合纯度是决策树的难点重点,我们需要找到一种数学方法,去计算集合的纯度。常用的有熵(entropy)和基尼(gini)。

Entropy

根据维基百科,信息熵(Information Entropy)的数学定义为:
The function from wikipedia:
在这里插入图片描述

def information_entropy(counts):
    percentages = counts/np.sum(counts)
    S=0
    for p in percentages:
        if p==0:
            continue
        S=S-(p*np.log2(p))
    return S

这里p表示百分比,S表示信息熵。S越小,数据集的纯度越高。以我们的数据集为例,假如所有人都是高收入,则S等于0,这时S最小,数据集最纯。

information_entropy([0,1])

返回值0.0

information_entropy([1/2,1/2])

返回值1.0

我们的数据集呢?我们算一下

n_high=2244 #有2244人拿高工资
n_low=2647 #有2647人拿低工资
information_entropy([n_low, n_high])

返回值0.995

可见,信息熵接近于1,说明我们数据集的纯度非常低。 The information entropy is close to one, indicating it is very impure.

假如我们用会不会python,把数据集切开。

data_python=data[data.pl_python==1]
data_not_python=data[~data.pl_python==1]

                
  • 23
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

织网者Eric

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

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

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

打赏作者

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

抵扣说明:

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

余额充值