Python scikit在分割数据集中学习随机状态
有谁能告诉我为什么我们在拆分训练集和测试集时将随机状态设置为零Python scikit在分割数据集中学习随机状态,python,random,machine-learning,scikit-learn,Python,Random,Machine Learning,Scikit Learn,有谁能告诉我为什么我们在拆分训练集和测试集时将随机状态设置为零 X_train, X_test, y_train, y_test = \ train_test_split(X, y, test_size=0.30, random_state=0) 我见过这样的情况,随机状态设置为1 X_train, X_test, y_train, y_test = \ train_test_split(X, y, test_size=0.30, random_state=1) 交叉验证中这
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.30, random_state=0)
我见过这样的情况,随机状态设置为1
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.30, random_state=1)
交叉验证中这种随机状态的结果是什么?随机状态是0还是1或任何其他整数都无关紧要。重要的是,如果您希望在多次运行代码时验证您的处理,那么应该将其设置为相同的值。顺便说一句,我已经在许多官方的scikit示例以及其他地方看到了使用的
random_state=42
random_state
顾名思义,用于初始化内部随机数生成器,它将决定将数据拆分为训练和测试索引。报告中指出:
如果random_state为None或np.random,则返回随机初始化的RandomState对象
如果random_state是一个整数,则它用于为新的RandomState对象种子
如果random_state是一个RandomState对象,那么它将被传递
这是为了在多次运行代码时检查和验证数据。设置
random_state
一个固定值将保证每次运行代码时生成相同的随机数序列。除非过程中存在其他随机性,否则产生的结果将一如既往。这有助于验证输出。随机_状态会拆分随机选择的数据,但会扭曲。扭曲是指对于特定的随机状态值,数据的顺序是相同的。你需要知道它不是一个布尔接受值。从0开始到任何整数否,如果您作为随机_状态传递,它将是它的永久顺序。例:在random_state=0
中得到的顺序保持不变。之后,如果您执行random_state=5
,然后再次返回random_state=0
,您将得到相同的顺序。和0一样,所有的整数都是一样的。
如何random\u state=None
每次随机拆分
如果仍有疑问,请观看如果您在代码中未提及随机_状态,则每当您执行代码时,都会生成一个新的随机值,并且每次训练和测试数据集都会有不同的值
但是,如果您每次都为random_state(random_state=1或任何其他值)使用特定值,则结果将是相同的,即,训练数据集和测试数据集中的值相同。我们使用随机状态参数,用于在每个历元后训练数据集初始洗牌的再现性。当随机状态设置为整数时,每次执行时,训练测试分割将返回相同的结果
当随机_状态设置为无时,训练测试_分割将为每次执行返回不同的结果 请参见以下示例:
from sklearn.model_selection import train_test_split
X_data = range(10)
y_data = range(10)
for i in range(5):
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3,random_state = 0) # zero or any other integer
print(y_test)
print("*"*30)
for i in range(5):
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3,random_state = None)
print(y_test)
输出:
[2,8,4]
[2,8,4]
[2,8,4]
[2,8,4]
[2,8,4]
[4,7,6] [4,3,7] [8,1,4] [9,5,8]
[6,4,5]对于模型的多次执行,随机状态确保训练和测试数据集的数据值相同。它修复了列车测试分割的数据顺序如果您没有在代码中指定随机状态,那么每次运行(执行)代码时都会生成一个新的随机值,列车和测试数据集每次都会有不同的值
但是,如果指定一个固定值,如random\u state=0或1或42,则无论执行代码多少次,结果都是相同的。即,列车和测试数据集中的值相同。随机状态默认为“无”,这意味着每次运行程序时,由于列车和测试之间的分离不同,您将获得不同的输出
random_state=任何int值意味着每次运行程序时,您都会得到相同的输出,因为列车和测试之间的分离不会在内变化。随机_状态是一个整数值,它意味着选择列车和测试的随机组合。当您将测试大小设置为1/4时,会生成一组列和测试的排列和组合,每个组合都有一个状态。 假设您有一个数据集-->[1,2,3,4]
Train | Test | State
[1,2,3] [4] **0**
[1,3,4] [2] **1**
[4,2,3] [1] **2**
[2,4,1] [3] **3**
我们需要它,因为当模型的参数调整时,同样的状态会被反复考虑。
这样就不会有任何精确的推断了
但在随机森林的情况下,也有类似的情况,但以不同的方式对变量进行了r.t。@Scott Hunter它来自sklearn.cross\u验证。但是随机状态为0和1对训练和测试分割有什么影响呢?
train\u test\u split
的文档说明了什么?@Scott Hunter这只是为了确保每次运行脚本时都获得相同的分割。读一读伪随机数发生器。(像32525352这样的数字会产生与0或1相同的效果;它只是一个映射到某个内部状态的常数)如果不这样做,它会根据时间进行种子设定,从而在大多数跑步中产生不同的结果。奇怪的是,它可能会重复,每次我似乎都会重新运行分类指标,如特异性和敏感性,等,我得到了我的分数变化,尽管事实上,我有一个集_种子。知道为什么吗?在训练测试分割之外,是否还有其他地方需要设置种子,例如在.fit()或.score或.predict()下?我不相信我在任何地方有任何其他的随机性来源。@mathlover我也在我的输出中观察到了同样的随机性。我所发现的是,当你将某个值设置为random\u state
时,在我的例子中,像mean\u absolute\u error
这样的输出会得到修复(我的意思是每次运行它时,它都会输出相同的值),而值本身是d