前面我们省略了分类属性ocean_proximity,因为它是一个文本属性,所以我们无法计算它的中值。大多数机器学习算法都倾向于使用数字,所以让我们把这些文本标签转换成数字。

Scikit-Learn 为实现这项任务提供了LabelEncoder这个转换器:

>>> from sklearn.preprocessing import LabelEncoder
>>> encoder = LabelEncoder()
>>> housing_cat = housing["ocean_proximity"]
>>> housing_cat_encoded = encoder.fit_transform(housing_cat)
>>> housing_cat_encoded
array([1, 1, 4, ..., 1, 0, 3])

这是非常好用:现在我们可以在任何ML算法中使用这个数字数据。你可以看看这个编码器使用classes_属性习得的映射(““<1H OCEAN””映射到0,“INLAND”映射到1,等等)。

>>> print(encoder.classes_)
['<1H OCEAN' 'INLAND' 'ISLAND' 'NEAR BAY' 'NEAR OCEAN']

这个表示的一个问题是,ML算法会假设两个相邻的值比两个相远的值更相似。但在现实中,显然情况并非如此(例如类别0和4可以比类别0和1更相似)。为了解决这个问题,一个常见的解决方案是为每个类别创建一个二元属性:当类别等于“<1H OCEAN”时,一个属性等于1(否则就是0);而当类别等于“INLAND”时,另一个属性等于1(反之等于0),等等。这被称为一one-hot encoding[独热编码],因为只有一个属性将等于1(hot),而其他属性将为0(cold)。

Scikit-Learn提供了一个OneHotEncoder编码器,将整型分类值转换为一个热向量。让我们把这些类别编码为一个热向量。请注意, fit_transform()期望一个2维数组,但是 housing_cat_encoded是一个一维数组,所以我们需要重新构造它:

>>> from sklearn.preprocessing import OneHotEncoder
>>> encoder = OneHotEncoder()
>>> housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
>>> housing_cat_1hot
<16513x5 sparse matrix of type '<class 'numpy.float64'>'
    with 16513 stored elements in Compressed Sparse Row format>

注意,输出是一个SciPy稀疏矩阵,而不是一个NumPy数组。当你拥有数以千计的分类属性时,这是非常有用的。经过热编码后,我们得到一个包含数千个列的矩阵,而矩阵中一行只有一个是1,其余的全是0。使用大量内存来存储零将是非常浪费的,因此,一个稀疏矩阵只存储非零元素的位置。你可以像普通的2维数组一样使用它,但是如果你真的想把它转换成一个NumPy数组,只需要调用toarray()方法:

>>> housing_cat_1hot.toarray()
array([[ 0., 1., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
...,
[ 0., 1., 0., 0., 0.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 0., 1., 0.]])

我们可以使用LabelBinarizer类可以实现我们上面所讲述的这两种转换(即从文本类别转换到整数类别,然后从整数类别转换到热向量)应用:

>>> from sklearn.preprocessing import LabelBinarizer
>>> encoder = LabelBinarizer()
>>> housing_cat_1hot = encoder.fit_transform(housing_cat)
>>> housing_cat_1hot
array([[0, 1, 0, 0, 0],
    [0, 1, 0, 0, 0],
    [0, 0, 0, 0, 1],
    ...,
    [0, 1, 0, 0, 0],
    [1, 0, 0, 0, 0],
    [0, 0, 0, 1, 0]])

注意,这将在默认情况下返回一个密集的NumPy数组。您可以通过传递sparse_output=True到LabelBinarizer构造函数得到一个稀疏矩阵。

results matching ""

    No results matching ""