首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么python中的决策树算法每次运行都会改变?

为什么python中的决策树算法每次运行都会改变?
EN

Stack Overflow用户
提问于 2022-03-01 12:14:29
回答 1查看 168关注 0票数 0

我正在学习关于使用python的数据科学的udemy课程。本课程侧重于算法的输出,而较少关注算法本身。特别是,我正在执行一个决策树。每次我在python上运行算法,也使用相同的样本,算法给我一个稍微不同的决策树。我问过导师,他们告诉我:“决策树不能保证每一次运行的结果是相同的,因为它的性质。”有人可以解释我为什么要更详细的解释,或者给我一个好书的建议?

我完成了数据导入的决策树:

代码语言:javascript
复制
import numpy as np
import pandas as pd
from sklearn import tree

并执行以下命令:

代码语言:javascript
复制
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X,y)

其中X是我的特征数据,y是我的目标数据。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-03-01 13:19:20

DecisionTreeClassifier()函数显然是在这里记录的:

https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

所以这个函数有很多参数。但是在Python中,函数参数可能有默认值。在这里,所有参数都有默认值,因此甚至可以使用空参数列表调用函数,如下所示:

代码语言:javascript
复制
clf = tree.DecisionTreeClassifier()

感兴趣的参数random_state如下所示:

random_state: int,RandomState实例或None,default=None

因此,你的呼吁相当于,除其他外:

代码语言:javascript
复制
clf = tree.DecisionTreeClassifier(random_state=None)

None值告诉库,您不想为底层伪随机数生成器提供种子(即初始状态)。因此,图书馆必须找到一些种子。

通常,它将接受当前的时间值,如果可能的话,具有微秒的精度,并应用一些散列函数。所以每次调用时,你都会得到不同的初始状态,以及不同的伪随机数序列。因此,另一棵树。

你可能想试着强迫种子。例如:

代码语言:javascript
复制
clf = tree.DecisionTreeClassifier(random_state=42)

看看你的问题是否还存在。

现在,关于,为什么决策树需要伪随机数,例如讨论这里

根据scikit-learn的“最佳”和“随机”实现4,“最佳”分配器和“随机”分配器都使用基于Fisher-Yates的算法计算特征数组的排列。

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle是计算随机排列的最常用的方法。此外,如果在完成之前停止,它可以用于提取数据样本的随机子集,例如,如果需要随机抽取10%的样本,将其排除在数据拟合之外,并留出供以后的交叉验证步骤使用。

侧注:在某些情况下,不可重现性可能成为一个痛点,例如,如果您想研究外部参数的影响,比如一些全局Y值偏差。在这种情况下,您不希望随机数中不受控制的更改会模糊参数更改的影响。因此,API需要提供某种方式来控制种子值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71308342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档