python 數據處理中的 LabelEncoder 和 OneHotEncoder

        One-Hot 編碼即獨熱編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每一個狀態都由他獨立的寄存器位,而且在任意時候,其中只有一位有效。這樣作的好處主要有:1. 解決了分類器很差處理屬性數據的問題; 2. 在必定程度上也起到了擴充特徵的做用。html

       將離散型特徵進行one-hot編碼的做用,是爲了讓距離計算更合理,但若是特徵是離散的,而且不用one-hot編碼就能夠很合理的計算出距離,那麼就不必進行one-hot編碼。離散特徵進行one-hot編碼,編碼後的特徵,其實每一維度的特徵均可以看作是連續的特徵。就能夠跟對連續型特徵的歸一化方法同樣,對每一維特徵進行歸一化。好比歸一化到[-1,1]或歸一化到均值爲0,方差爲1。算法

        基於樹的方法是不須要進行特徵的歸一化,例如隨機森林,bagging 和 boosting等。基於參數的模型或基於距離的模型,都是要進行特徵的歸一化。Tree Model不太須要one-hot編碼: 對於決策樹來講,one-hot的本質是增長樹的深度。瀏覽器

        one hot encoding的優勢就是它的值只有0和1,不一樣的類型存儲在垂直的空間。缺點就是,當類別的數量不少時,特徵空間會變得很是大。在這種狀況下,通常能夠用PCA來減小維度。並且one hot encoding+PCA這種組合在實際中也很是有用。總的來講,要是one hot encoding的類別數目不太多,建議優先考慮。機器學習

# 簡單來講 LabelEncoder 是對不連續的數字或者文本進行編號
# sklearn.preprocessing.LabelEncoder():標準化標籤,將標籤值統一轉換成range(標籤值個數-1)範圍內

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
out: array([0, 0, 3, 2, 1], dtype=int64)

#OneHotEncoder 用於將表示分類的數據擴維:
from sklearn.preprocessing import OneHotEncode
ohe = OneHotEncoder()
ohe.fit([[1],[2],[3],[4]])
ohe.transform([[2],[3],[1],[4]]).toarray()
out:array([[ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.]])

- 源碼:學習

 Examples
    --------
    Given a dataset with three features and four samples, we let the encoder
    find the maximum value per feature and transform the data to a binary
    one-hot encoding.

    >>> from sklearn.preprocessing import OneHotEncoder
    >>> enc = OneHotEncoder()
    >>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], \
[1, 0, 2]])  # doctest: +ELLIPSIS
    OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
           handle_unknown='error', n_values='auto', sparse=True)
    >>> enc.n_values_
    array([2, 3, 4])
    >>> enc.feature_indices_
    array([0, 2, 5, 9])
    >>> enc.transform([[0, 1, 1]]).toarray()
    array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])
 Examples
    --------
    `LabelEncoder` can be used to normalize labels.

    >>> from sklearn import preprocessing
    >>> le = preprocessing.LabelEncoder()
    >>> le.fit([1, 2, 2, 6])
    LabelEncoder()
    >>> le.classes_
    array([1, 2, 6])
    >>> le.transform([1, 1, 2, 6]) #doctest: +ELLIPSIS
    array([0, 0, 1, 2]...)
    >>> le.inverse_transform([0, 0, 1, 2])
    array([1, 1, 2, 6])

    It can also be used to transform non-numerical labels (as long as they are
    hashable and comparable) to numerical labels.

    >>> le = preprocessing.LabelEncoder()
    >>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
    LabelEncoder()
    >>> list(le.classes_)
    ['amsterdam', 'paris', 'tokyo']
    >>> le.transform(["tokyo", "tokyo", "paris"]) #doctest: +ELLIPSIS
    array([2, 2, 1]...)
    >>> list(le.inverse_transform([2, 2, 1]))
    ['tokyo', 'tokyo', 'paris']

1、One-Hot Encoding

    One-Hot編碼,又稱爲一位有效編碼,主要是採用位狀態寄存器來對個狀態進行編碼,每一個狀態都由他獨立的寄存器位,而且在任意時候只有一位有效。
有以下三個特徵屬性:

2、One-Hot Encoding的處理方法

3、實際的Python代碼

    在實際的機器學習的應用任務中,特徵有時候並不老是連續值,有多是一些分類值,如性別可分爲「male」和「female」。在機器學習任務中,對於這樣的特徵,一般咱們須要對其進行特徵數字化,以下面的例子:
  • 性別:["male","female"]
  • 地區:["Europe","US","Asia"]
  • 瀏覽器:["Firefox","Chrome","Safari","Internet Explorer"]
對於某一個樣本,如["male","US","Internet Explorer"],咱們須要將這個分類值的特徵數字化,最直接的方法,咱們能夠採用序列化的方式:[0,1,3]。可是這樣的特徵處理並不能直接放入機器學習算法中。
    對於上述的問題,性別的屬性是二維的,同理,地區是三維的,瀏覽器則是4維的,這樣,咱們能夠採用One-Hot編碼的方式對上述的樣本「["male","US","Internet Explorer"]」編碼,「male」則對應着[1,0],同理「US」對應着[0,1,0],「Internet Explorer」對應着[0,0,0,1]。則完整的特徵數字化的結果爲:[1,0,0,1,0,0,0,0,1]。這樣致使的一個結果就是數據會變得很是的稀疏。
相關文章
相關標籤/搜索