Випадковий стан (псевдовипадкове число) у Scikit learn


148

Я хочу впровадити алгоритм машинного навчання в scikit learn, але я не розумію, що random_stateробить цей параметр ? Чому я повинен його використовувати?

Я також не міг зрозуміти, що таке псевдовипадкове число.

Відповіді:


220

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 , тобто ваш розкол буде завжди однаковим. Не має значення, яке фактичне random_stateчисло становить 42, 0, 21, ... Важливим є те, що кожного разу, коли ви використовуєте 42, ви завжди отримаєте один і той же результат під час першого розбиття. Це корисно, якщо ви хочете відтворити результати, наприклад, у документації, щоб усі могли послідовно бачити однакові номери під час запуску прикладів. На практиці я б сказав, ви повинні встановити random_stateдеякий фіксований номер під час тестування матеріалів, але потім видалити його у виробництві, якщо вам дійсно потрібен випадковий (а не фіксований) спліт.

Що стосується вашого другого питання, генератор псевдовипадкових чисел - це генератор чисел, який генерує майже справді випадкові числа. Чому вони не є справді випадковими, виходить за рамки цього питання, і, мабуть, це не має значення у вашому випадку, ви можете ознайомитись тут із детальною формою.


7
тож, який випадковий стан я повинен встановити, я зазвичай бачу це число 42.
Єлизавета Сьюзен, Джозеф

1
@ElizabethSusanJoseph, це не має великого значення, я завжди використовую 0, якщо хочу відтворюваність або Нічого іншого. Можуть бути хлопці-
науковці на

53
Це, мабуть, пояснює число, яке використовується так часто: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
денсон

3
Хороший, тут більше можливостей .
elyase

1
@ Герберт Це складне питання. Основний PRNG-матеріал базується на numpy, який є послідовним (вони ввели багато перевірок на це після певної проблеми в минулому). Якщо немає помилок у використанні в sklearn, він також буде вести себе послідовно. Я б припустив це (особливо для менш складних функцій, таких як поїзд-тест-спліт та спільний) Редагувати : ой, трохи пізно :-)
sascha

13

Якщо ви не вказуєте random_stateкод у своєму коді, то кожного разу, коли ви запускаєте (виконуєте) свій код, генерується нове випадкове значення, і набори даних поїздів і тестів матимуть різні значення кожного разу.

Однак, якщо фіксоване значення призначається як би random_state = 42то не залежно від того, скільки разів ви виконуєте код, результат буде однаковим.


4

Якщо ви не згадуєте у коді 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.

70

Спробуйте видалити random_state і запустіть код.

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))

Тепер тут вихід буде різним щоразу, коли ви виконуєте код.


3

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)`


1

Якщо немає випадкового стану за умови, що система буде використовувати випадкове стан, що генерується всередині. Отже, коли ви запускаєте програму кілька разів, ви можете бачити різні точки даних про поїзд / тест, і поведінка буде непередбачуваною. У випадку, якщо у вас є проблема зі своєю моделлю, ви не зможете її відтворити, оскільки ви не знаєте випадкового числа, яке було сформовано під час запуску програми.

Якщо ви бачите класифікатори дерев - DT або RF, вони намагаються побудувати спробу, використовуючи оптимальний план. Хоча в більшості випадків цей план може бути однаковим, можуть бути випадки, коли дерево може бути різним, і тому прогнози. Коли ви намагаєтеся налагодити свою модель, ви, можливо, не зможете відтворити той самий екземпляр, для якого було побудовано Дерево. Таким чином, щоб уникнути всіх цих клопотів, ми використовуємо random_state під час створення рішенняTreeClassifier або RandomForestClassifier.

PS: Ви можете трохи детальніше ознайомитись з тим, як побудовано Дерево в решетковому дереві, щоб зрозуміти це краще.

randomstate в основному використовується для відтворення вашої проблеми однаково при кожному її запуску. Якщо ви не використовуєте випадковий стан у traintestsplit, кожен раз, коли ви будете робити розбиття, ви можете отримати інший набір даних про поїзд та тестування, і це не допоможе вам у налагодженні, якщо ви отримаєте проблему.

Від документа:

Якщо int, randomstate - це насіння, яке використовується генератором випадкових чисел; Якщо екземпляр RandomState, randomstate - генератор випадкових чисел; Якщо немає, генератором випадкових чисел є екземпляр RandomState, який використовується np.random.


Гарне пояснення. Я хотів би лише додати, що причина, чому ми передамо випадковий стан, полягає в тому, що якщо ми, наприклад, намагаємось оптимізувати гіперпараметри, ми не хочемо мати коливання в оцінці через різні ініціалізації на основі випадкових чисел, які можуть охопити або приховати ефект реальної оптимізації, і, таким чином, ми не змогли визначити, яка частина зміни балів була пов'язана зі зміною параметрів і чим була обумовлена ​​різним стартовим станом RNG.
jottbe

-1
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; Якщо немає, генератором випадкових чисел є екземпляр RandomState, який використовується np.random. джерело: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Що стосується випадкового стану, він використовується у багатьох рандомізованих алгоритмах у sklearn для визначення випадкового насіння, переданого генератору псевдовипадкових чисел. Тому він не регулює жодного аспекту поведінки алгоритму. Як наслідок, випадкові величини стану, які добре виконувались у наборі перевірки, не відповідають тим, які були б добре виконані в новому, небаченому тестовому наборі. Дійсно, залежно від алгоритму, ви можете побачити абсолютно різні результати, змінивши впорядкованість навчальних зразків. '' 'Джерело: /stats/263999/is-random-state-a-parameter -настроювати

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.