- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章分析机器学习之决策树Python实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在开始学习前,需要准备好相应的环境配置。这里我选择了anaconda,创建了一个专门的虚拟环境来学习机器学习。这里关于anaconda的安装等就不赘述了,没有难度.
通俗的说,有督促学习方法就是需要一个标签,即在知道答案的基础上进行模型训练。决策树就是从数据中读取出特定的特征,根据这些特征总结出决策规,然后使用树结构来呈现.
得益于强大的sklearn库,让我们使用决策树的算法十分简单:
在这里,我们引入红酒数据集,这是一个很小的数据集.
1
2
3
4
|
from
sklearn
import
tree
from
sklearn.datasets
import
load_wine
from
sklearn.model_selection
import
train_test_split
wine
=
load_wine()
|
然后我们就可以看看数据集长啥样了:
1
2
3
4
5
6
7
8
9
10
11
12
|
wine.data.shape
(
178
,
13
)
wine.target
array([
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
])
|
但这么看似乎不是很直观。我们使用pandas转换成表格格式:
1
2
|
import
pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis
=
1
)
|
可以看到,这个数据集只有178行,14列。数据量还是很小的。最后一列是我们的标签,每个数字对应一个具体的分类.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
wine.feature_names
[
'alcohol'
,
'malic_acid'
,
'ash'
,
'alcalinity_of_ash'
,
'magnesium'
,
'total_phenols'
,
'flavanoids'
,
'nonflavanoid_phenols'
,
'proanthocyanins'
,
'color_intensity'
,
'hue'
,
'od280/od315_of_diluted_wines'
,
'proline'
]
|
可以看到,每个列对应一个特征,如0号列对应的就是alcohol,即酒精含量。其他的以此类推.
在看完数据集后,我们直接上手训练模型呗! 。
1
2
3
4
|
x_train,x_test,y_train,y_test
=
train_test_split(wine.data,wine.target,test_size
=
0.3
)
clf
=
tree.DecisionTreeClassifier(criterion
=
"entropy"
)
clf
=
clf.fit(x_train,y_train)
score
=
clf.score(x_test,y_test)
# 返回预测的准确度accuracy
|
先分测试集,即第一行代码。然后我们调用函数,使用fit来训练,score来打分。运行这段代码,我们看看得了多少分:
百分之九十的准确率,还是十分高的.
但这么看,似乎不是很直观啊。我们可以把这棵树画出来:
1
2
3
4
5
6
7
8
9
10
11
|
feature_name
=
[
'酒精'
,
'苹果酸'
,
'灰'
,
'灰的碱性'
,
'镁'
,
'总酚'
,
'类黄酮'
,
'非黄烷类酚类'
,
'花青素'
,
'颜色强度'
,
'色调'
,
'od280/od315稀释葡萄酒'
,
'脯氨酸'
]
import
graphviz
# filled 颜色 rounded 圆角
dot_data
=
tree.export_graphviz(clf
,feature_names
=
feature_name
,class_names
=
[
"琴酒"
,
"雪莉"
,
"贝尔摩德"
]
,filled
=
True
,rounded
=
True
)
graph
=
graphviz.Source(dot_data)
graph
|
这里我们引入了graphviz包,画出了我们刚才的决策树:
这里的class是随便写的,你也可以写别的.
可以看到,我们这棵树中并没有使用所有的特征,可能只使用了四五个的样子。我们可以使用一个函数来看看每个特征的百分比:
1
2
3
4
|
clf.feature_importances_
array([
0.
,
0.
,
0.03388406
,
0.
,
0.
,
0.
,
0.42702463
,
0.
,
0.
,
0.24446215
,
0.
,
0.
,
0.29462916
])
|
可以看到,我们只用了4个特征,得出了一颗树。这么看似乎不是很直观,我们用zip函数和对应的特征联一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[
*
zip
(feature_name,clf.feature_importances_)]
[(
'酒精'
,
0.0
),
(
'苹果酸'
,
0.0
),
(
'灰'
,
0.03388405728736582
),
(
'灰的碱性'
,
0.0
),
(
'镁'
,
0.0
),
(
'总酚'
,
0.0
),
(
'类黄酮'
,
0.42702463433869187
),
(
'非黄烷类酚类'
,
0.0
),
(
'花青素'
,
0.0
),
(
'颜色强度'
,
0.24446214572197708
),
(
'色调'
,
0.0
),
(
'od280/od315稀释葡萄酒'
,
0.0
),
(
'脯氨酸'
,
0.29462916265196526
)]
|
这样我们就会发现,占比最大的就构成了决策树的根节点,然后以此类推.
为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上.
暂且不去理解所谓不纯度的概念,这个参数我们有两种取值:entropy与gini。那么这两种算法有什么区别呢?
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音过多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。当模型拟合程度不足的时候,即当模型在训练集和测试集上都表现不太好的时候,使用信息熵。当然,这些不是绝对的.
简单来说,我们在调参时可以两个都试试,默认是gini。因为这两个算法其实并没有绝对说用哪个.
random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来.
splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式.
这两个参数可以让树的模型稳定,并且更好的使用模型.
1
2
3
4
5
6
7
|
clf
=
tree.DecisionTreeClassifier(criterion
=
"entropy"
,random_state
=
0
,splitter
=
"random"
)
clf
=
clf.fit(x_train, y_train)
score
=
clf.score(x_test, y_test)
score
|
比如我们添加了一些参数后,再次运行:
可以发现准确率飞到了98%,这说明我们参数的调整还是很有用的.
在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一棵决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足.
简单的说,我们需要对决策树进行限制,不能让他无限制的增长下去,不然只会让模型过拟合.
max_depth:
限制树的最大深度,超过设定深度的树枝全部剪掉。这是使用的最广泛的剪枝参数,实际使用建议从3开始尝试.
min_samples_leaf & min_samples_split:
min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生.
min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生.
这段话看起来很绕口,我们结合代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
clf
=
tree.DecisionTreeClassifier(criterion
=
"entropy"
,random_state
=
30
,splitter
=
"random"
,max_depth
=
4
#,min_samples_leaf=12
#,min_samples_split=10
,
)
clf
=
clf.fit(x_train, y_train)
dot_data
=
tree.export_graphviz(clf
,feature_names
=
feature_name
,class_names
=
[
"琴酒"
,
"雪莉"
,
"贝尔摩德"
]
,filled
=
True
,rounded
=
True
)
graph
=
graphviz.Source(dot_data)
graph
|
可以自己去跑一下理解一下.
max_features & min_impurity_decrease:
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法.
但我们怎么确定一个参数是最优的呢?我们可以通过画图的方式来查看:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import
matplotlib.pyplot as plt
from
matplotlib.pyplot
import
MultipleLocator
test
=
[]
for
i
in
range
(
50
):
clf
=
tree.DecisionTreeClassifier(max_depth
=
4
,criterion
=
"entropy"
,random_state
=
30
,splitter
=
"random"
,min_samples_leaf
=
i
+
5
)
clf
=
clf.fit(x_train, y_train)
score
=
clf.score(x_test, y_test)
test.append(score)
x_major_locator
=
MultipleLocator(
2
)
plt.plot(
range
(
1
,
51
),test,color
=
"green"
,label
=
"min_samples_leaf"
)
ax
=
plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.legend()
plt.show()
|
我们就可以清晰的看到了最高点出现在什么地方,进而更好的调参.
完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重.
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分.
以上就是分析机器学习之决策树Python实现的详细内容,更多关于Python实现决策树的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/wushenjiang/p/14430853.html 。
最后此篇关于分析机器学习之决策树Python实现的文章就讲到这里了,如果你想了解更多关于分析机器学习之决策树Python实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我刚刚继承了一个旧的 PostgreSQL 安装,需要进行一些诊断以找出该数据库运行缓慢的原因。在 MS SQL 上,您可以使用 Profiler 等工具来查看正在运行的查询,然后查看它们的执行计划。
将目标从Analytics(分析)导入到AdWords中,然后在Analytics(分析)中更改目标条件时,是否可以通过更改将目标“重新导入”到AdWords,还是可以自动选择? 最佳答案 更改目标值
我正在使用google analytics api来获取数据。我正在获取数据,但我想验证两个参数,它们在特定日期范围内始终为0。我正在获取['ga:transactions']和['ga:goalCo
我使用Google API从Google Analytics(分析)获取数据,但指标与Google Analytics(分析)的网络界面不同。 即:我在2015年3月1日获得数据-它返回综合浏览量79
我在我的Web应用程序中使用sammy.js进行剔除。我正在尝试向其中添加Google Analytics(分析)。我很快找到了following plugin来实现页面跟踪。 我按照步骤操作,页面如
当使用 Xcode 分析 (product>analyze) 时,有没有办法忽略给定文件中的任何错误? 例如编译指示之类的? 我们只想忽略第三方代码的任何警告,这样当我们的代码出现问题时,它对我们
目录 EFK 1. 日志系统 2. 部署ElasticSearch 2.1 创建handless服务 2.2 创建s
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
GCC/G++ 是否有可用于输出分析的选项? 能够比较以前的代码与新代码之间的差异(大小、类/结构的大小)将很有用。然后可以将它们与之前的输出进行比较以进行比较,这对于许多目的都是有用的。 如果没有此
我正在浏览 LYAH,并一直在研究处理列表时列表理解与映射/过滤器的使用。我已经分析了以下两个函数,并包含了教授的输出。如果我正确地阅读了教授的内容,我会说 FiltB 的运行速度比 FiltA 慢很
在 MySQL 中可以使用 SET profiling = 1; 设置分析 查询 SHOW PROFILES; 显示每个查询所用的时间。我想知道这个时间是只包括服务器的执行时间还是还包括将结果发送到前
我用 Python 编写了几个用于生成阶乘的模块,我想测试运行时间。我找到了一个分析示例 here我使用该模板来分析我的模块: import profile #fact def main():
前几天读了下mysqld_safe脚本,个人感觉还是收获蛮大的,其中细致的交代了MySQL数据库的启动流程,包括查找MySQL相关目录,解析配置文件以及最后如何调用mysqld程序来启动实例等,有着
上一篇:《人工智能大语言模型起源篇,低秩微调(LoRA)》 (14)Rae 和同事(包括78位合著者!)于2022年发表的《Scaling Language Models: Methods, A
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
我有四列形式的数据。前三列代表时间,value1,value 2。第四列是二进制,全为 0 或 1。当第四列中对应的二进制值为0时,有没有办法告诉excel删除时间、值1和值2?我知道这在 C++ 或
我正在运行一个进行长时间计算的 Haskell 程序。经过一些分析和跟踪后,我注意到以下内容: $ /usr/bin/time -v ./hl test.hl 9000045000050000 Com
我有一个缓慢的 asp.net 程序正在运行。我想分析生产服务器以查看发生了什么,但我不想显着降低生产服务器的速度。 一般而言,配置生产盒或仅本地开发盒是标准做法吗?另外,您建议使用哪些程序来实现这一
我目前正在尝试分析 Haskell 服务器。服务器永远运行,所以我只想要一个固定时间的分析报告。我尝试只运行该程序 3 分钟,然后礼貌地要求它终止,但不知何故,haskell 分析器不遵守术语信号,并
我是一名优秀的程序员,十分优秀!