train_test_split( ) scikit学习方法

train_test_split( ) method of scikit learn

我正在尝试使用 DecisionTreeClassifier 创建机器学习模型。为了训练和测试我的数据,我从 scikit learn 导入了 train_test_split 方法。但是我无法理解它的一个参数random_state

将数值分配给 model_selection.train_test_split 函数的 random_state 有什么意义?我如何知道要为我的决策树分配哪个数值 random_state?

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=324)

正如 docs 提到的那样,random_state 用于 train_test_split 中使用的随机数生成器的初始化(对于其他方法也类似)。由于实际拆分数据集有许多不同的方法,这是为了确保您可以对同一数据集多次使用该方法(例如,在一系列实验中)并始终获得相同的结果(即完全相同的训练和测试设置在这里),即出于 可重复性 的原因。它的确切值并不重要,您不必担心。

使用 docs 中的示例,设置 random_state=42 可确保您获得与此处显示的完全相同的结果(下面的代码实际上是 运行 在我的机器中,而不是复制- 从文档中粘贴):

import numpy as np
from sklearn.model_selection import train_test_split

X, y = np.arange(10).reshape((5, 2)), range(5)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, random_state=42)

X_train
# array([[4, 5],
#        [0, 1],
#        [6, 7]])

y_train
# [2, 0, 3]

X_test
# array([[2, 3],
#        [8, 9]])

y_test
# [1, 4]

你应该在上面的代码片段中尝试不同的 random_state 值(或者根本不指定它)以获得感觉。

random_state 参数只是为了播种随机顺序。如果你给不同的 random_state 它会以不同的顺序分割数据集。如果您每次都提供相同的 random_state,那么拆分将是相同的。数据集将按相同顺序拆分。

如果您希望数据集每次都以相同的顺序拆分,请提供相同的 random_state。

如果您每次执行代码时都没有指定 random_state,您将获得不同的(随机)拆分。相反,如果您提供 random_state 值,拆分将始终相同。它通常用于实验的再现性。

例如:

X = [[1,5],[2,6],[3,2],[4,7], [5,5], [6,2], [7,1],[8,6]]
y = [1,2,3,4,5,6,7,8]


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
X_train_rs, X_test_rs, y_train_rs, y_test_rs = train_test_split(X, y, test_size=0.33, random_state=324)

print("WITH RANDOM STATE: ")
print("X_train: {}\ny_train: {}\nX_test: {}\ny_test: {}".format(X_train_rs, X_test_rs, y_train_rs, y_test_rs))
print("WITHOUT RANDOM STATE: ")
print("X_train: {}\ny_train: {}\nX_test: {}\ny_test: {}".format(X_train, X_test, y_train, y_test))

如果您 运行 多次执行此代码,您可以看到没有随机状态的拆分在每个 运行 时都会发生变化。

sklearn documentation, random_state can be an integer if you want specify the random number generator seed (the most frequent case), or directly an instance of RandomState class 中所述。

为随机状态提供一个值将有助于在您重新运行程序时在拆分中重现相同的值。

如果您不为随机状态提供任何值,我们将在每次 运行 后获得不同的测试和训练值集。在这种情况下,如果你遇到任何错误,那将对调试没有帮助。

示例:

设置:

from sklearn.model_selection import train_test_split
import pandas as pd

data = pd.read_csv("diabetes.csv")
X=data.iloc[0:,0:8]
X.head()
y=data.iloc[0:,-1]
y.head()

循环 random_state:

for _ in range(2):
    X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42)
    print(X_train.head())
    print(X_test.head())
  • 注意两次迭代的数据相同

无循环 random_state:

for _ in range(2):
    X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33)
    print(X_train.head())
    print(X_test.head())
  • 注意两次迭代的数据不相同

如果您 运行 代码并查看输出,您会看到 random_state 相同时,它将提供相同的训练/测试集,但是 random_state没有提供,每次test/train中的值集都不一样。