Machine Learning Notes-Decision Trees-Udacity
什么是 Decision Tree?
Decision Tree 可以把 Input 映射到离散的 Labels。对每个节点上的 Attribute 提问,取不同的 Value 走向不同的 Children,最终得到结果。
例如,这是一个不能 Linearly Separated 的问题,但是可以被 Decision Tree 分开。
当 instances 是连续的时候也可以用 DT。
怎样构建 Decision Tree?
先要找到最佳的 Attribute,然后提出合适的问题,可以把数据尽量地分成两份。
ID3 Algorithm 可以用来寻找 Best Attribute。
什么是 Best Attribute?
通俗地讲,就是最好可以直接把数据分成目标类别,用数学的角度衡量就是用 Entropy 来计算 Information Gain。
用 sklearn 来 create 和 train Decision Trees。
Step-1: Decision Tree Classifier
Resources: http://scikit-learn.org/stable/modules/tree.html#classification
def classify(features_train, labels_train):
### your code goes here--should return a trained decision tree classifer
from sklearn import tree
clf=tree.DecisionTreeClassifier()
clf=clf.fit(features_train, labels_train)
return clf
#!/usr/bin/python
""" lecture and example code for decision tree unit """
import sys
from class_vis import prettyPicture, output_image
from prep_terrain_data import makeTerrainData
import matplotlib.pyplot as plt
import numpy as np
import pylab as pl
from classifyDT import classify
features_train, labels_train, features_test, labels_test = makeTerrainData()
### the classify() function in classifyDT is where the magic
### happens--fill in this function in the file 'classifyDT.py'!
clf = classify(features_train, labels_train)
#### grader code, do not modify below this line
prettyPicture(clf, features_test, labels_test)
output_image("test.png", "png", open("test.png", "rb").read())
Decision Tree Boundary 很独特,像现代艺术,还有一些小岛。 但是有些 Overfitting,
Step-2: Accuracy
Resources: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html
import sys
from class_vis import prettyPicture
from prep_terrain_data import makeTerrainData
import numpy as np
import pylab as pl
features_train, labels_train, features_test, labels_test = makeTerrainData()
#################################################################################
########################## DECISION TREE #################################
#### your code goes here
from sklearn import tree
clf=tree.DecisionTreeClassifier()
clf=clf.fit(features_train, labels_train)
labels_predict=clf.predict(features_test)
from sklearn.metrics import accuracy_score
acc = accuracy_score(labels_test,labels_predict)
### you fill this in!
### be sure to compute the accuracy on the test set
def submitAccuracies():
return {"acc":round(acc,3)}
上述 Classifier 得到准确率大约在 91%,在这里有一些 Overfitting,我们也许可以通过 Tuning some Parameters 来改善这个精度。
Step-3: 接下来看哪些 Parameters 可以 Tune
Resource: Parameters of Decision Tree http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
DecisionTreeClassifier 有如下几个 Parameters
class sklearn.tree. DecisionTreeClassifier (criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, class_weight=None, presort=False)
其中 min_samples_split 如果太小,可能会造成 Overfitting,因为它的意思是,当 Node 上的值小于什么时就不能再分下去了,因此越小的话,分出来的层就越多。当把默认值改成 50 时,就看不到 Overfitting 的那条线了。
用代码运行一下,看哪个值可以得到更高的准确率:
import sys
from class_vis import prettyPicture
from prep_terrain_data import makeTerrainData
import matplotlib.pyplot as plt
import numpy as np
import pylab as pl
features_train, labels_train, features_test, labels_test = makeTerrainData()
########################## DECISION TREE #################################
### your code goes here--now create 2 decision tree classifiers,
### one with min_samples_split=2 and one with min_samples_split=50
### compute the accuracies on the testing data and store
### the accuracy numbers to acc_min_samples_split_2 and
### acc_min_samples_split_50, respectively
from sklearn import tree
clf_2=tree.DecisionTreeClassifier(min_samples_split=2)
clf_2=clf_2.fit(features_train, labels_train)
labels_predict_2=clf_2.predict(features_test)
clf_50=tree.DecisionTreeClassifier(min_samples_split=50)
clf_50=clf_50.fit(features_train, labels_train)
labels_predict_50=clf_50.predict(features_test)
from sklearn.metrics import accuracy_score
acc_min_samples_split_2=accuracy_score(labels_test,labels_predict_2)
acc_min_samples_split_50=accuracy_score(labels_test,labels_predict_50)
def submitAccuracies():
return {"acc_min_samples_split_2":round(acc_min_samples_split_2,3),
"acc_min_samples_split_50":round(acc_min_samples_split_50,3)}
比较 min_samples_split 等于50 的时候,精度比 2 的时候大。
{"message": "{'acc_min_samples_split_50': 0.912, 'acc_min_samples_split_2': 0.908}"}
熵,很重要,决定着 Decision Tree 如何划分 data。
Definition: measure of impurity of a bunch of examples.
Formular:
例: 下面这个例子,计算它的 Entropy:
最后的 Entropy 结果如下:
那么熵是如何影响 Decision Tree 的呢? Information Gain:
Decision Tree 就是要最大化 Information Gain
现在看 grade 这个node上,当 grade=steep 时,slow和fast的熵是多少,当 grade=flat 时,这个熵=0,因为只有一类 fast,取对数时=0. Remember we are calculating entropy, not counting observations. What is the entropy of a set that contains observations of the same class?
例:
数据:
要计算Information Gain:
Entropy of Parent,即 speed
Entropy of Children,即 grade
其中 flat children的熵是:
其中 steep children的熵是:
接着计算公式的后半部分:
最后得到 Information gain=1-3/4*0.9184-0=0.3112
接着计算下一个Children
所以 bumpiness 的 Information Gain=0,也就是我们没有从 bumpiness 得到任何有用的信息。
接着看 speed limit 这个children的 Information Gain=1,也就是非常的 Pure,这是我们希望用来 split 的因素。
综上, steep children 的 Information gain=0.3112 bumpiness 的 Information Gain=0 speed limit 的 Information Gain=1 所以选择 speed limit 来作为split node。
此外 Decision Tree 的这个Parameter :criterion='gini' 也是可以 Tune 的,gini index 是类似于 metric of impurity,它和 Entropy Information Gain 略有不同,但是效果是一样的。
Bias and Variance
Strengths and Weakness
Weakness:
prone to overfitting: when lots of features, complicate tree so, need to tune parameters, stop the growth of trees at appropriate time.
Strengths:
Ensemble method: Build bigger classifier out of decision trees,
- 分享超炫的表白页面和爱的纪念日源码
- 分享WordPress Mobile Pack汉化精简版及隐藏指定插件更新提示的方法
- Tomcat重启脚本For Windows
- js获取url中?后的参数,修复移动版无法切换到电脑版的BUG
- nginx配置文件参数详解
- LVS中Windows作为真实主机(RealServer)时的设置方法
- 菜鸟教程:Ngnix安装详解
- 教你如何去掉友荐和无觅的隐藏外链和版权链接
- 重置多说配置后的问题,这是不让我从良的节奏啊(附禁用谷歌在线字体的方法)!
- 10个超有趣的Linux命令
- 张戈博客惊现WordPress恶意代码,各位WP博主要注意下了!
- 分享一个多说头像的动态酷炫CSS样式
- 在Linux中发现IP地址冲突的方法
- 教你如何查看Linux的CPU负载
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 自定义springboot-starter揭秘自动配置骚操作
- 【大厂面试题】Redis中是如何实现分布式锁的?
- 最近公司招人,研发组商量了下,暂时定下这么多java面试题!
- 市面上数据库种类那么多,如何选择?
- 玩转正则!推荐一个速查、调试、验证、可视化工具
- 当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?
- Js实现文本复制
- 当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?处理器映射器与处理器篇
- anetTcpGenericConnect 详解
- 详解 MySQL 基准测试和sysbench工具
- 第六天:网络处理(anet部分)-- redis源码慢慢学,慢慢看【redis6.0.6】
- python爬王者荣耀壁纸
- 搞定三大神器之 Python 装饰器
- 当一个http请求来临时,SpringMVC究竟偷偷帮你做了什么?请求映射器篇
- rabbitpy使用purge不生效