我想在Scikit Learn中实现机器学习算法,但我不理解参数random_state
的作用是什么?为什么要使用它?
我也不理解何为伪随机数。
我想在Scikit Learn中实现机器学习算法,但我不理解参数random_state
的作用是什么?为什么要使用它?
我也不理解何为伪随机数。
train_test_split
将数组或矩阵随机分成训练集和测试集。这意味着,每次运行它而没有指定random_state
时,您都会得到不同的结果,这是预期的行为。例如:
运行1:
>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
[8, 9],
[4, 5]]),
array([[2, 3],
[0, 1]]), [3, 4, 2], [1, 0]]
运行 2
>>> train_test_split(a, b)
[array([[8, 9],
[4, 5],
[0, 1]]),
array([[6, 7],
[2, 3]]), [4, 2, 0], [3, 1]]
它会改变。然而,如果使用random_state=some_number
,则可以保证Run 1的输出将等于Run 2的输出,即您的拆分始终相同。实际上随机种子的数字是多少并不重要,无论是42、0、21等数字,每次使用42都会在第一次进行拆分时得到相同的输出结果。这在文档中需要复现结果时很有用,以便每个人在运行示例时始终看到相同的数字。实际上,建议在测试时将random_state
设置为固定数字,但在生产环境中如果确实需要随机(而不是固定)拆分,则应将其删除。random_state
,那么每次运行代码时都会生成一个新的随机值,训练集和测试集的数值也会随之而变化。random_state=42
,则无论执行多少次代码,结果都将是相同的,即训练集和测试集中的数值相同。“随机状态”是什么,为什么要使用它的问题,已经被其他人很好地回答了。我将尝试回答一个问题:“为什么在训练机器学习模型时经常选择随机状态42?为什么不选择12、32或5?是否有科学解释?”
许多学生和从业者使用此数字(42)作为随机状态,是因为许多在线课程的教练使用它。他们经常将随机状态或numpy种子设置为42号,学习者也会毫无思考地遵循相同的做法。
具体来说,42与AI或ML无关。事实上,它是一个通用数字,在机器学习中,实际的随机数是什么并不重要,正如scikit API文档中所述,任何整数都足以完成任务。
42是来自《银河系漫游指南》一书的参考。它代表了“生命宇宙和万物的答案”,意味着一个笑话。它没有其他意义。
参考资料:
如果您在代码中没有提到random_state,那么每次执行代码时都会生成一个新的随机值,训练和测试数据集每次都会有不同的值。
然而,如果您每次使用特定的值作为random_state(例如random_state = 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 = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))
70
import pandas as pd
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))
现在每次执行代码时,输出结果都会不同。
random_state数字以随机方式拆分测试和训练数据集。除了本文所解释的内容之外,重要的是要记住random_state值可能对模型的质量产生重大影响(我指的是准确性)。例如,如果您使用某个数据集训练回归模型而没有指定random_state值,则有可能每次在测试数据上训练模型时都会得到不同的准确度结果。
因此,找到最佳的random_state值以提供最准确的模型非常重要。然后,该数字将用于再次生成模型,例如另一个研究实验。
为了做到这一点,可以通过为random_state参数分配随机数字来拆分和训练模型:
for j in range(1000):
X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j, test_size=0.35)
lr = LarsCV().fit(X_train, y_train)
tr_score.append(lr.score(X_train, y_train))
ts_score.append(lr.score(X_test, y_test))
J = ts_score.index(np.max(ts_score))
X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
M = LarsCV().fit(X_train, y_train)
y_pred = M.predict(X_test)`
另请参阅:什么是random_state?
sklearn.model_selection.train_test_split(*arrays, **options)[source]
将数组或矩阵随机分成训练集和测试集
Parameters: ...
random_state : int, RandomState instance or None, optional (default=None)
如果是int类型,random_state就是随机数生成器使用的种子;如果是RandomState实例,random_state就是随机数生成器;如果是None,则随机数生成器是np.random使用的RandomState实例。 来源:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
关于随机状态,它在sklearn中的许多随机算法中用于确定传递给伪随机数生成器的随机种子。因此,它不控制算法行为的任何方面。因此,在验证集中表现良好的随机状态值与在新的未见过的测试集中表现良好的随机状态值不相对应。事实上,根据算法的不同,仅通过改变训练样本的顺序就可能看到完全不同的结果。 来源:https://stats.stackexchange.com/questions/263999/is-random-state-a-parameter-to-tune