技术问询:random_state=0与numpy.random.RandomState(0)有何差异?
random_state = 整数 与 random_state = numpy.random.RandomState(整数) 的差异
我正在测试random_state的相关用法,想请教:random_state = 0与random_state = numpy.random.RandomState(0)这两种设置方式存在哪些差异?以下为测试代码及输出结果:
测试代码
from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split import numpy as np import random for i in range(5): ########### code for random_state= numpy.random.RandomState(i) ############## rng = np.random.RandomState(i) X, y = make_classification(random_state=rng) rf = RandomForestClassifier(random_state=rng) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=rng) p1=rf.fit(X_train, y_train).score(X_test, y_test) ########### code for random_state= integer ############## X, y = make_classification(random_state=i) rf = RandomForestClassifier(random_state=i) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=i) p2=rf.fit(X_train, y_train).score(X_test, y_test) print(i,p1,p2)
输出结果
0 0.84 0.92 1 1.0 0.92 2 0.88 0.92 3 0.84 0.88 4 1.0 1.0
核心差异解析
两者的本质区别在于随机数生成器的使用方式:
传入整数种子(如
random_state=i):每个Scikit-learn函数都会基于这个整数,创建一个全新且独立的随机数生成器。也就是说,make_classification、RandomForestClassifier、train_test_split这三个函数各自用同一个种子初始化了完全独立的生成器,彼此的随机状态互不干扰,各自生成的随机序列都是从种子i重新开始的。传入
np.random.RandomState实例(如random_state=rng):这个生成器实例会被所有后续函数复用。每调用一次需要生成随机数的函数,该生成器的内部状态就会被推进一次,后续函数会接着当前的状态继续生成随机数,而不是重新用种子初始化。
对应到你的测试代码中:
- 第一部分的三个函数共享同一个
rng实例,make_classification先消耗了一部分随机数,RandomForestClassifier接着用剩下的状态生成随机数,最后train_test_split继续推进这个状态,三者的随机序列是连贯的。 - 第二部分的每个函数都用同一个整数
i作为种子,相当于三个函数各自从种子i从头开始生成随机数,彼此的随机序列完全独立。
这就是为什么两次测试的得分p1和p2会出现差异——两种方式下,随机数的生成路径完全不同,最终导致数据生成、模型训练、数据集划分的结果都不一样。
内容的提问来源于stack exchange,提问作者Mukesh Kumar
相关产品推荐
相关产品推荐

