Scikit-learn: Неизвестный тип метки DecisionTreeClassifier: «непрерывный мультивыход»

Созданный на 31 окт. 2016  ·  18Комментарии  ·  Источник: scikit-learn/scikit-learn

Описание


DecisionTreeClassifier аварийно завершает работу с unknown label type: 'continuous-multioutput' . Я пытался загрузить CSV-файл, используя csv.reader, pandas.read_csv и некоторые другие вещи, такие как построчный анализ.

Шаги/код для воспроизведения

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)

Особенности.txt
цель.txt

Ожидаемые результаты


Выброшенная ошибка информирует пользователя о том, что ДЕЙСТВИТЕЛЬНО не так, например, его набор данных не соответствует предположениям (и каковы они)

Фактические результаты

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'

Версии

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

Обновлять:

Я изменил количество целевых переменных на одну, просто чтобы упростить задачу.

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

Вывод: Unknown label type: 'continuous'

Самый полезный комментарий

Вы должны использовать DecisionTreeRegressor

Все 18 Комментарий

Вы должны использовать DecisionTreeRegressor

Опять же, в документации отсутствует информация о том, сколько классов может обрабатывать классификация. Я вижу, что в моем наборе данных слишком много классов, но в вашем сообщении об ошибке упоминалось что-то вроде «меток», что было достаточно запутанным, чтобы забыть, как на самом деле выглядит набор данных, и вмешиваться в методы передачи наборов данных.
Я обновил тему и прошу вас открыть ее заново.

Цели классификации должны быть представлены как целые числа или как строки. Вы можете попросить Pandas прочитать целевые данные в виде строки, и все будет в порядке.

Или используйте DecisionTreeRegressor

это не моя проблема

См. раздел «Ожидаемые результаты» моей проблемы.

Вы правы в том, что сообщение об ошибке могло бы быть более полезным, но в документации для fit действительно говорится «метки классов в классификации». Не стесняйтесь представить более четкую проблему о необходимости документировать ожидаемый тип данных для классификации y s, а другую — о появлении соответствующих сообщений об ошибках, когда данные с плавающей запятой передаются как y в классификатор.

Позвольте мне процитировать весь раздел документации, документирующий параметр y функции, подходящей для класса DecisionTreeClassifier.

Целевые значения (метки классов в классификации, реальные числа в регрессии). В случае регрессии используйте dtype=np.float64 и order='C' для максимальной эффективности.

Это не говорит о том, что у классов есть предел. Что делает целевую переменную помеченной непрерывной? Сколько классов должно быть, чтобы считаться целевой переменной регрессионного типа? Если речь идет о регрессии, то могу ли я сделать регрессию с помощью DecisionTreeClassifier? Почему нет? И т.д...

Что касается вашего предыдущего комментария:

Цели классификации должны быть представлены как целые числа или как строки. Вы можете попросить Pandas прочитать целевые данные в виде строки, и все будет в порядке.

Означает ли это, что классы не могут быть представлены как числа с плавающей запятой? Или как диктует? Списки? Кортежи? Лонги? Двойники? байты? Я знаю, что логично представлять классы как целые числа или строки, так как их не должно быть много. Но должны ли они? Каковы ограничения?

А что касается создания нового тикета, разве это не бесполезно, раз уж мы здесь поговорили? Создавать новый тикет только для того, чтобы объяснить другому парню то же самое?

Это не количество классов. Это использование не целых чисел и не строк.

Мне нравится, когда описания проблем сфокусированы. Ваше беспокойство, поднятое здесь
казалось, что это больше проблема использования.

И, пожалуйста, не беспокойте меня по поводу того, что я предлагаю. Это не единственная проблема
Я имею дело с.

2 ноября 2016 г. в 00:24 Петр Камода ( [email protected] ) написал:

Позвольте мне процитировать весь раздел документации, документирующий параметр y
функция подходит для класса DecisionTreeClassifier

Целевые значения (метки классов в классификации, реальные числа в
регресс). В случае регрессии используйте dtype=np.float64 и order='C' для
максимальная эффективность.

Это не говорит о том, что у классов есть предел. Что делает целевую переменную
помечен как непрерывный? Сколько классов должно быть там, чтобы считаться
Целевая переменная типа регрессии? Если речь идет о регрессии, то могу ли я сделать
регрессия с использованием DecisionTreeClassifier? Почему нет? И т.д...

А что касается создания нового билета, разве это не бесполезно, так как у нас было довольно много
говорить здесь? Создавать новый тикет только для того, чтобы объяснить другому парню то же самое?


Вы получаете это, потому что вы изменили состояние открытия/закрытия.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment-257565248 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AAEz63zNA0Qc4lzgHttXx-4VFkJFwFaDks5q5z16gaJpZM4KlSFw
.

Вам не нужно решать это сегодня, я только пытаюсь сделать проблему плохих описаний ошибок и плохой документации по древовидному классификатору и регрессору активной и задачей для будущих выпусков.

Будет ли лучше сообщение об ошибке «Неподдерживаемый тип вывода:« непрерывный-множественный вывод »»? Это _реальная_ проблема. Также см. # 7809 для строки документации.

Так-то лучше. Но все же я не понимаю, почему вы не назовете его таким, какой он есть. Потому что литература в основном называет эти переменные «Целевыми», и вывод может быть ошибочно принят за вывод функции. Исключение было вызвано функцией «check_classification_targets», поэтому даже вы говорите, что это «целевая» переменная, и все же вы хотите называть ее «меткой» или «выходом». Я не являюсь участником scikit-learn, так что делайте, что хотите, но я бы рекомендовал использовать слова «Целевая переменная» в строке документации и сообщении об ошибке. И я прошу вас описать где-нибудь правила, которым должны следовать входные данные (или цель). Короткое предложение — «Целевая переменная (параметр y) должна быть int или str».

Возможно стоит упомянуть в/рядом с новым разделом (45cb11d / #7519)
по подбору мультиклассов и мультилейблов в учебнике. А может это все
относится к разделу руководства пользователя по соглашениям о представлении данных,
описание форматов ввода/вывода для всех стандартных методов...?

2 ноября 2016 г. в 20:56 Петр Камода ( [email protected] ) написал:

Так-то лучше. Но все же я не понимаю, почему ты не назовешь это так
является. Поскольку в литературе это в основном называется «целевыми» переменными, а вывод
можно ошибиться с выводом функции. Исключение было выброшено из функции
'check_classification_targets', так что даже вы говорите, что это 'целевая' переменная,
и все же вы хотите назвать это «меткой» или «выходом». я не член
участник scikit-learn, так что делайте, что хотите, но я бы порекомендовал
используйте слова «Целевая переменная» в строке документации и сообщении об ошибке. И я прошу тебя
для описания правил, которым должны следовать входные данные (или цель). А
короткое предложение - «Целевая переменная (параметр y) должна быть int или str».


Вы получаете это, потому что вы изменили состояние открытия/закрытия.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/scikit-learn/scikit-learn/issues/7801#issuecomment-257820087 ,
или заглушить тему
https://github.com/notifications/unsubscribe-auth/AAEz68AqYGWrP1C-BinLXGGHNt0VtV_qks5q6F5rgaJpZM4KlSFw
.

Я отсканировал документ, и кажется, что это хорошее место, чтобы упомянуть об этих соглашениях. Кроме того, если вы не хотите слишком сильно запутывать сообщения об ошибках, идея размещения этой информации в руководстве пользователя также неплохая.
Что ж, окончательное решение (если оно есть) будет таким, как вы хотите, я просто говорю, что идея кажется хорошей, но у вас есть свои условности. Я не буду заставлять тебя что-то делать.

«Целевая переменная (параметр y) должна быть int или str». это неправильно, потому что мы поддерживаем мульти-метки и мульти-выход мульти-целевой

Кроме того, произвольные объекты, не являющиеся числами с плавающей запятой, поддерживаются в качестве меток классов, они не обязательно должны быть целыми числами или строками.

Если мы поместим в качестве входных данных training_data_X, training_scores_Y, чтобы соответствовать методу, это вызовет ошибку. Чтобы этого избежать, мы конвертируем и кодируем метки

предварительная обработка импорта из sklearn
из утилит импорта sklearn
lab_enc = предварительная обработка.LabelEncoder()
y_train = lab_enc.fit_transform (y_train)
печать (y_train)
печать (utils.multiclass.type_of_target (y_train))
печать (utils.multiclass.type_of_target (y_train.astype ('int')))
печать (utils.multiclass.type_of_target (y_train))

У меня такая же проблема, есть решение?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги