binarizing-label-features

标签特征二元化

在这个主题中,我们将用另一种方式来演示分类变量。有些时候只有一两个分类特征是重要的,这时就要避免多余的维度,如果有多个分类变量就有可能会出现这些多余的维度。

Getting ready

处理分类变量还有另一种方法,不需要通过OneHotEncoder,我们可以用LabelBinarizer。这是一个阈值与分类变量组合的方法。演示其用法之前,让我们加载iris数据集:

In [1]:
from sklearn import datasets as d
iris = d.load_iris()
target = iris.target

How to do it...

导入LabelBinarizer()创建一个对象:

In [2]:
from sklearn.preprocessing import LabelBinarizer
label_binarizer = LabelBinarizer()

现在,将因变量的值转换成一个新的特征向量:

In [3]:
new_target = label_binarizer.fit_transform(target)

让我们看看new_targetlabel_binarizer对象的结果:

In [4]:
new_target.shape
Out[4]:
(150, 3)
In [5]:
new_target[:5]
Out[5]:
array([[1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0],
       [1, 0, 0]])
In [6]:
new_target[-5:]
Out[6]:
array([[0, 0, 1],
       [0, 0, 1],
       [0, 0, 1],
       [0, 0, 1],
       [0, 0, 1]])
In [9]:
label_binarizer.classes_
Out[9]:
array([0, 1, 2])

How it works...

iris的因变量基数为3,就是说有三种值。当LabelBinarizer将$N \times 1$向量转换成$N \times C$矩阵时,$C$就是$N \times 1$向量的基数。需要注意的是,当label_binarizer处理因变量之后,再转换基数以外的值都是[0,0,0]

In [15]:
label_binarizer.transform([4])
Out[15]:
array([[0, 0, 0]])

There's more...

0和1并不一定都是表示因变量中的阳性和阴性实例。例如,如果我们需要用1000表示阳性值,用-1000表示阴性值,我们可以用label_binarizer处理:

In [22]:
label_binarizer = LabelBinarizer(neg_label=-1000, pos_label=1000)
label_binarizer.fit_transform(target)[:5]
Out[22]:
array([[ 1000, -1000, -1000],
       [ 1000, -1000, -1000],
       [ 1000, -1000, -1000],
       [ 1000, -1000, -1000],
       [ 1000, -1000, -1000]])

阳性和阴性值的唯一限制是,它们必须为整数。