Estado aleatório (número pseudo-aleatório) no Scikit learn


148

Quero implementar um algoritmo de aprendizado de máquina no scikit learn, mas não entendo o que esse parâmetro random_statefaz? Por que devo usá-lo?

Eu também não conseguia entender o que é um número pseudo-aleatório.

Respostas:


220

train_test_splitdivide matrizes ou matrizes em subconjuntos aleatórios de trem e teste. Isso significa que toda vez que você executá-lo sem especificar random_state, você obterá um resultado diferente, esse é o comportamento esperado. Por exemplo:

Execução 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]]

Execução 2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

Isso muda. Por outro lado, se você usar random_state=some_number, poderá garantir que a saída da Execução 1 será igual à saída da Execução 2 , ou seja, sua divisão será sempre a mesma. Não importa qual é o random_statenúmero real de 42, 0, 21, ... O importante é que toda vez que você usa 42, sempre terá a mesma saída na primeira vez que fizer a divisão. Isso é útil se você deseja resultados reproduzíveis, por exemplo, na documentação, para que todos possam ver consistentemente os mesmos números quando executam os exemplos. Na prática, eu diria que você deve definir o random_statenúmero fixo para testar o material, mas removê-lo na produção se realmente precisar de uma divisão aleatória (e não fixa).

Em relação à sua segunda pergunta, um gerador de números pseudoaleatórios é um gerador de números que gera números quase verdadeiramente aleatórios. Por que eles não são verdadeiramente aleatórios está fora do escopo desta pergunta e provavelmente não importa no seu caso, você pode dar uma olhada aqui para obter mais detalhes.


7
então o estado aleatório I deve definir, eu normalmente ver esse número 42.
Elizabeth Susan Joseph

1
@ElizabethSusanJoseph, não importa muito, eu sempre uso 0 se quiser reprodutibilidade ou Nenhuma. Pode ser caras scikit como 42.
elyase

53
Isso provavelmente explica o número 42 sendo usado tantas vezes: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson

3
Bom, aqui estão mais possibilidades .
precisa saber é

1
@ Herbert Essa é uma pergunta difícil. O material principal do PRNG é baseado em numpy, que é consistente (eles introduziram muitas verificações para isso depois de algum problema no passado). Se não houver erros de uso no sklearn, ele também se comportará de maneira consistente. Eu diria que isso (especialmente para as funções menos complexas, como trem-test-split e co) Editar : oops, um pouco tarde :-)
sascha

13

Se você não especificar o random_statecódigo, sempre que executar (executar) seu código, um novo valor aleatório será gerado e os conjuntos de dados de treinamento e teste terão valores diferentes a cada vez.

No entanto, se um valor fixo for atribuído assim random_state = 42, não importa quantas vezes você execute seu código, o resultado será o mesmo. Ou seja, os mesmos valores nos conjuntos de dados de treinamento e teste.


4

Se você não mencionar o random_state no código, sempre que você executar seu código, um novo valor aleatório será gerado e os conjuntos de dados de treinamento e teste terão valores diferentes a cada vez.

No entanto, se você usar um valor específico para random_state (random_state = 1 ou qualquer outro valor) toda vez que o resultado for o mesmo, ou seja, os mesmos valores nos conjuntos de dados de treinamento e teste. Consulte o código abaixo:

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

Não importa quantas vezes você execute o código, a saída será 70.

70

Tente remover o random_state e execute o código.

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

Agora, aqui a saída será diferente cada vez que você executar o código.


3

O número random_state divide os conjuntos de dados de teste e treinamento de maneira aleatória. Além do que é explicado aqui, é importante lembrar que o valor random_state pode ter um efeito significativo na qualidade do seu modelo (por qualidade, quero dizer essencialmente precisão para prever). Por exemplo, se você pegar um determinado conjunto de dados e treinar um modelo de regressão, sem especificar o valor random_state, existe o potencial de que sempre, você obterá um resultado de precisão diferente para o seu modelo treinado nos dados de teste. Portanto, é importante encontrar o melhor valor random_state para fornecer o modelo mais preciso. E então, esse número será usado para reproduzir seu modelo em outra ocasião, como outro experimento de pesquisa. Para fazer isso,

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

Se não houver estado aleatório, desde que o sistema use um estado aleatório gerado internamente. Portanto, ao executar o programa várias vezes, você poderá ver diferentes pontos de dados de treinamento / teste e o comportamento será imprevisível. Caso você tenha um problema com o seu modelo, não poderá recriá-lo, pois não sabe o número aleatório gerado quando você executou o programa.

Se você vir os Classificadores de Árvores - DT ou RF, eles tentarão criar uma tentativa usando um plano ideal. Embora na maioria das vezes esse plano possa ser o mesmo, pode haver casos em que a árvore possa ser diferente e, portanto, as previsões. Ao tentar depurar seu modelo, talvez não seja possível recriar a mesma instância para a qual uma árvore foi construída. Portanto, para evitar todo esse aborrecimento, usamos um random_state ao criar um DecisionTreeClassifier ou RandomForestClassifier.

PS: Você pode se aprofundar em como a Árvore é construída no DecisionTree para entender isso melhor.

O randomstate é basicamente usado para reproduzir o seu problema da mesma forma toda vez que é executado. Se você não usar um estado aleatório no traintestsplit, toda vez que fizer a divisão, poderá obter um conjunto diferente de pontos de dados de trem e teste e não o ajudará na depuração caso ocorra um problema.

Do Doc:

Se int, randomstate é a semente usada pelo gerador de números aleatórios; Se a instância RandomState, randomstate for o gerador de números aleatórios; Se Nenhum, o gerador de números aleatórios é a instância RandomState usada pelo np.random.


Boa explicação. Gostaria apenas de acrescentar que uma razão pela qual passaríamos o estado aleatório é que, se, por exemplo, tentarmos otimizar hiperparâmetros, não queremos ter flutuações na pontuação devido a diferentes inicializações baseadas em números aleatórios, que podem cobrir ou ocultar o efeito da otimização real e, portanto, não conseguimos identificar qual parte da alteração na pontuação ocorreu devido à alteração do parâmetro e o que ocorreu devido ao diferente estado inicial do RNG.
jottbe

-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

Dividir matrizes ou matrizes em subconjuntos aleatórios de trem e teste

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

Se int, random_state é a semente usada pelo gerador de números aleatórios; Se a instância RandomState, random_state é o gerador de números aleatórios; Se Nenhum, o gerador de números aleatórios é a instância RandomState usada pelo np.random. fonte: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'Em relação ao estado aleatório, ele é usado em muitos algoritmos aleatórios no sklearn para determinar a semente aleatória passada ao gerador de números pseudo-aleatórios. Portanto, ele não governa nenhum aspecto do comportamento do algoritmo. Como conseqüência, os valores de estado aleatório que tiveram bom desempenho no conjunto de validação não correspondem àqueles que teriam bom desempenho em um novo conjunto de testes invisível. De fato, dependendo do algoritmo, você pode ver resultados completamente diferentes apenas alterando a ordem das amostras de treinamento ''. Fonte: /stats/263999/is-random-state-a-parameter -sintonizar

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.