Quero implementar um algoritmo de aprendizado de máquina no scikit learn, mas não entendo o que esse parâmetro random_state
faz? Por que devo usá-lo?
Eu também não conseguia entender o que é um número pseudo-aleatório.
Quero implementar um algoritmo de aprendizado de máquina no scikit learn, mas não entendo o que esse parâmetro random_state
faz? Por que devo usá-lo?
Eu também não conseguia entender o que é um número pseudo-aleatório.
Respostas:
train_test_split
divide 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_state
nú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_state
nú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.
Se você não especificar o random_state
có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.
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.
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)`
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.
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