【问题标题】:How to fit multidimensional output using scikit-learn?如何使用 scikit-learn 拟合多维输出?
【发布时间】:2014-01-06 20:35:06
【问题描述】:

我正在尝试将 OneVsAll 分类输出拟合到训练数据中,输出行加起来为 1。

一种可能的方法是读取所有行并找出哪一列的值最高,然后为训练准备数据。

例如:y = [[0.2,0.8,0],[0,1,0],[0,0.3,0.7]] 可以简化为 y = [b,b,c],分别将 a,b,c 视为列 0,1,2 的对应类。

scikit-learn 中是否有一个函数可以帮助实现这种转换?

【问题讨论】:

  • 可能您的意思是[a,b,c],或者为什么[0.2,0.8,0] 与[0,1,0] 具有相同的类?
  • [a,b,c] 是索引 0,1,2 和 [0.2,0.8,0] 中对应的列标签,因为索引 1 具有最高值,它将归类为 b

标签: python scipy scikit-learn


【解决方案1】:

这段代码做你想做的事:

import numpy as np
import string

y = np.array([[0.2,0.8,0],[0,1,0],[0,0.3,0.7]])

def transform(y,labels):
  f = np.vectorize(lambda i : string.letters[i])
  y = f(y.argmax(axis=1)) 
  return y

y = transform(y,'abc') 

编辑:使用 alko 的评论,我更一般地让用户将标签提供给转换函数。

【讨论】:

  • 是的,它会起作用,但是您不认为在三个班级中只参加一个班级会丢失信息吗?我的意思是示例 [0.45,0.55,0] 将导致 'b' 但有一些关于 'a' 的信息被评为非常接近 'a' 。以防万一您了解机器学习和多类分类,如果您能对此有所了解,我将很高兴
  • 您可以选择使用import string; def f(i): return string.letters[i] 来处理更多维度。
  • 是的,有信息丢失,但这里需要。如果您必须进行预测,则会要求您做出决定,并且您会使用最可能的类别。
  • 你可以通过索引数组np.array(list(string.letters))来替换(昂贵的)lambda和vectorize。
猜你喜欢
  • 2015-12-01
  • 2016-02-05
  • 2017-08-13
  • 2016-02-25
  • 2019-01-08
  • 2014-01-27
  • 2013-12-19
  • 2014-09-17
  • 1970-01-01
相关资源
最近更新 更多