Estou tentando usar train_test_split
do pacote scikit Learn, mas estou tendo problemas com o parâmetro stratify
. A seguir está o código:
from sklearn import cross_validation, datasets
X = iris.data[:,:2]
y = iris.target
cross_validation.train_test_split(X,y,stratify=y)
No entanto, continuo tendo o seguinte problema:
raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}
Alguém tem ideia do que está acontecendo? Abaixo está a documentação da função.
[...]
stratify : array-like ou None (o padrão é None)
Se não for nenhum, os dados são divididos de forma estratificada, usando isso como a matriz de rótulos.
Novo na versão 0.17: divisão estratificada
[...]
split
scikit-learn
training-data
test-data
Daneel Olivaw
fonte
fonte
Respostas:
O Scikit-Learn está apenas dizendo a você que não reconhece o argumento "estratificar", não que você o esteja usando incorretamente. Isso ocorre porque o parâmetro foi adicionado na versão 0.17 conforme indicado na documentação que você citou.
Então você só precisa atualizar o Scikit-Learn.
fonte
scikit-learn 0.21.2 py37h2a6a0b8_0 conda-forge
Este
stratify
parâmetro faz uma divisão de forma que a proporção dos valores na amostra produzida seja a mesma que a proporção dos valores fornecidos ao parâmetrostratify
.Por exemplo, se a variável
y
é uma variável categórica binário com valores0
e1
e há 25% de zeros e 75% dos queridos,stratify=y
vai se certificar de que a sua divisão aleatória tem 25% de0
's e 75% de1
' s.fonte
stratify
. Em segundo lugar, para corrigir o desequilíbrio, você eventualmente precisa executar a sobreamostragem ou subamostragem no conjunto de treinamento. Muitos classificadores Sklearn têm um parâmetro chamado peso da classe que você pode definir como balanceado. Finalmente, você também pode usar uma métrica mais apropriada do que precisão para conjunto de dados desequilibrado. Tente F1 ou área sob ROC.Para meu futuro eu, que vem aqui via Google:
train_test_split
está agora dentromodel_selection
, portanto:é a maneira de usá-lo. A configuração de
random_state
é desejável para reprodutibilidade.fonte
Nesse contexto, a estratificação significa que o método train_test_split retorna subconjuntos de treinamento e teste que têm as mesmas proporções de rótulos de classe que o conjunto de dados de entrada.
fonte
Tente executar este código, ele "simplesmente funciona":
fonte
sklearn
a versão '0,17', distribuição Anaconda para Python 3,5. Só posso sugerir que verifique mais uma vez se você inserir o código corretamente e atualize seu software.sklearn
...