以下代码:
from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
lb.fit_transform(['yes', 'no', 'no', 'yes'])
回报:
array([[1],
[0],
[0],
[1]])
但是,我希望每个类有一个列:
array([[1, 0],
[0, 1],
[0, 1],
[1, 0]])
(我需要这种格式的数据,这样我就可以把它交给在输出层使用softmax函数的神经网络)
当有两个以上的类时,LabelBinarizer会按需要执行:
from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
lb.fit_transform(['yes', 'no', 'no', 'yes', 'maybe'])
回报
array([[0, 0, 1],
[0, 1, 0],
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]])
上面,每个类有一列。
当有两个类时,是否有任何简单的方法来实现相同的(每个类一列)?
编辑:根据杨杰的回答,我编写了一个类来包装LabelBinarizer,以生成上面描述的所需行为:http://pastebin.com/UEL2dP62
import numpy as np
from sklearn.preprocessing import LabelBinarizer
class LabelBinarizer2:
def __init__(self):
self.lb = LabelBinarizer()
def fit(self, X):
# Convert X to array
X = np.array(X)
# Fit X using the LabelBinarizer object
self.lb.fit(X)
# Save the classes
self.classes_ = self.lb.classes_
def fit_transform(self, X):
# Convert X to array
X = np.array(X)
# Fit + transform X using the LabelBinarizer object
Xlb = self.lb.fit_transform(X)
# Save the classes
self.classes_ = self.lb.classes_
if len(self.classes_) == 2:
Xlb = np.hstack((Xlb, 1 - Xlb))
return Xlb
def transform(self, X):
# Convert X to array
X = np.array(X)
# Transform X using the LabelBinarizer object
Xlb = self.lb.transform(X)
if len(self.classes_) == 2:
Xlb = np.hstack((Xlb, 1 - Xlb))
return Xlb
def inverse_transform(self, Xlb):
# Convert Xlb to array
Xlb = np.array(Xlb)
if len(self.classes_) == 2:
X = self.lb.inverse_transform(Xlb[:, 0])
else:
X = self.lb.inverse_transform(Xlb)
return X
编辑二:原来杨杰还写了一个新版本的LabelBinarizer,太棒了!
我认为没有直接的方法可以做到这一点,特别是如果你想拥有
inverse_transform
。但是可以使用numpy轻松地构造标签
然后您可以通过切片第一列来使用
inverse_transform
基于上述解决方案,您可以编写一个继承
LabelBinarizer
的类,从而使二进制和多类情况下的操作和结果一致。那么
给予
这样就可以了
相关问题 更多 >
编程相关推荐