01-分类和回归-决策树

机器学习中两大类问题,分类和回归

  • 回归:how much
  • 分类: yes/no

决策树

决策树是一种常见的分类算法

性别 职业 喜好
女1 学生 王者农药
女2 工作 小红书
男1 工作 学习强国
女3 工作 小红书
男2 学生 王者农药
男3 学生 王者农药

思考题1

  • 一个工作中的女性,你应该推荐什么应用给她?
  • 一个在政府上班的男性,你推荐什么应用给他?
  • 一个在上高中的女学生,你推荐什么应用给她?

思考题2

  • 在年龄和职业两个因素中,哪个更会决定,用户下载软件的类型

image-20191118000455600

决策树计算机求解

如何让计算机找出来数据的关系,分析出来哪个因素决定性更强

image-20191118165637195

问题,上图的表, 水平的线 还是垂直的线更适合拆分数据?

信息论入门

A,B,C,D 四个选项,选什么好呢?

image-20191118014836496

当小明不知道选ABCD的哪一个选项时,

你告诉小明D是错的,提供了0.415bits的信息,

再告诉小明A是错的,又提供了 0.585bits的信息,

再告诉小明b是错的,提供了1bits的信息

能够算出来上面的三个数字, 才算是理解了信息论。

信息是如何计算的,为什么还有单位?

因为物理量是一个物理量

长度的定义:1米,在0度时,一根铂铱合金的长度,保存在巴黎,国际米元器。

image-20191118020307191

重量的定义:1立方分米的纯水在4℃时的质量 ,并用铂铱合金制成原器,保存在巴黎,后称国际千克原器。

衡量一个物体多长,就看一下需要多少个米原器去度量。

衡量一个物体多重,就看一下需要多少个重量的参考物。

信息消除的是不确定性, 参考的是抛硬币。

抛硬币有50%的正面概率和反面概率, 抛一次硬币的信息是1bits

抛两次硬币的信息有4种,抛3次是8种, 不是简单的乘法,除法运算关系。 是指数和对数运算关系。

ABCD四个选项的不确定性是2个bits(在abcd等比例分布的情况下)

\log _{2}4-\log _{2}3\simeq 0.415

\log _{2}\dfrac {1}{3}-\log _{2}\dfrac {1}{4}\simeq 0.415

信息论和熵(entropy)

长 - 短

快 - 慢

熵 - 秩

熵: 表明的是内部分子的混乱程度。

image-20191118030057600

信息论

每次从盒子里面取一个球,记录颜色,取完后把球重新放回盒子再充分打散,连续4次。

求: 最终颜色和盒子之前颜色状态一致的可能性。

P(红色) P(蓝色) P(胜利)
红红红红 1 0 1x1x1x1=1
红红红蓝 0.75 0.25 0.75x0.75x0.75x0.25=0.105
红红蓝蓝 0.5 0.5 0.5x0.5x0.5x0.5=0.0625

概率越小,信息量越小。

概率越小,熵越大。

概率越大,信息量越大。

概率越大,熵越小。

物体越混乱,分布越均匀,信息量越小。

思考一个问题:

1000个球的话,那种情况P(胜利)最小,熵最大。

0.5的1000次方= 9.332636185032189e-302 ,是一个非常小的数据, 计算机不适合做非常小的数据的计算,精度会丢失,计算效率又很慢。

如何把这种乘法转化成一种容易计算的比较大一点的数据运算呢?

计算机不喜欢小的数, 浮点数,小数点后面多少位? 双精度浮点型,小数点后面多少位? 另外乘法不利于运算和比较,一旦有一项发生变化,整个结果都要重新乘一遍。

log函数,可以让乘法变成加法\log_{e} MN=\log_{e} M+\log_{e} N

0.75 * 0.75 * 0.75 * 0.75 * 0.75 = ?

log0.75 + log0.75 + log0.75 + log0.75 + log0.75 = ?

P(红色) P(蓝色) P(Right) -log_{2} P(Right) entropy熵(平均值)
红红红红 1 0 1x1x1x1=1 0+0+0+0=0 0
红红红蓝 0.75 0.25 0.75x0.75x0.75x0.25=0.105 0.415+0.415+0.415+2=3.245 0.81
红红蓝蓝 0.5 0.5 0.5x0.5x0.5x0.5=0.0625 1+1+1+1=4 1

上述公式,entropy 熵越大, 混乱程度越高,信息量越小。

image-20191118164852522

多分类熵计算

entropy=-\dfrac {m}{m+n}\log (\dfrac {m}{m+n})-\dfrac {n}{m+n}\log (\dfrac {n}{m+n})

假设

P_{1}=\dfrac {m}{m+n}

P_{2}=\dfrac {n}{m+n}

entropy=-P_{1}\log P_{1}-P_{2}\log P_{2}

推广到一般情况

entropy=-P_{1}\log P_{1}-P_{2}\log P_{2}-\ldots -P_{n}logP_{n}=-\sum ^{n}_{i=1}P_{i}\log P_{i}

思考题

哪个图的信息含量高,哪个题的熵小

image-20191118165357575

信息量(information gain)

Information\, gain=Entropy\left( Parent\right) - [ \dfrac {m}{m+n}Entropy\left( child_{1}\right) + \dfrac {n}{m+n}Entropy\left( child_{2}\right) ]

决策树算法

image-20191118165650969

让信息获取 information gain最大的算法。

之前的mse,在这就是information gain

随机深林

性别 年龄 籍贯 平台 工作 爱好 App
16 河南 IOS 学生 电子游戏 王者农药
26 广东 Android 工作 排球 小红书
33 山东 Android 工作 乒乓球 学习强国
40 福建 IOS 学生 乒乓球 小红书
12 山东 IOS 学生 台球 王者荣耀
14 广东 Android 学生 排球 王者荣耀

实际数据可能维度非常多,如何更好的做出决策呢, 一般我们随机选取两列因子,根据两列因子做出预测。

比如说按照性别和职业进行预测, 按照年龄和爱好进行预测 按照籍贯和平台进行预测。 每种预测好像都是一个人民群众, 最后按照人民群众的智慧进行投票决策。这种做法就叫做 random forest 随机深林

超级参数 hyper parameter

深度为k的决策树,最多能有$ 2^{k}$个叶子

超参:

  • max_depth: 决策树最多有多少层,决策树层数越多,越有可能过拟合。
  • min_samples_leaf: 一个叶子节点如果想继续分割,最少有多少个元素.
  • min_samples_split: 分割后的子节点里面最少有多少个元素

image-20191118173116128

决策树案例

用决策树来解决数据分类问题。

sklearn有决策树的工具包 叫 DecisionTreeClassifier

  1. 加载包,创建sklearn决策树的模型
1
2
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
  1. 加载数据集,进行训练
1
model.fit(x_values, y_values)
  1. 进行预测

    python print(model.predict([ [0.2, 0.8], [0.5, 0.4] ])) print(model.predict([ 0.2, 0.8]))

默认的生成的模型, 精确度可能不是特别高,我们需要调整超级参数,把精确度提升

1
>>> model = DecisionTreeClassifier(max_depth = 7, min_samples_leaf = 10)

过拟合和欠拟合

过拟合:泛化能力不强, 训练集预测数据准确性不错

欠拟合:训练集预测数据准确性不足

作业,调整参数

观察模型的泛化能力

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

import numpy as np

data = np.loadtxt('data2.csv',delimiter=',')

X = data[:,0:2]
y = data[:,2]

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state = 3 )


model = DecisionTreeClassifier(max_depth = 4, min_samples_leaf = 6)

model.fit(Xtrain,Ytrain)

ytest_predict = model.predict(Xtest)
ytrain_predict = model.predict(Xtrain)


acctrain = accuracy_score(Ytrain, ytrain_predict)
acctest = accuracy_score(Ytest, ytest_predict)

print("test={},train={}".format(acctest,acctrain))

决策树优缺点:

优点:

1、可以生成可以理解的规则

2、计算量相对不是很大

缺点:

1、对连续型字段比较难预测

2、当类别较多时,错误可能增加的比较快

3、对处理特征关联性比较强的数据时,表现的不是太好