在建模的過程中,我們常會遇到一個問題,就是我們所採用的sklearn系列模型不支援類別型的特徵,需要進行轉換後才能使用。但一般來說,我們的資料集都不小,一個一個曠日廢時的轉換可真讓人吃不消啊! 因此,今天我們要來分享sklearn裡面的LabelEncoder,輕鬆解決轉換問題!
特徵轉換: 將類別型資料轉換為數值型資料
舉例來說,今天想要用機器學習模型來預測在怎麼樣的天氣底下適合外出運動。下表是我們擁有的3個天氣特徵,分別為weather, feeling 與 temperature. 其中 weather 與 feeling的資料皆屬於類別型資料,因此直接餵入我們首部曲中所學習的模型會產生錯誤,因為這些模型不接受類別型的資料。
該怎麼辦呢? 這時,我們需要透過轉換,把資料轉換成數值型,讓模型可以很好的運作。我們以下表的特徵資料為例,分享兩種方法。
1. Map
就最傳統的角度來說,以weather為例。我們看到weather裡面分別有windy與sunny,那我們可以很直觀把windy當作一類,代號叫0;sunny為另一類,代號叫1。同理,在feeling部分,分別有hot與cold,我們也可以把hot當一類,cold當一類。因此,我們可以分別把這些條件寫進dictionary存起來,再用”.map(dictionary)”來做mapping。範例如下:
weather_mapping={'windy':0,'sunny':1,'cloudy':2}
feeling_mapping={'hot':0,'cold':1}
df['weather']=df['weather'].map(weather_mapping)
df['feeling']=df['feeling'].map(feeling_mapping)
2. LabelEncoder
然而,當我們特徵裡面的類別不只兩種,而是有非常多種的時候,Map的方法就會略顯辛苦。而sklearn的預處理模組裡面提供了我們很好用的一個小工具—LabelEncoder. 透過這個LabelEncoder, 我們就不需要自己創建對應的dictionary, LabelEncoder會幫我們自動生成! 範例如下:
le=LabelEncoder()
df['weather']=le.fit_transform(df['weather'])
df['feeling']=le.fit_transform(df['feeling'])
更方便的是,如果特徵數量很多,且很多都是需要轉換的類別型資料,我們只要再外面包個迴圈,就可以一次搞定了!
for col in df[['weather','feeling']]:
df[col]=le.fit_transform(df[col])
總結一下,今天我們學會了兩種特徵資料轉換的方式,一種是較為彈性可以決定轉換值的map方法,另一種為超級自動化的LabelEncoder。當然,如果有特別需求,這兩種方法也可以搭配著一起使用。透過這兩種轉換方法,讓我們在建模前的資料處理上更具效率!
程式檔案,歡迎於此下載。