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']