离散型特征的处理方法
機器學習中,常常在數據集中會遇到一些離散特征,對于這些離散特征相比連續特征要用不同的處理方法,常見的方法有LabelEncoder與OneHotEncoder。
LabelEncoder
LabelEncoder用來對離散型分類型特征值進行編碼,可以對本文編碼,也可以對數字編碼。sklearn中也提供給相應的工具包以便使用:
sklearn.preprocessing.LabelEncoder
常用方法如下:
fit(y) :訓練?y數據集,與其他模型的fit方法類似。
fit_transform(y):相當于先進行fit再進行轉換,返回標簽編碼。?
inverse_transform(y):將標簽編碼返回為初始值。?
transform(y) :直接返回標簽編碼。
示例如下:
from sklearn.preprocessing import LabelEncoder#文字內容 le = LabelEncoder()le.fit_transform(['天津','北京','上海','南京','北京']) #array([3, 1, 0, 2, 1], dtype=int64) le.transform(['天津','北京','上海','南京','北京']) #array([3, 1, 0, 2, 1], dtype=int64) le.inverse_transform([3, 1, 0, 2, 1]) #array(['天津', '北京', '上海', '南京', '北京'], dtype='<U2')#數字內容 le.fit_transform([2,2,4,8,7]) #array([0, 0, 1, 3, 2], dtype=int64) le.transform([2,2,4,8,7]) #array([0, 0, 1, 3, 2], dtype=int64) le.inverse_transform([0, 0, 1, 3, 2]) #array([2, 2, 4, 8, 7])通過上面的實例可以看到,LabelEncoder既可以對文字內容編碼,也可以對數字內容編碼,都是以0開始的數字為不同的內容編碼,相同的內容則用同一數字。但是當LabelEncoder的結果對于計算機處理數據時的效果并不是很好,此時會考慮onehot編碼。
OneHotEncoder
OneHotEncoder同樣是對離散特征編碼,離散特征中有多少不同的值,就用多少維來表示該特征。這是與LabelEncoder最大的區別所在。sklearn提供的工具如下:
sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, sparse=True, dtype=<class ‘numpy.float64’>, handle_unknown=’error’)
(部分參數新版本可能取消,只需了解sparse、categories即可)
| 參數 | 含義 |
| sparse | 默認為True,如果設置為True將返回稀疏矩陣,否則將返回一個數組。 |
| categories | 默認為'auto',從訓練數據中自動確定類別。可選為list,categories[i]保存第i列中預期的類別。 |
常用方法如下:
fit(y) :訓練?y數據集,與其他模型的fit方法類似。
fit_transform(y):相當于先進行fit再進行轉換,返回標簽編碼。?
inverse_transform(y):將標簽編碼返回為初始值。?
transform(y) :直接返回標簽編碼。
示例如下:
from sklearn.preprocessing import OneHotEncoderohe = OneHotEncoder()x=[['天津'],['北京'],['上海'],['南京'],['北京']]ohe.fit_transform(x).toarray() #array([[0., 0., 0., 1.], # [0., 1., 0., 0.], # [1., 0., 0., 0.], # [0., 0., 1., 0.], # [0., 1., 0., 0.]]) ohe.transform(x).toarray() #array([[0., 0., 0., 1.], # [0., 1., 0., 0.], # [1., 0., 0., 0.], # [0., 0., 1., 0.], # [0., 1., 0., 0.]]) ohe.inverse_transform(array([[0., 0., 0., 1.],[0., 1., 0., 0.],[1., 0., 0., 0.],[0., 0., 1., 0.],[0., 1., 0., 0.]])) #array([['天津'], # ['北京'], # ['上海'], # ['南京'], # ['北京']], dtype=object)可以看到,與LabelEncoder不同的地方在于OneHotEncoder將內容編碼為0,1的形式,LabelEncoder是將內容編輯為0,1,2,...的形式。為了使非偏序關系的變量取值不具有偏序性,并且到圓點是等距的。使用one-hot編碼,讓特征之間的距離計算更加合理。同時one-hot方法也有缺陷,當類別的數量很多時,特征空間會變得非常大,計算復雜度會變高,成本也會變大。
除此之外呢,pandas中的get_dummies()函數也具有與one-hot相同的功能,感興趣的同學可以自行嘗試~
總結
以上是生活随笔為你收集整理的离散型特征的处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序用canvasToTempFi
- 下一篇: 中国各省名字的由来