使用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的類别數目不太多,建議優先考慮。