Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
scipycon-2018-sklearn-tut-zh
提交
129c30f6
S
scipycon-2018-sklearn-tut-zh
项目概览
OpenDocCN
/
scipycon-2018-sklearn-tut-zh
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scipycon-2018-sklearn-tut-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
129c30f6
编写于
10月 01, 2018
作者:
飞
飞龙
提交者:
GitHub
10月 01, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 18.md
上级
7c6c2aec
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
32 deletion
+32
-32
18.md
18.md
+32
-32
未找到文件。
18.md
浏览文件 @
129c30f6
#
十八、深入:决策树与森林
#
十八、深入:决策树与森林
在这里,我们将探索一类基于决策树的算法。 最基本决策树非常直观。 它们编码一系列
`if`
和
`else`
选项,类似于一个人如何做出决定。 但是,从数据中完全可以了解要问的问题以及如何处理每个答案。
在这里,我们将探索一类基于决策树的算法。 最基本决策树非常直观。 它们编码一系列
`if`
和
`else`
选项,类似于一个人如何做出决定。 但是,从数据中完全可以了解要问的问题以及如何处理每个答案。
例如,如果你想创建一个识别自然界中发现的动物的指南,你可能会问以下一系列问题:
例如,如果你想创建一个识别自然界中发现的动物的指南,你可能会问以下一系列问题:
+
动物是大于还是小于一米?
+
较大:动物有角吗?
+
是的:角长是否超过十厘米?
+
不是:动物有项圈吗?
+
较小:动物有两条腿还是四条腿?
+
二:动物有翅膀吗?
+
四:动物有浓密的尾巴吗?
+
动物是大于还是小于一米?
+
较大:动物有角吗?
+
是的:角长是否超过十厘米?
+
不是:动物有项圈吗?
+
较小:动物有两条腿还是四条腿?
+
二:动物有翅膀吗?
+
四:动物有浓密的尾巴吗?
等等。 这种问题的二元分裂是决策树的本质。
等等。 这种问题的二元分裂是决策树的本质。
基于树的模型的主要好处之一是它们几乎不需要数据预处理。 它们可以处理不同类型的变量(连续和离散),并且对特征的缩放不变。
基于树的模型的主要好处之一是它们几乎不需要数据预处理。 它们可以处理不同类型的变量(连续和离散),并且对特征的缩放不变。
另一个好处是基于树的模型被称为“非参数”,这意味着他们没有一套固定的参数需要学习。 相反,如果给出更多数据,树模型可以变得越来越灵活。 换句话说,自由参数的数量随着样本量而增长并且不是固定的,例如在线性模型中。
另一个好处是基于树的模型被称为“非参数”,这意味着他们没有一套固定的参数需要学习。 相反,如果给出更多数据,树模型可以变得越来越灵活。 换句话说,自由参数的数量随着样本量而增长并且不是固定的,例如在线性模型中。
##
决策树回归
##
决策树回归
决策树是一种简单的二元分类树,类似于最近邻分类。 它可以这样使用:
决策树是一种简单的二元分类树,类似于最近邻分类。 它可以这样使用:
```
py
from
figures
import
make_dataset
...
...
@@ -46,11 +46,11 @@ plt.plot(X.ravel(), y, 'C7.', label="training data")
plt
.
legend
(
loc
=
"best"
);
```
单个决策树允许我们以非参数方式估计标签,但显然存在一些问题。 在某些地区,该模型表现出高偏差并且对数据欠拟合。 (请见不遵循数据轮廓的长扁形线条),而在其他区域,模型表现高方差并且过拟合数据(反映为受单点噪声影响的窄峰形)。
单个决策树允许我们以非参数方式估计标签,但显然存在一些问题。 在某些地区,该模型表现出高偏差并且对数据欠拟合。 (请见不遵循数据轮廓的长扁形线条),而在其他区域,模型表现高方差并且过拟合数据(反映为受单点噪声影响的窄峰形)。
##
决策树分类
##
决策树分类
决策树分类原理非常相似,通过将叶子中的多数类分配给叶子中的所有点:
决策树分类原理非常相似,通过将叶子中的多数类分配给叶子中的所有点:
```
py
from
sklearn.datasets
import
make_blobs
...
...
@@ -72,11 +72,11 @@ plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm2, s=60, alpha=.7, e
plt
.
scatter
(
X_test
[:,
0
],
X_test
[:,
1
],
c
=
y_test
,
cmap
=
cm2
,
s
=
60
,
edgecolor
=
'k'
);
```
有许多参数可以控制树的复杂性,但最容易理解的是最大深度。这限制了树可以对输入空间进行划分的精确度,或者在决定样本所在的类之前,可以询问多少
`if-else`
问题。
有许多参数可以控制树的复杂性,但最容易理解的是最大深度。这限制了树可以对输入空间进行划分的精确度,或者在决定样本所在的类之前,可以询问多少
`if-else`
问题。
此参数对于调整树和基于树的模型非常重要。下面的交互式图表显示了该模型的欠拟合和过拟合。
`max_depth`
为 1 显然是一个欠拟合的模型,而 7 或 8 的深度明显过拟合。对于该数据集,树可以生长的最大深度是 8,此时每个叶仅包含来自单个类的样本。这被称为所有叶子都是“纯的”。
此参数对于调整树和基于树的模型非常重要。下面的交互式图表显示了该模型的欠拟合和过拟合。
`max_depth`
为 1 显然是一个欠拟合的模型,而 7 或 8 的深度明显过拟合。对于该数据集,树可以生长的最大深度是 8,此时每个叶仅包含来自单个类的样本。这被称为所有叶子都是“纯的”。
在下面的交互式图中,区域被指定为蓝色和红色,来表明该区域的预测类。颜色的阴影表示该类的预测概率(较暗为较高概率),而黄色区域表示任一类的预测概率相等。
在下面的交互式图中,区域被指定为蓝色和红色,来表明该区域的预测类。颜色的阴影表示该类的预测概率(较暗为较高概率),而黄色区域表示任一类的预测概率相等。
```
py
from
figures
import
plot_tree
...
...
@@ -84,13 +84,13 @@ max_depth = 3
plot_tree
(
max_depth
=
max_depth
)
```
决策树训练快,易于理解,并且经常产生可解释的模型。 但是,单个树通常倾向于过拟合训练数据。 使用上面的滑块,你可能会注意到,即使在类之间有良好的分隔之前,模型也会开始过拟合。
决策树训练快,易于理解,并且经常产生可解释的模型。 但是,单个树通常倾向于过拟合训练数据。 使用上面的滑块,你可能会注意到,即使在类之间有良好的分隔之前,模型也会开始过拟合。
因此,在实践中,更常见的是组合多个树来产生更好泛化的模型。 组合树的最常用方法是随机森林和梯度提升树。
因此,在实践中,更常见的是组合多个树来产生更好泛化的模型。 组合树的最常用方法是随机森林和梯度提升树。
##
随机森林
##
随机森林
随机森林只是许多树,建立在数据的不同随机子集(带放回抽样)上,并对于每个分裂,使用特征的不同随机子集(无放回抽样)。 这使得树彼此不同,并使它们过拟合不同的方面。 然后,他们的预测被平均,产生更平稳的估计,更少过拟合。
随机森林只是许多树,建立在数据的不同随机子集(带放回抽样)上,并对于每个分裂,使用特征的不同随机子集(无放回抽样)。 这使得树彼此不同,并使它们过拟合不同的方面。 然后,他们的预测被平均,产生更平稳的估计,更少过拟合。
```
py
from
figures
import
plot_forest
...
...
@@ -98,7 +98,7 @@ max_depth = 3
plot_forest
(
max_depth
=
max_depth
)
```
##
通过交叉验证选择最优估计
##
通过交叉验证选择最优估计
```
py
from
sklearn.model_selection
import
GridSearchCV
...
...
@@ -122,9 +122,9 @@ clf_grid.score(X_train, y_train)
clf_grid
.
score
(
X_test
,
y_test
)
```
##
另一个选项:梯度提升
##
另一个选项:梯度提升
可能有用的另一种集合方法是提升:在这里,我们构建了一个由 200 个估计器组成的链,它迭代地改进了先前估计器的结果,而不是查看(比方说)200 个并行估计器。 我们的想法是,通过顺序应用非常快速,简单的模型,我们可以获得比任何单个部分更好的总模型误差。
可能有用的另一种集合方法是提升:在这里,我们构建了一个由 200 个估计器组成的链,它迭代地改进了先前估计器的结果,而不是查看(比方说)200 个并行估计器。 我们的想法是,通过顺序应用非常快速,简单的模型,我们可以获得比任何单个部分更好的总模型误差。
```
py
from
sklearn.ensemble
import
GradientBoostingRegressor
...
...
@@ -135,9 +135,9 @@ print(clf.score(X_train, y_train))
print
(
clf
.
score
(
X_test
,
y_test
))
```
>
练习:梯度提升的交叉验证
>
练习:梯度提升的交叉验证
>
>
使用网格搜索在数字数据集上优化梯度提升树`learning_rate`和`max_depth`。
>
使用网格搜索在数字数据集上优化梯度提升树`learning_rate`和`max_depth`。
```
py
from
sklearn.datasets
import
load_digits
...
...
@@ -151,9 +151,9 @@ X_digits, y_digits = digits.data, digits.target
# %load solutions/18_gbc_grid.py
```
##
特征的重要性
##
特征的重要性
`RandomForest`
和
`GradientBoosting`
对象在拟合之后都会提供
`feature_importances_`
属性。 此属性是这些模型最强大的功能之一。 它们基本上量化了在不同树的节点中,每个特征对表现的贡献程度。
`RandomForest`
和
`GradientBoosting`
对象在拟合之后都会提供
`feature_importances_`
属性。 此属性是这些模型最强大的功能之一。 它们基本上量化了在不同树的节点中,每个特征对表现的贡献程度。
```
py
X
,
y
=
X_digits
[
y_digits
<
2
],
y_digits
[
y_digits
<
2
]
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录