我在一个小数据集样本上尝试了这两种方法,结果返回的是相同的输出。所以问题是,在scikit的train-test-split方法中,”shuffle”和”random_state”参数有什么区别?
最小工作示例的代码:
X, y = np.arange(10).reshape((5, 2)), range(5)train_test_split(y, shuffle=False)Out: [[0, 1, 2], [3, 4]]train_test_split(y, random_state=0)Out: [[0, 1, 2], [3, 4]]
回答:
有时候通过实验可以帮助理解一个函数是如何工作的。
假设你有一个这样的DataFrame:
X Y0 A 21 A 32 A 23 B 04 B 0
我们将介绍你可以使用train_test_split
函数进行的不同操作:
- 如果你输入
train, test = train_test_split(df, test_size=2/5, shuffle=False, random_state=None)
,你将始终得到以下结果:
# TRAIN X Y0 A 21 A 32 A 2#TEST X Y3 B 04 B 0
- 如果你输入
train, test = train_test_split(df, test_size=2/5, shuffle=False, random_state=1)
或任何其他整数作为random_state
,你将得到同样的结果:
# TRAIN X Y0 A 21 A 32 A 2#TEST X Y3 B 04 B 0
这是因为你决定不打乱数据集,所以
random_state
参数不会被函数使用。
- 现在,如果你执行
train, test = train_test_split(df, test_size=2/5, shuffle=True, random_state=None)
,你将得到一个看起来像这样的数据集:
# TRAIN X Y4 B 00 A 21 A 3# TEST X Y2 A 23 B 0
注意,条目已经被打乱。但同样要注意,如果你再次运行代码,结果可能会有所不同。
- 最后,如果你执行
train, test = train_test_split(df, test_size=2/5, shuffle=True, random_state=1)
或任何其他整数作为random_state
,你将得到两个条目也被打乱的数据集:
# TRAIN X Y4 B 00 A 23 B 0# TEST X Y2 A 21 A 3
只是这一次,如果你再次运行代码并使用相同的
random_state
,输出将始终保持不变。你已经设置了一个种子,这对于结果的可重复性很有用!