scikit learn 的 train_test_split() 方法

4

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

model_selection.train_test_split函数分配数字值的意义是什么?我应该如何决定为我的决策树分配哪个数字值来作为random_state?

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=324)
4个回答

8
根据文档中的说明,random_state用于随机数生成器在train_test_split中的初始化(同样适用于其他方法)。由于有很多不同的数据集拆分方式,因此需要确保您可以使用该方法多次并始终获得相同的结果(即在此处完全相同的训练和测试集),以实现可重复性。它的确切值并不重要,也不是您需要担心的事情。
使用文档中的示例,设置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值(或者根本不指定它)来获得感觉。


3

在随机状态中提供一个值可以帮助在重新运行程序时复制相同的拆分数值。

如果您不为随机状态提供任何值,则每次运行后测试和训练集都会得到不同的数值集。在这种情况下,如果遇到任何错误,则无法帮助调试。

示例:

设置:

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时,测试/训练集中的值集合每次都是不同的。


2
如果每次运行代码时不指定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文档中所解释的那样,如果要指定随机数生成器种子(最常见的情况),则random_state可以是整数,或者直接是RandomState类的实例。请注意,每次运行时都会得到相同的结果。

0

random_state参数只是用来生成随机顺序的种子。如果您提供不同的random_state,则会以不同的顺序拆分数据集。如果每次都提供相同的random_state,则拆分将保持相同。数据集将按相同的顺序拆分。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接