使用sklearn訓練模型,只能輸入數值型變量。因此需要對數據集中的非數值型離散變量進行處理,非數值型離散變量分為兩類:有序型與無序型

一、有序型離散變量處理
什么叫有序型離散變量呢,比如說衣服尺碼,M、L、XL;學歷:小學、初中、高中、本科;這些都屬於有序型變量。
在上圖數據表格中,size及classlabel則為有序型變量,自定義有序型字典表,進行相關映射即可:

二、無序型離散變量處理
衣服的顏色,風向、人員類別這些都屬於無序型變量,如果轉換成有序型數值代入模型會對建模結果造成影響,因此對於無序型變量需要做獨熱編碼或者啞變量處理
(1)獨熱編碼
獨熱編碼,又稱為一位有效編碼,主要是采用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。 獨熱編碼是分類變量作為二進制向量的表示,這首先要求將分類值映射到整數值,然后再將每個整數值表示為二進制向量。
具體操作如下:首先將無序型變量color利用LabelEncoder()方法映射為數值

再將整數型數值進行獨熱編碼

(2)啞變量處理
在模型中引入多個虛擬變量時,虛擬變量的個數應按下列原則確定: 如果有m種互斥的屬性類型,在模型中引入(m-1)個虛擬變量。 例如,性別有2個互斥的屬性,引用2-1=1個虛擬變量;再如,文化程度分小學、初中、高中、大學、研究生5類,引用4個虛擬變量。
pandas中的get_dummies方法來創建啞特征,get_dummies默認會對DataFrame中所有字符串類型的列進行獨熱編碼:

在實際特征工程處理過程中,使用LabelEncoder()+OneHotEncoder()方式,sklearn能夠將訓練集屬性記錄,並可以采用transform()方法直接作用於待加入模型的測試集。
什么情況下用都熱編碼:
- 用:獨熱編碼用來解決類別型數據的離散值問題,
- 不用:將離散型特征進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特征是離散的,並且不用one-hot編碼就可以很合理的計算出距離,那么就沒必要進行one-hot編碼。 有些基於樹的算法在處理變量時,並不是基於向量空間度量,數值只是個類別符號,即沒有偏序關系,所以不用進行獨熱編碼。 Tree Model不太需要one-hot編碼: 對於決策樹來說,one-hot的本質是增加樹的深度。
總的來說,要是one hot encoding的類別數目不太多,建議優先考慮。
