训练测试拆分中 Shuffle 和 Random_State 之间的区别?

Ech*_*che 5 python scikit-learn

我在一个小数据集样本上尝试了这两种方法,它返回了相同的输出。那么问题来了,scikit的train-test-split方法中的“shuffle”和“random_state”参数有什么区别?

MWE 代码:

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]]

Run Code Online (Sandbox Code Playgroud)

The*_*nce 11

有时,试验可能有助于理解函数的工作原理。

假设您有这样的 DataFrame:

   X  Y
0  A  2
1  A  3
2  A  2
3  B  0
4  B  0
Run Code Online (Sandbox Code Playgroud)

我们将讨论您可以使用该函数执行的不同操作train_test_split


  • 如果您输入train, test = train_test_split(df, test_size=2/5, shuffle=False, random_state=None),您将始终得到:
# TRAIN
   X  Y
0  A  2
1  A  3
2  A  2

#TEST
   X  Y
3  B  0
4  B  0
Run Code Online (Sandbox Code Playgroud)
  • 如果您输入train, test = train_test_split(df, test_size=2/5, shuffle=False, random_state=1)或任何其他 int for random_state,您将得到相同的结果:
# TRAIN
   X  Y
0  A  2
1  A  3
2  A  2

#TEST
   X  Y
3  B  0
4  B  0
Run Code Online (Sandbox Code Playgroud)

这是因为您决定不洗牌 dataset,因此random_state函数不使用它。


  • 现在,如果您这样做train, test = train_test_split(df, test_size=2/5, shuffle=True, random_state=None),您将获得如下所示的数据集:
# TRAIN
   X  Y
4  B  0
0  A  2
1  A  3

# TEST
   X  Y
2  A  2
3  B  0
Run Code Online (Sandbox Code Playgroud)

请注意,条目已被洗牌。但还要注意,如果您再次运行代码,结果可能会有所不同


  • 最后,如果你这样做train, test = train_test_split(df, test_size=2/5, shuffle=True, random_state=1)或任何其他 int for random_state,你也会得到两个带有混洗条目的数据集:
# TRAIN
   X  Y
4  B  0
0  A  2
3  B  0

# TEST
   X  Y
2  A  2
1  A  3
Run Code Online (Sandbox Code Playgroud)

只是,这一次,如果您再次使用相同的 运行代码 random_state输出将始终保持不变。您已经设置了一个种子,这对于结果的重现性非常有用!