Scikit-learn: Tipo de rótulo desconhecido DecisionTreeClassifier: 'contínuo-multisaída'

Criado em 31 out. 2016  ·  18Comentários  ·  Fonte: scikit-learn/scikit-learn

Descrição


DecisionTreeClassifier falha com unknown label type: 'continuous-multioutput' . Eu tentei carregar o arquivo csv usando csv.reader, pandas.read_csv e algumas outras coisas, como analisar linha por linha.

Etapas/código para reproduzir

from sklearn import tree
feature_df = pd.read_csv(os.path.join(_PATH, 'features.txt'))
target_df = pd.read_csv(os.path.join(_PATH, 'target.txt'))
feature_df = feature_df._get_numeric_data()
target_df = target_df._get_numeric_data()
feature_df = feature_df.fillna(0)
target_df = target_df.fillna(0)
clf = tree.DecisionTreeClassifier()
clf_o = clf.fit(feature_df, target_df)

características.txt
alvo.txt

resultados esperados


Erro lançado informa ao usuário o que REALMENTE está errado, que seu conjunto de dados não segue suposições (e quais são essas)

Resultados reais

Traceback (most recent call last):
  File "D:\Piotr\Documents\uni\bap\BAPFingerprintLocalisation\main.py", line 19,
 in <module>
    decision_tree.treeClassification()
  File "D:\Piotr\Documents\uni\bap\BAPFingerprintLocalisation\code\decision_tree
.py", line 56, in treeClassification
    clf_o = clf.fit(feature_df, target_df)
  File "C:\Python35\lib\site-packages\sklearn\tree\tree.py", line 182, in fit
    check_classification_targets(y)
  File "C:\Python35\lib\site-packages\sklearn\utils\multiclass.py", line 172, in
 check_classification_targets
    raise ValueError("Unknown label type: %r" % y_type)
ValueError: Unknown label type: 'continuous-multioutput'

Versões

Windows-10-10.0.14393-SP0
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)]
NumPy 1.11.0
SciPy 0.17.1
Scikit-Learn 0.18

Atualizar:

Eu mudei o número de variáveis ​​de destino para um, apenas para simplificar as coisas

clf_o = clf.fit(feature_df, target_df.ix[:,1])

Saída: Unknown label type: 'continuous'

Comentários muito úteis

Você deveria estar usando DecisionTreeRegressor

Todos 18 comentários

Você deveria estar usando DecisionTreeRegressor

Novamente, a documentação carece de informações sobre quantas classes podem lidar com a classificação. Eu posso ver que meu conjunto de dados tem classes demais, mas sua mensagem de erro mencionou algo como 'rótulos' que era confuso o suficiente para esquecer como o conjunto de dados realmente se parece e se intrometer nos métodos de passagem de conjuntos de dados.
Atualizei o problema e peço para reabri-lo.

Os destinos de classificação devem ser representados como números inteiros ou como strings. Você pode pedir ao Pandas para ler os dados de destino como uma string e tudo ficará bem.

Ou use DecisionTreeRegressor

Isso não é problema meu

Consulte a seção 'Resultados esperados' do meu problema

Você está certo de que a mensagem de erro pode ser mais útil, mas a documentação para fit diz "rótulos de classe na classificação". Sinta-se à vontade para enviar um problema mais claro sobre a necessidade de documentar o tipo de dados esperado para a classificação y s, e outro para gerar mensagens de erro apropriadas quando dados float são passados ​​como y para um classificador.

Deixe-me citar toda a seção de documentação documentando o parâmetro y da função fit na classe DecisionTreeClassifier

Os valores de destino (rótulos de classe na classificação, números reais na regressão). No caso de regressão, use dtype=np.float64 e order='C' para máxima eficiência.

Isso não quer dizer que as classes tenham um limite. O que torna uma variável alvo rotulada contínua? Quantas classes precisam estar lá para serem consideradas variáveis ​​de destino do tipo de regressão? Se for sobre regressão, posso fazer regressão usando DecisionTreeClassifier? Por que não? etc...

Quanto ao seu comentário anterior:

Os destinos de classificação devem ser representados como números inteiros ou como strings. Você pode pedir ao Pandas para ler os dados de destino como uma string e tudo ficará bem.

Isso significa que as classes não podem ser representadas como floats? Ou como ditados? Listas? Tuplas? Longos? Duplas? bytes? Eu sei que é lógico representar classes como inteiros ou strings, já que eles não devem ser muitos. Mas eles precisam? Quais são as limitações?

E quanto a criar um novo ticket, não é inútil já que conversamos bastante aqui? Criando um novo ticket apenas para explicar a outra pessoa a mesma coisa?

Não é o número de aulas. É o uso de não inteiros e não strings.

Eu gosto que as descrições dos problemas sejam focadas. Sua preocupação levantada aqui
parecia ser mais um problema de uso.

E, por favor, não me incomode com o que sugiro. Este não é o único problema
estou tratando.

Em 2 de novembro de 2016 às 00:24, Piotr Kamoda [email protected] escreveu:

Deixe-me citar toda a seção de documentação que documenta o parâmetro y de
função se encaixa na classe DecisionTreeClassifier

Os valores de destino (rótulos de classe na classificação, números reais na
regressão). No caso de regressão, use dtype=np.float64 e order='C' para
máxima eficiência.

Isso não quer dizer que as classes tenham um limite. O que torna uma variável de destino
rotulado contínuo? Quantas classes têm que estar lá para serem consideradas
variável de destino do tipo de regressão? Se é sobre regressão, então posso fazer
regressão usando DecisionTreeClassifier? Por que não? etc...

E quanto a criar um novo ticket, não é inútil já que tivemos um
falar aqui? Criando um novo ticket apenas para explicar a outra pessoa a mesma coisa?


Você está recebendo isso porque modificou o estado de abertura/fechamento.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment -257565248,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AAEz63zNA0Qc4lzgHttXx-4VFkJFwFaDks5q5z16gaJpZM4KlSFw
.

Você não precisa resolvê-lo hoje, estou apenas tentando tornar ativo o problema de descrições de erros ruins e documentação ruim no classificador e regressor de árvore para se tornar ativo e uma tarefa para versões futuras.

Para a mensagem de erro "Tipo de saída não suportado: 'contínuo-multisaída'" seria melhor? Esse é o real problema. Veja também #7809 para a docstring.

Isso é melhor. Mas ainda não entendo por que você não vai nomeá-lo como é. Porque a literatura geralmente chama isso de variáveis ​​'Target', e a saída pode ser confundida com a saída da função. A exceção foi lançada da função 'check_classification_targets', então mesmo você diz que é a variável 'target' e ainda quer chamá-la de 'label' ou 'output'. Eu não sou um membro do scikit-learn member, então você fará o que quiser, mas eu recomendaria usar as palavras 'Target variable' em doscstring e mensagem de erro. E peço que você descreva em qualquer lugar as regras que os dados de entrada (ou destino) devem seguir. Uma frase curta - 'Variável de destino (parâmetro y) deve ser int ou str'.

Talvez valha a pena mencionar na/ao lado da nova seção (45cb11d / #7519)
sobre ajuste multiclasse e multirótulo no tutorial. Ou talvez isso tudo
pertence a uma seção do guia do usuário sobre convenções de representação de dados,
descrevendo formatos de entrada/saída para todos os métodos padrão...?

Em 2 de novembro de 2016 às 20:56, Piotr Kamoda [email protected] escreveu:

Isso é melhor. Mas ainda não entendo por que você não vai nomeá-lo como ele
é. Porque a literatura geralmente chama isso de variáveis ​​'Alvo' e a saída
pode ser confundido com a saída da função. A exceção foi lançada da função
'check_classification_targets', então até você diz que é a variável 'target',
e ainda assim você quer chamá-lo de 'rótulo' ou 'saída'. eu não sou membro de
membro do scikit-learn, então você fará o que quiser, mas eu recomendaria
use palavras 'variável de destino' em doscstring e mensagem de erro. E eu te pergunto
para descrever em qualquer lugar as regras que os dados de entrada (ou destino) devem seguir. UMA
frase curta - 'Variável de destino (parâmetro y) deve ser int ou str'.


Você está recebendo isso porque modificou o estado de abertura/fechamento.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment -257820087,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AAEz68AqYGWrP1C-BinLXGGHNt0VtV_qks5q6F5rgaJpZM4KlSFw
.

Eu digitalizei o documento e parece um bom lugar para mencionar essas convenções. Além disso, se você não quiser ofuscar muito as mensagens de erro, a ideia de colocar essas informações no guia do usuário também não é ruim.
Bem, a solução final (se houver) será como você deseja, só estou dizendo que a ideia parece ok, mas você tem suas convenções. Eu não vou fazer você fazer algo.

'A variável de destino (parâmetro y) deve ser int ou str'. não está certo, porque suportamos multi-rótulo e multi-destino multi-saída

Além disso, objetos arbitrários que não são floats são suportados como rótulos de classe, eles não precisam ser inteiros ou strings.

Se colocarmos como imput training_data_X, training_scores_Y para ajustar o método causará erro. Para evitá-lo, converteremos e codificaremos rótulos

do pré-processamento de importação do sklearn
de utilitários de importação sklearn
lab_enc = preprocessing.LabelEncoder()
y_train = lab_enc.fit_transform(y_train)
print(y_train)
print(utils.multiclass.type_of_target(y_train))
print(utils.multiclass.type_of_target(y_train.astype('int'))))
print(utils.multiclass.type_of_target(y_train))

Estou com o mesmo problema, existe alguma solução para isso?

Esta página foi útil?
0 / 5 - 0 avaliações