close

我很驚訝在一份收費的正式教材裡,竟然看到把LabelEncoder完之後的數值,拿去跑模型。然後還煞有其事的和OneHotEncoder做模型之間的比較?這是什麼毫無統計觀念的人做出來的教材?

2_1.png

先以最容易理解的線性模型來說,要看「解釋變數(x)」與「被解釋變數(y)」間的關係,的前提!建立在這些變數本身彼此間的數值大小是有意義的,舉例來說:x是職場年資、y是年收入,我們預期x越高、y會越高,但實際是不是這麼一回事,我們以模型來觀察,是不是符合我們預期。

 

無論符不符合預期,這個觀察都是有意義的,因為變數本身數值間的大小有意義:x越小表示年資越小、x越大表示年資越大;同理y越小表示年營收越小、y越大表示年營收越大。簡直就像廢話一樣,但這麼有意義的廢話,正是一個模型要有意義的重大前提。

 

LabelEncoder,中文翻譯為「標籤編碼」,這在做什麼事情?

 

它將「非數值的文字內容,給上數值編號」,如下圖舉例,我將非數值的縣市名稱,給上編號:

2_2.png

你覺得,這個編號(縣市_LE),和它的人口,會有任何關係嗎?我去「觀察這個編號和人口做出來的模型」的這個舉動,有任何意義嗎?為什麼沒關係?為什麼沒意義?因為最重要的大前提:編號(縣市_LE)越小表示什麼?不表示什麼!編號(縣市_LE)越大表示什麼?也不表示什麼!所以可想而知並不會發生「編號越大,人口越多;編號越小,人口越少(或反之)」這種鬼事。

 

再換句話說,拿任何的非數值欄位做LabelEncoder之後,將產出的這個編號數值拿去改善模型,根本它馬兒的一點意義都沒有!結果我竟然在某份收費教材裡面看到這種教學?甚至網路一查,發現還不少Python文章在講要先把非數值欄位做LabelEncoder,然後拿去改善模型?我簡直傻眼大貓咪。

 

LabelEncoder完的數值不能拿去改善模型,在於LabelEncoder的編碼是隨機無意義的,如上圖把嘉義縣標2、新北市標7,就算現在打亂重新編碼,嘉義縣變成6、新北市變成3,我們也不會覺得這樣的LabelEncoder編碼是「錯誤的」,對吧?但在前後同樣都是「正確的」LabelEncoder編碼之下,卻有截然不同的模型產生,這不就證明了LabelEncoder編碼和模型是脫鉤毫無相關的嗎?

 

就像是,我把年資2年的人改寫成6年、把年資7年的人改寫成3年,這個舉動之荒謬,我們馬上能肯定這種改寫是「錯誤的」,產出的全新模型也同樣會是「錯誤的」,為什麼?因為我們清楚數值本身大小有其意義,不能隨意更動它的大小,但LabelEncoder並沒有這種數值大小的意義存在。

 

 

 

LabelEncoder存在的價值,並不在於拿去改善模型,而在於簡化文字,簡化儲存空間,簡化運算過程中所需消耗的硬體資源。例如當我以「縣市」在做運算時,肯定會比「縣市_LE」做運算,來得消耗資源,因為光暫存的字元數,「縣市_LE」的內容就比「縣市」內容來得小很多。

 

所以這才是我們把「非數值的文字內容,給上數值編號」的主要原因,絕對不是為了拿去改善模型精準度……

 

 

 

OneHotEncoder,中文翻譯為「獨熱編碼」,這在做什麼事情?

 

它將「非數值的文字內容,依照不同內容,給上01的判斷」,如下圖舉例,我將非數值的類別(直轄市、縣、市),給上01的判斷:

2_3.png

 

其實這在當年(2005~2011我念大學研所期間),這很直接被稱為dummyget dummies,從來沒聽過什麼OneHotEncoder、獨熱編碼這種說法,更別說LabelEncoder、標籤編碼(……好啦也可能是我翹課翹太多……),因為當年絕對不可能把LabelEncoder完的數值拿來跑模型這真的太荒謬了!

 

dummy卻完全可以拿來跑模型,為什麼,因為它的01是有意義的,且因為只有二位元,縱使0110,也是完全相關,不存在LabelEncoder數值可以亂編的隨機性。

 

所以這裡其實有個很簡單的結論:做OneHotEncoder後去改善模型是有意義的、做LabelEncoder後去改善模型是沒有意義的。

 

 

 

但是!有沒有可能發生這種狀況,OneHotEncoder跑模型出來的分數,比LabelEncoder跑模型出來的分數,還要低?這當然絕對有可能,但這並不代表LabelEncoder跑模型有意義,為什麼呢?

 

因為LabelEncoder縱使是隨機編碼,它仍有可能真的剛好隨機編出了一個很強的關聯編碼,例如非常剛好的,從0~21的縣市編碼,它剛剛好好就是順著人口從多到少(或相反)去編,那這種這麼剛好的編碼,會不會和人口數字有高度相關?當然就會。

 

尤其教材的舉例,我發現它LabelEncoder經常發生在很少內容的文字欄位裡,例如性別,那這就只是產生了剛好和OneHotEncoder一模一樣的效果,因為都是二種內容,但這不代表適合拿LabelEncoder來改善模型(直接用OneHotEncoder就好了啊~)。

 

簡單來說,當LabelEncoder真做出了很高的分數,或看起來有意義,那也只是「湊巧剛好而已」。但OneHotEncoder不是,當OneHotEncoder做出了很高的分數,那表示真的具有意義;反之若分數低,則表示該「文字解釋變數x」不具備對「被解釋變數y」的解釋能力。

 

換句話說,OneHotEncoder無論對於模型的結果如何,都有其意義;LabelEncoder無論對於模型的解釋結果如何,都沒有意義。也因此,拿OneHotEncoder的結果和LabelEncoder的結果相比,這事本身是毫無意義的。

 

退一百萬步來看,我們當然還是可以做完LabelEncoder之後,才拿去跑模型,但這個重點在於資源及效能的考量,而不是為了要改善模型,絕對不是;如果LabelEncoder可以產出類似不同分類的模型結果,那做LabelEncoder之前,就也可以產出不同分類的模型結果,只是一個是用「南投縣、嘉義市、嘉義縣、基隆市、」命名去分,一個是用「0,1,2,3…」的命名去分罷了,但二種不同的命名,對於模型是不會有任何改善的。

 

 

 

所以,別再說「LabelEncoder可以拿來改善模型精準度」這種蠢話了,要用LabelEncoder,不如直接用OneHotEncoder就好了。如果OneHotEncoder做出來不具模型改善的效力,那做LabelEncoder也一樣不會有好結果啦,就算真的有好結果,也只是湊巧剛好而已啦。

 

 

 

--------------------------------------------------------------------------------------

如果對「以淺顯易懂的說明方式,解釋困難詞彙」有興趣的話,

小馬我於今年6月出版的:

0 門檻!0 負擔!9 天秒懂大數據 & AI 用語(iT邦幫忙鐵人賽系列書 - 01

裡面有更多「絕對讓人看得懂」的說明喔~

-------------------------------------------------------------------------------------

arrow
arrow
    全站熱搜

    ChaiMa 發表在 痞客邦 留言(0) 人氣()