ValueError:未知标签类型:拟合数据时的“连续多输出”
Posted
技术标签:
【中文标题】ValueError:未知标签类型:拟合数据时的“连续多输出”【英文标题】:ValueError: Unknown label type: 'continuous-multioutput' when fitting data 【发布时间】:2019-11-01 14:27:03 【问题描述】:我想使用scikit-learn
的MultiOutputClassifier
根据一个输入参数预测多个结果。
由于某种原因,我总是收到此错误,我不知道是什么问题:
ValueError: Unknown label type: 'continuous-multioutput'
我尝试将my_data['Clicked']
设为分类数据,我尝试过此my_data['Clicked'] = my_data['Clicked'].astype('category')
,但它给了我同样的错误。
我在一些简单的虚拟数据库上尝试了相同的代码,并且效果很好。 这是有效的代码:
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression
dic = 'par_1': [10, 30, 13, 19, 25, 33, 23],
'par_2': [1, 3, 1, 2, 3, 3, 2],
'outcome': [101, 905, 182, 268, 646, 624, 465]
df = pd.DataFrame(dic)
variables = df.iloc[:,:-1]
results = df.iloc[:,-1]
multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs'))
multi_output_clf.fit(results.values.reshape(-1, 1),variables)
x = multi_output_clf.predict([[100]])
print(x)
对于上面的代码,一切正常,但对于下面的代码,我得到了错误。
我不知道是什么问题,因为我刚刚使用了更大的数据集和值,据此预测参数只有 0 和 1。零和一应该是类(类别),如yes
和no
,但如果我将它们更改为“是”和“否”,我会得到cannot convert string to float
的错误。为什么这不是连续的“结果”:[101、905、182、268、646、624、465] 但一系列 0 和 1 是连续的?
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression
variables = my_data[['Clicked']] #values are integers, only 0 and 1 (0 = not clicked , 1 = clicked)
results = my_data[['Daily Time on Site', 'Age', 'Gender']] #values are integers and floats
multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs'))
multi_output_clf.fit(variables.values.reshape(-1, 1),results)
x = multi_output_clf.predict([1])
print(x)
以下是我使用过的完整数据集的一部分(它给了我同样的错误):
dic = 'Daily Time on Site': [59.99, 88.91, 66.00, 74.53, 69.88, 47.64, 83.07, 69.57],
'Age': [23,33,48,30,20,49,37,48],
'Gender': [1, 0, 1, 1, 1, 0, 1, 1],
'Clicked': [0, 0, 1, 0, 0, 1, 0, 1]
my_data = pd.DataFrame(dic)
variables = my_data[['Clicked']] #values are only 0 and 1 (0 = not clicked , 1 = clicked)
results = my_data[['Daily Time on Site', 'Age', 'Gender']] #values are integers and floats
multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs', multi_class='ovr'))
multi_output_clf.fit(variables.values.reshape(-1, 1),results)
x = multi_output_clf.predict([1])
print(x)
【问题讨论】:
ValueError: Unknown label type: 'continuous'的可能重复 @DavidZemens 我已经检查了那个问题和答案,但它不一样,它没有帮助。它不是同一个错误 该错误似乎是由同一个问题引起的,查看该堆栈跟踪:if y_type not in ['binary', 'multiclass', 'multiclass-multioutput', 'multilabel-indicator', 'multilabel-sequences']
。显然,continuous-multioutuput
不在这种情况下,并且会引发相同的错误。那么,您是否尝试过回归?如果是这样,请展示您的作品。问一个好的 Q 的一部分是解释你已经尝试过什么(以及这些努力可能会如何失败)。
另见:***.com/questions/42625077/…
我之前已经阅读了这两个答案,但它没有回答我的问题。答案之一是“目标变量 y 具有二维(多输出)并且不是离散的(而是连续的)”。我怎么知道它是离散的还是连续的?查看我编写的有效代码,为什么这不是连续的“结果”:[101、905、182、268、646、624、465] 但一系列 0 和 1 是连续的?
【参考方案1】:
我认为您需要选择MultiOutputRegressor()
,因为您的输出变量似乎是连续的。
尝试以下更改:
variables = my_data[['Clicked']] #values are only 0 and 1 (0 = not clicked , 1 = clicked)
results = my_data[['Daily Time on Site', 'Age', 'Gender']] #values are integers and floats
multi_output_clf = MultiOutputRegressor(LinearRegression())
multi_output_clf.fit(variables.values.reshape(-1, 1),results)
更新:
>>> pd.cut(my_data['Daily Time on Site'],
... 3, labels=["low", "medium", "high"])
0 low
1 high
2 medium
3 medium
4 medium
5 low
6 high
7 medium
注意:不建议将整数作为您的类别,因为当您的变量的值范围很大时,类别的数量可能会非常高。请将它们分成较小的组,例如 10 或 20,然后将它们视为分类值。
【讨论】:
我明白,但为什么呢?连续是什么意思?为什么这不是连续的'outcome': [101, 905, 182, 268, 646, 624, 465]
,而是一系列的 0 和 1 是连续的?
而我要使用分类
我试过这个my_data['Clicked'] = my_data['Clicked'].astype('category')
但它给了我同样的错误。
我更新了问题,我又添加了一段代码,你可以测试一下
当我说输出变量时,我的意思是['Daily Time on Site', 'Age', 'Gender']
。连续变量是指不可计算的变量。参考this链接【参考方案2】:
我找到了解决方案,为了消除这个错误,所有输出变量的值,在这种情况下 ['Daily Time on Site', 'Age', 'Gender']
需要是整数,而不是浮点数
dic = 'Daily Time on Site': [59.99, 88.91, 66.00, 74.53, 69.88, 47.64, 83.07, 69.57],
'Age': [23,33,48,30,20,49,37,48],
'Gender': [1, 0, 1, 1, 1, 0, 1, 1],
'Clicked': [0, 0, 1, 0, 0, 1, 0, 1]
my_data = pd.DataFrame(dic)
my_data['Daily Time on Site']= my_data['Daily Time on Site'].round(0)
variables = my_data[['Clicked']] #values are only 0 and 1 (0 = not clicked , 1 = clicked)
results = my_data[['Daily Time on Site', 'Age', 'Gender']] #values are integers and floats
multi_output_clf = MultiOutputClassifier(LogisticRegression(solver='lbfgs', multi_class='ovr'))
multi_output_clf.fit(variables.values.reshape(-1, 1),results)
x = multi_output_clf.predict([1])
print(x)
【讨论】:
Daily Time on Site
中的类别数量可能会非常高,我的建议是根据您的选择将它们分组到一定数量的桶中。
@taga,您发布的答案不是因为浮点数或实际值,而是因为分类器的选择。您选择了logistic regression
,它原则上解释了一个因二元变量与一个或多个名义、序数、区间或比率水平自变量之间的关系。这里的依赖二进制变量是Clicked
。
@ai_learning变量Daily Time on Site
本质上是一个连续变量。对它进行分桶的建议,原则上类似于创建类别,这有点冒险。因为那样变量的真实性质就会丢失。将出现的另一个问题是如何解释和确定混淆桶上生成的分类器的精度
好的,所以底线是...如果我使用MultiOutputClassifier
我的输出值,在这种情况下['Daily Time on Site', 'Age', 'Gender']
应该是“类”/“类别”?以上是关于ValueError:未知标签类型:拟合数据时的“连续多输出”的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:未知标签类型:DecisionTreeClassifier() 中的“连续”