train_test_split和分类器中random_state的作用

3
根据这个回答:Scikit learn中的随机状态(伪随机数),如果我使用相同的整数(比如42)作为random_state,则每次进行训练测试拆分时,它应该给出相同的拆分(即每次运行时训练中的相同数据实例,测试也是一样的)。
但是,
  1. for test_size in test_sizes:
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=42)
        clf = SVC(C=penalty, probability=False)
    

    Suppose I have a code like this. In this case, I am changing the test_size in each loop. How will it effect what random_state does? Will it shuffle everything OR keep as many rows intact as possible and shift a few rows from train to test (or vice versa) according to the test size?

  2. Also, random_state is a parameter for some classifiers like sklearn.svm.SVC and sklearn.tree.DecisionTreeClassifier. I have a code like this:

    clf = tree.DecisionTreeClassifier(random_state=0)
    scores = cross_validate(clf, X_train, y_train, cv=cv)
    cross_val_test_score = round(scores['test_score'].mean(), prec)
    clf.fit(X_train, y_train)
    

    What does random_state exactly do here? Because it is used while defining the classifier. It is not supplied with data yet. I got the following from http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html:

如果是int类型,random_state表示随机数生成器的种子; 如果是RandomState实例,则random_state是随机数生成器; 如果为None,则随机数生成器是由np.random使用的RandomState实例。
  1. Suppose the following line is executed multiple times for each of multiple test-sizes:

    clf = tree.DecisionTreeClassifier(random_state=0)
    

    If I keep random_state=int(test_size*100), does that mean that for each test-size, the results will come out to be the same? (and for different test-sizes, they will be different?)

    (Here, tree.DecisionTreeClassifier could be replaced with other classifiers who also use random_state, such as sklearn.svm.SVC. I assume all classifier use random_state in a similar way?)


DecisionTreeClassifier 中的 random_state 控制特征排列的顺序(至少如此),因此可能会影响选择哪个特征进行分割。这里有一个很好的答案,提供了其他分类器的一些额外信息。 - Stev
2个回答

2

1: 因为您正在更改测试大小,所以随机状态不会影响在测试大小之间选择的行,并且这也不一定是期望的行为,因为您只是试图基于各种样本大小获得分数。这将允许您比较使用相同随机状态拆分的输入数据的模型。测试集将从一个循环运行到下一个完全相同。这样可以让您在相同样本上正确比较模型性能。

2: 对于决策树分类器和许多其他模型,有一些初始化参数是随机设置的。这里的随机状态确保从一个运行到下一个设置这些参数时完全相同,从而创建可重复的行为。

3: 如果测试大小不同,并且将其乘以100,则将为每个测试集创建不同的随机状态。但从一个完整的运行到下一个完全相同。您也可以在那里设置静态值。

并非所有模型都像每个模型都有不同的随机状态使用方式,因为它们具有不同的随机参数。对于RandomForest,它选择随机特征... 对于神经网络,它初始化随机权重...等等。


关于第一点的澄清,特定的随机状态意味着特定的数据条目排列方式,这是随机生成的。正确吗?另外,如果我保持random_state=int(test_size*100),会发生什么?对于相同的test_size,结果相同,而对于不同的test_sizes则不同吗? - dc95
1
是的,那是正确的。我相信我在第三点回答了test_size * 100的问题。我注意到你在修改问题并添加了我的回答。但是再次强调,这样做会在单次运行中产生不同的随机状态,但只要test_size保持一致,它仍然可以从一次运行到下一次进行复现。(即你没有添加或更改长度) - Chris Farr

1
您可以使用以下代码进行检查:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 42,test_size = .3)
size25split = train_test_split(test_series,random_state = 42,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

这将输出70,表示它只是将测试集中的元素移动到训练集中。 train_test_split创建行的随机排列,并基于该排列的前n行进行选择,其中n基于测试大小。
“random_state”在这里的作用是什么?
当创建名为“clf”的DecisionTreeClassifier对象时,它的random_state属性被初始化为0。请注意,如果您键入print(clf.random_state),将打印值0。当您调用clf的方法,例如clf.fit,这些方法可能会使用random_state属性作为参数。

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