random_state在train_test_split和分类器中的作用

时间:2018-04-11 15:28:49

标签: python scikit-learn

基于这个答案: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获得了以下内容:

  3.   

    如果是int,则random_state是随机数生成器使用的种子;   如果是RandomState实例,则random_state是随机数生成器;   如果为None,则随机数生成器是使用的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 个答案:

答案 0 :(得分:2)

1:由于您要更改测试大小,因此随机状态不会影响测试大小之间的选定行,并且无论如何都不一定是所需行为,因为您只是尝试根据不同的样本量获得分数。 为您做什么,允许您比较使用输入数据的模型,并按相同的随机状态进行拆分。从一个循环运行到下一个循环运行,测试集将完全相同。允许您正确比较相同样本的模型性能。

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

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

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

答案 1 :(得分: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在这里做什么?

创建名为DecisionTreeClassifier的{​​{1}}对象时,会将其clf属性设置为0进行初始化。请注意,如果键入random_state,将打印值print(clf.random_state)。当您调用clf的方法时,例如0,这些方法可能会使用clf.fit属性作为参数。