Я хочу впровадити алгоритм машинного навчання в 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 , тобто ваш розкол буде завжди однаковим. Не має значення, яке фактичне random_state
число становить 42, 0, 21, ... Важливим є те, що кожного разу, коли ви використовуєте 42, ви завжди отримаєте один і той же результат під час першого розбиття. Це корисно, якщо ви хочете відтворити результати, наприклад, у документації, щоб усі могли послідовно бачити однакові номери під час запуску прикладів. На практиці я б сказав, ви повинні встановити random_state
деякий фіксований номер під час тестування матеріалів, але потім видалити його у виробництві, якщо вам дійсно потрібен випадковий (а не фіксований) спліт.
Що стосується вашого другого питання, генератор псевдовипадкових чисел - це генератор чисел, який генерує майже справді випадкові числа. Чому вони не є справді випадковими, виходить за рамки цього питання, і, мабуть, це не має значення у вашому випадку, ви можете ознайомитись тут із детальною формою.
Якщо ви не вказуєте random_state
код у своєму коді, то кожного разу, коли ви запускаєте (виконуєте) свій код, генерується нове випадкове значення, і набори даних поїздів і тестів матимуть різні значення кожного разу.
Однак, якщо фіксоване значення призначається як би random_state = 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.
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))
Тепер тут вихід буде різним щоразу, коли ви виконуєте код.
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)`
Якщо немає випадкового стану за умови, що система буде використовувати випадкове стан, що генерується всередині. Отже, коли ви запускаєте програму кілька разів, ви можете бачити різні точки даних про поїзд / тест, і поведінка буде непередбачуваною. У випадку, якщо у вас є проблема зі своєю моделлю, ви не зможете її відтворити, оскільки ви не знаєте випадкового числа, яке було сформовано під час запуску програми.
Якщо ви бачите класифікатори дерев - DT або RF, вони намагаються побудувати спробу, використовуючи оптимальний план. Хоча в більшості випадків цей план може бути однаковим, можуть бути випадки, коли дерево може бути різним, і тому прогнози. Коли ви намагаєтеся налагодити свою модель, ви, можливо, не зможете відтворити той самий екземпляр, для якого було побудовано Дерево. Таким чином, щоб уникнути всіх цих клопотів, ми використовуємо random_state під час створення рішенняTreeClassifier або RandomForestClassifier.
PS: Ви можете трохи детальніше ознайомитись з тим, як побудовано Дерево в решетковому дереві, щоб зрозуміти це краще.
randomstate в основному використовується для відтворення вашої проблеми однаково при кожному її запуску. Якщо ви не використовуєте випадковий стан у traintestsplit, кожен раз, коли ви будете робити розбиття, ви можете отримати інший набір даних про поїзд та тестування, і це не допоможе вам у налагодженні, якщо ви отримаєте проблему.
Від документа:
Якщо int, randomstate - це насіння, яке використовується генератором випадкових чисел; Якщо екземпляр RandomState, randomstate - генератор випадкових чисел; Якщо немає, генератором випадкових чисел є екземпляр RandomState, який використовується np.random.
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 -настроювати