Scikit-learn: DecisionTreeClassifier tipo de etiqueta desconocido: 'multisalida continua'

Creado en 31 oct. 2016  ·  18Comentarios  ·  Fuente: scikit-learn/scikit-learn

Descripción


DecisionTreeClassifier falla con unknown label type: 'continuous-multioutput' . Intenté cargar el archivo csv usando csv.reader, pandas.read_csv y algunas otras cosas como analizar línea por línea.

Pasos/Código para reproducir

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)

caracteristicas.txt
objetivo.txt

Resultados previstos


El error arrojado informa al usuario lo que REALMENTE está mal, que si su conjunto de datos no sigue las suposiciones (y cuáles son esas)

Resultados actuales

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'

Versiones

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

Actualizar:

Cambié el número de variables de destino a uno, solo para simplificar las cosas

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

Salida: Unknown label type: 'continuous'

Comentario más útil

Deberías estar usando DecisionTreeRegressor

Todos 18 comentarios

Deberías estar usando DecisionTreeRegressor

Nuevamente, la documentación carece de información sobre cuántas clases puede manejar la clasificación. Puedo ver que mi conjunto de datos tiene demasiadas clases, pero su mensaje de error menciona algo así como 'etiquetas' que fue lo suficientemente confuso como para olvidar cómo se ve realmente el conjunto de datos y entrometerse con los métodos para pasar conjuntos de datos.
He actualizado el problema y te pido que lo vuelvas a abrir.

Los objetivos de clasificación deben representarse como números enteros o como cadenas. Puede pedirle a Pandas que lea los datos de destino como una cadena y estará bien.

O usa un DecisionTreeRegressor

Ese no es mi problema

Consulte la sección "Resultados esperados" de mi problema

Tiene razón en que el mensaje de error podría ser más útil, pero la documentación para fit dice "etiquetas de clase en clasificación". Siéntase libre de enviar un problema más claro sobre la necesidad de documentar el tipo de datos esperado para la clasificación y s, y otro para generar mensajes de error apropiados cuando los datos flotantes se pasan como y a un clasificador.

Permítanme citar toda la sección de documentación que documenta el parámetro y del ajuste de la función en la clase DecisionTreeClassifier

Los valores objetivo (etiquetas de clase en clasificación, números reales en regresión). En el caso de regresión, use dtype=np.float64 y order='C' para obtener la máxima eficiencia.

Eso no dice que las clases tengan un tope. ¿Qué hace que una variable objetivo etiquetada sea continua? ¿Cuántas clases tiene que haber para que se considere una variable objetivo de tipo regresión? Si se trata de una regresión, ¿puedo hacer una regresión usando DecisionTreeClassifier? ¿Por qué no? Etc...

En cuanto a tu comentario anterior:

Los objetivos de clasificación deben representarse como números enteros o como cadenas. Puede pedirle a Pandas que lea los datos de destino como una cadena y estará bien.

¿Significa eso que las clases no se pueden representar como flotantes? ¿O como dictados? ¿Liza? tuplas? ¿Pantalones largos? ¿Dobles? bytes? Sé que es lógico representar las clases como enteros o cadenas, ya que no deberían ser suficientes. ¿Pero tienen que hacerlo? ¿Cuáles son las limitaciones?

Y en cuanto a la creación de un nuevo boleto, ¿no es inútil ya que hemos hablado bastante aquí? ¿Crear un nuevo boleto solo para explicarle a otro tipo lo mismo?

No es el número de clases. Es el uso de no enteros y no cadenas.

Me gusta que las descripciones de los problemas estén enfocadas. Su preocupación como se planteó aquí
parecía ser más un problema de uso.

Y por favor no me molestes con lo que sugiero. Este no es el único problema
estoy tratando

El 2 de noviembre de 2016 a las 00:24, Piotr Kamoda [email protected] escribió:

Permítanme citar toda la sección de documentación que documenta el parámetro y de
ajuste de la función en la clase DecisionTreeClassifier

Los valores objetivo (etiquetas de clase en clasificación, números reales en
regresión). En el caso de regresión, use dtype=np.float64 y order='C' para
Máxima eficiencia.

Eso no dice que las clases tengan un tope. Qué hace que una variable objetivo
etiquetado continuo? ¿Cuántas clases tiene que haber allí para ser considerado?
variable de destino de tipo de regresión? Si se trata de regresión, ¿puedo hacerlo?
regresión usando DecisionTreeClassifier? ¿Por qué no? Etc...

Y en cuanto a la creación de un nuevo ticket, ¿no es inútil ya que hemos tenido bastante
hablar aquí? ¿Crear un nuevo boleto solo para explicarle a otro tipo lo mismo?


Está recibiendo esto porque modificó el estado abierto/cerrado.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment-257565248 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AAEz63zNA0Qc4lzgHttXx-4VFkJFwFaDks5q5z16gaJpZM4KlSFw
.

No tiene que resolverlo hoy, solo estoy tratando de hacer que el problema de las malas descripciones de errores y la mala documentación en el clasificador de árboles y el regresor se active y sea una tarea para futuras versiones.

Para el mensaje de error, ¿sería mejor "Tipo de salida no compatible: 'multisalida continua'"? Ese es el problema _real_. Consulte también #7809 para la cadena de documentación.

Eso es mejor. Pero aún no entiendo por qué no lo nombras como es. Porque la literatura en su mayoría llama a eso variables 'Objetivo', y la salida podría confundirse con la salida de la función. Se lanzó una excepción desde la función 'check_classification_targets', por lo que incluso usted dice que es una variable 'objetivo', y aún desea llamarla 'etiqueta' o 'salida'. No soy miembro de scikit-learn, por lo que hará lo que quiera, pero recomendaría usar las palabras 'Variable de destino' en doscstring y mensaje de error. Y le pido que describa en cualquier lugar las reglas que deben seguir los datos de entrada (o el objetivo). Una oración corta: 'La variable de destino (parámetro y) tiene que ser int o str'.

Tal vez valga la pena mencionarlo en/junto a la nueva sección (45cb11d / #7519)
sobre ajuste multiclase y multietiqueta en el tutorial. O tal vez todo esto
pertenece a una sección de la guía del usuario sobre convenciones de representación de datos,
describiendo formatos de entrada/salida para todos los métodos estándar...?

El 2 de noviembre de 2016 a las 20:56, Piotr Kamoda [email protected] escribió:

Eso es mejor. Pero aún no entiendo por qué no lo nombras así
es. Debido a que la literatura en su mayoría llama a eso variables 'Objetivo', y la salida
podría confundirse con la salida de la función. Se lanzó una excepción de la función
'check_classification_targets', por lo que incluso usted dice que es la variable 'objetivo',
y todavía quieres llamarlo 'etiqueta' o 'salida'. no soy miembro de
miembro de scikit-learn, por lo que hará lo que quiera, pero recomendaría
use las palabras 'Variable de destino' en doscstring y mensaje de error. y te pregunto
para describir en cualquier lugar las reglas que deben seguir los datos de entrada (o el objetivo). A
oración corta: 'La variable de destino (parámetro y) tiene que ser int o str'.


Está recibiendo esto porque modificó el estado abierto/cerrado.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment-257820087 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AAEz68AqYGWrP1C-BinLXGGHNt0VtV_qks5q6F5rgaJpZM4KlSFw
.

He escaneado el documento y parece un buen lugar para mencionar esas convenciones. Además, si no desea ofuscar demasiado los mensajes de error, la idea de incluir esa información en la guía del usuario tampoco es mala.
Bueno, la solución final (si la hay) será como usted desee que sea, solo digo que la idea parece estar bien, pero tiene sus convenciones. No te obligaré a hacer algo.

'La variable objetivo (parámetro y) tiene que ser int o str'. no es correcto, porque admitimos múltiples etiquetas y múltiples salidas, múltiples objetivos

Además, los objetos arbitrarios que no son flotantes se admiten como etiquetas de clase, no es necesario que sean enteros o cadenas.

Si ponemos como entrada training_data_X, training_scores_Y para ajustar el método, causará un error. Para evitarlo convertiremos y codificaremos etiquetas.

del preprocesamiento de importación de sklearn
de las utilidades de importación de sklearn
lab_enc = preprocesamiento.LabelEncoder()
tren_y = lab_enc.fit_transform(tren_y)
imprimir (y_tren)
imprimir (utils.multiclass.type_of_target (y_train))
imprimir(utils.multiclass.type_of_target(y_train.astype('int')))
imprimir (utils.multiclass.type_of_target (y_train))

Tengo este mismo problema, ¿hay alguna solución?

¿Fue útil esta página
0 / 5 - 0 calificaciones