首页 文章

random_state在train_test_split和分类器中的作用

提问于
浏览
2

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

但,

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 的作用?是否会改变所有内容或保持尽可能多的行完整,并根据测试大小将一些行从列车转移到测试(反之亦然)?

  • 此外, 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)

What does random_state exactly do here? 因为在定义分类器时使用它 . 它尚未提供数据 . 我从http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html得到以下内容:

如果是int,则random_state是随机数生成器使用的种子;如果是RandomState实例,则random_state是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例 .

  • 假设对于多个测试大小中的每一个,多次执行以下行:
clf = tree.DecisionTreeClassifier(random_state=0)

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

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

2 回答

  • 2

    1: 由于您正在更改测试大小,因此无论如何,随机状态肯定是期望的行为,因为您只是想根据不同的样本大小获得分数 . 这个 will 为您做的是,允许您比较使用输入数据的模型,并按相同的随机状态进行拆分 . 从一个循环运行到下一个循环运行,测试集将完全相同 . 允许您正确比较相同样品的模型性能 .

    2: 对于诸如决策树分类器和许多其他模型之类的模型,存在随机设置的初始化参数 . 这里的随机状态是确保从一次运行到下一次运行的那些参数设置完全相同,从而创建可重现的行为 .

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

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

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

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

相关问题