Scikit-learn: DecisionTreeClassifier 未知标签类型:“连续多输出”

创建于 2016-10-31  ·  18评论  ·  资料来源: scikit-learn/scikit-learn

描述


DecisionTreeClassifier 与unknown label type: 'continuous-multioutput'一起崩溃。 我尝试使用 csv.reader、pandas.read_csv 和其他一些东西(例如逐行解析)加载 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传递给分类器时引发适当的错误消息的另一个问题。

让我引用文档的整个部分,该文档记录了类 DecisionTreeClassifier 中函数拟合的参数 y

目标值(分类中的类标签,回归中的实数)。 在回归情况下,使用 dtype=np.float64 和 order='C' 以获得最大效率。

这并不是说课程有上限。 是什么使标记为连续的目标变量? 必须有多少类才能被视为回归类型目标变量? 如果它是关于回归的,那么我可以使用 DecisionTreeClassifier 进行回归吗? 为什么不? 等等...

至于你之前的评论:

分类目标应表示为整数或字符串。 您可以要求 Pandas 将目标数据作为字符串读取,就可以了。

这是否意味着类不能表示为浮点数? 还是作为字典? 列表? 元组? 多头? 双打? 字节? 我知道将类表示为整数或字符串是合乎逻辑的,因为它们不应该很多。 但他们必须这样做吗? 有什么限制?

至于创建新票,我们在这里谈了很多,这不是没用吗? 创建新票只是为了向其他人解释同样的事情?

这不是班级的数量。 它使用非整数和非字符串。

我喜欢问题描述的重点。 您在这里提出的问题
似乎更多的是使用问题。

请不要因为我的建议而困扰我。 这不是唯一的问题
我正在处理。

2016 年 11 月 2 日 00:24,Piotr Kamoda [email protected]写道:

让我引用文档中记录参数 y 的整个部分
函数适合类 DecisionTreeClassifier

目标值(分类中的类标签,中的实数
回归)。 在回归情况下,使用 dtype=np.float64 和 order='C'
最大效率。

这并不是说课程有上限。 什么使目标变量
标记为连续? 需要考虑多少个类
回归类型目标变量? 如果它是关于回归,那么我可以做
使用决策树分类器回归? 为什么不? 等等...

至于创建新票,那不是没用,因为我们已经有很多
在这里说话? 创建新票只是为了向其他人解释同样的事情?


您收到此消息是因为您修改了打开/关闭状态。
直接回复此邮件,在 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 成员的成员,所以您可以随心所欲,但我建议在 doscstring 和错误消息中使用“目标变量”一词。 我要求您描述输入数据(或目标)应遵循的任何规则。 一个简短的句子 - '目标变量(参数 y)必须是 int 或 str'。

也许值得一提的是在新部分中/旁边 (45cb11d / #7519)
关于教程中的多类和多标签拟合。 或者也许这一切
属于用户指南中有关数据表示约定的部分,
描述所有标准方法的输入/输出格式......?

2016 年 11 月 2 日 20:56,Piotr Kamoda [email protected]写道:

这样更好。 但我还是不明白你为什么不把它命名为它
是。 因为文献大多称其为“目标”变量,并且输出
可能会误认为函数输出。 函数抛出异常
'check_classification_targets',所以即使你说那是'target'变量,
你仍然想称它为“标签”或“输出”。 我不是会员
scikit-learn 成员,所以你可以随心所欲,但我建议
在 doscstring 和错误消息中使用单词“目标变量”。 我问你
描述输入数据(或目标)应遵循的任何规则。 一个
短句 - '目标变量(参数 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 = preprocessing.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 等级