如何在一些sklearn分类器中使用单热编码标签?

Geo*_*Liu 2 machine-learning scikit-learn

我有一个10类的多类分类任务.因此,我使用sklearn的OneHotEncoder单列标签转换为10列标签.我试图拟合训练数据.虽然我能够使用RandomForestClassifier执行此操作,但在使用GaussianNB时出现以下错误消息:

ValueError: bad input shape (1203L, 10L)
Run Code Online (Sandbox Code Playgroud)

我理解这两个分类器中允许的y形状是不同的:

GaussianNB:

y : array-like, shape (n_samples,)
Run Code Online (Sandbox Code Playgroud)

随机森林:

y : array-like, shape = [n_samples] or [n_samples, n_outputs]
Run Code Online (Sandbox Code Playgroud)

问题是,这是为什么?难道这不会与"scikit-learn中的所有分类器开箱即用的多类分类"相矛盾吗?有什么方法可以绕过它吗?谢谢!

lej*_*lot 5

问题是,这是为什么?

这是因为一个轻微的误解,在scikit-learn你编码标签,你把它作为标签的一维向量传递,因此而不是

1 0 0
0 1 0
0 0 1
Run Code Online (Sandbox Code Playgroud)

你真的通过了

1 2 3
Run Code Online (Sandbox Code Playgroud)

那么为什么随机森林会接受不同的方案呢?因为它适合多类设置!它适用于多标签,其中每个实例都可以有许多标签,例如

1 1 0
1 1 1
0 0 0
Run Code Online (Sandbox Code Playgroud)

难道这不会与"scikit-learn中的所有分类器开箱即用的多类分类"相矛盾吗?

相反 - 这是最简单的解决方案 - 除非是多标签,否则永远不要求一热

有什么方法可以绕过它吗?

是的,只是不编码 - 传递原始标签:-)