三、數據預處理——處理分類型數據:編碼與啞變量

三、處理分類型特徵:編碼與啞變量

點擊標題即可獲取文章相關的源代碼文件喲!

在機器學習中,大多數算法,譬如邏輯迴歸,支持向量機SVM,k近鄰算法等都只能夠處理數值型數據,不能處理文字,在sklearn當中,除了專用來處理文字的算法,其他算法在fit的時候全部要求輸入數組或矩陣,也不能夠導入文字型數據(其實手寫決策樹和普斯貝葉斯可以處理文字,但是sklearn中規定必須導入數值型)。

然而在現實中,許多標籤和特徵在數據收集完畢的時候,都不是以數字來表現的。比如說,學歷的取值可以是[“小 學”,“初中”,“高中”,“大學”],付費方式可能包含[“支付寶”,“現金”,“微信”]等等。在這種情況下,爲了讓數據適應算法和庫,我們必須將數據進行編碼,即是說,將文字型數據轉換爲數值型。

  • preprocessing.LabelEncoder:標籤專用,能夠將分類轉換爲分類數值
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • preprocessing.OrdinalEncoder:特徵專用,能夠將分類特徵轉換爲分類數值
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • preprocessing.OneHotEncoder:獨熱編碼,創建啞變量

我們剛纔已經用OrdinalEncoder把分類變量Sex和Embarked都轉換成數字對應的類別了。在艙門Embarked這一列中,我們使用[0,1,2]代表了三個不同的艙門,然而這種轉換是正確的嗎?

我們來思考三種不同性質的分類數據:
1) 艙門(S,C,Q)
三種取值S,C,Q是相互獨立的,彼此之間完全沒有聯繫,表達的是S≠C≠Q的概念。這是名義變量
2) 學歷(小學,初中,高中)
三種取值不是完全獨立的,我們可以明顯看出,在性質上可以有高中>初中>小學這樣的聯繫,學歷有高低,但是學歷取值之間卻不是可以計算的,我們不能說小學 + 某個取值 = 初中。這是有序變量
3) 體重(>45kg,>90kg,>135kg)
各個取值之間有聯繫,且是可以互相計算的,比如120kg - 45kg = 90kg,分類之間可以通過數學計算互相轉換。這是有距變量

然而在對特徵進行編碼的時候,這三種分類數據都會被我們轉換爲[0,1,2],這三個數字在算法看來,是連續且可以計算的,這三個數字相互不等,有大小,並且有着可以相加相乘的聯繫。所以算法會把艙門,學歷這樣的分類特徵,都誤會成是體重這樣的分類特徵。這是說,我們把分類轉換成數字的時候,忽略了數字中自帶的數學性質,所以給算法傳達了一些不準確的信息,而這會影響我們的建模。
類別OrdinalEncoder可以用來處理有序變量,但對於名義變量,我們只有使用啞變量的方式來處理,才能夠儘量向算法傳達最準確的信息:
在這裏插入圖片描述
這樣的變化,讓算法能夠徹底領悟,原來三個取值是沒有可計算性質的,是“有你就沒有我”的不等概念。在我們的數據中,性別和艙門,都是這樣的名義變量。因此我們需要使用獨熱編碼,將兩個特徵都轉換爲啞變量。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

特徵可以做啞變量,標籤也可以嗎?

可以,使用類sklearn.preprocessing.LabelBinarizer可以對做啞變量,許多算法都可以處理多標籤問題(比如說決策樹),但是這樣的做法在現實中不常見,因此我們在這裏就不贅述了。
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章