【问题标题】:Role of random_state in train_test_split and classifiersrandom_state 在 train_test_split 和分类器中的作用
【发布时间】:2018-09-21 13:44:31
【问题描述】:

基于这个答案:Random state (Pseudo-random number)in Scikit learn,如果我使用与random_state 相同的整数(比如 42),那么每次进行训练测试拆分时,它应该给出相同的拆分(即训练中的相同数据实例在每次运行期间,测试相同)

但是,

  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)
    

    假设我有这样的代码。在这种情况下,我在每个循环中更改 test_size。它将如何影响random_state 的作用?它会打乱所有内容还是保持尽可能多的行完整,并根据测试大小将几行从训练转移到测试(反之亦然)?

  2. 另外,random_state 是一些分类器的参数,例如 sklearn.svm.SVCsklearn.tree.DecisionTreeClassifier。我有这样的代码:

    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)
    

    random_state 到底在这里做什么? 因为它是在定义分类器时使用的。它尚未提供数据。我从http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html 得到以下信息:

如果是int,则random_state是随机数生成器使用的种子; 如果是 RandomState 实例,则 random_state 是随机数生成器; 如果没有,随机数生成器是使用的 RandomState 实例 通过 np.random。

  1. 假设以下行针对多个测试大小中的每一个执行多次:

    clf = tree.DecisionTreeClassifier(random_state=0)
    

    如果我保留random_state=int(test_size*100),这是否意味着对于每个测试大小,结果都会相同? (对于不同的测试规模,它们会有所不同?)

    (这里,tree.DecisionTreeClassifier 可以替换为也使用random_state 的其他分类器,例如sklearn.svm.SVC。我假设所有分类器都以类似的方式使用random_state?)

【问题讨论】:

  • 2. DecisionTreeClassifier 中的 random_state 控制(至少)特征排列的顺序,因此可以影响选择要拆分的特征。 Here 是一个不错的答案,其中包含有关其他分类器的一些附加信息。

标签: python scikit-learn


【解决方案1】:

1:由于您正在更改测试大小,随机状态不会影响测试大小之间的选定行,而且这不一定是所需的行为,因为您只是试图根据不同的样本量获得分数。这为您做的,是允许您比较使用输入数据的模型,这些模型被相同的随机状态分割。从一个循环运行到下一个循环,测试集将完全相同。允许您在相同样本上正确比较模型性能。

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

3:如果测试大小不同,并且您将其乘以 100,那么您将为每个测试集创建不同的随机状态。但是从一次完整运行到下一次,它将产生可重现的行为。您可以在那里轻松地设置一个静态值。

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

【讨论】:

  • 关于第1点的说明,特定的随机状态是指数据条目的特定排列,它是随机生成的。正确的?另外,(我在你回答后在问题中添加了这部分)如果我保持 random_state=int(test_size*100) 会发生什么?相同的 test_size 的结果相同,不同的 test_size 的结果不同?
  • 是的,这是正确的。而且我相信我在上面的 3. 中回答了 test_size * 100。我注意到您正在添加问题并添加了我的回答。但重申一下,添加它会在一次运行中为您提供不同的随机状态,但只要 test_size 是一致的,从一次运行到下一次运行仍然可以重现。 (即您没有添加或更改长度)
【解决方案2】:

你可以用代码检查一下:

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 在这里做什么?

当创建名为clfDecisionTreeClassifier 对象时,它的random_state 属性会被初始化为0。请注意,如果您键入print(clf.random_state),则将打印值0。当你调用clf的方法时,比如clf.fit,这些方法可能会使用random_state属性作为参数。

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 2021-03-10
    • 2020-02-03
    • 2021-06-29
    • 2016-06-26
    • 2017-03-22
    • 2020-05-13
    • 2019-06-13
    • 2018-08-01
    相关资源
    最近更新 更多