三、数据预处理——处理分类型数据:编码与哑变量
三、處理分類型特征:編碼與啞變量
點擊標(biāo)題即可獲取文章相關(guān)的源代碼文件喲!
在機器學(xué)習(xí)中,大多數(shù)算法,譬如邏輯回歸,支持向量機SVM,k近鄰算法等都只能夠處理數(shù)值型數(shù)據(jù),不能處理文字,在sklearn當(dāng)中,除了專用來處理文字的算法,其他算法在fit的時候全部要求輸入數(shù)組或矩陣,也不能夠?qū)胛淖中蛿?shù)據(jù)(其實手寫決策樹和普斯貝葉斯可以處理文字,但是sklearn中規(guī)定必須導(dǎo)入數(shù)值型)。
然而在現(xiàn)實中,許多標(biāo)簽和特征在數(shù)據(jù)收集完畢的時候,都不是以數(shù)字來表現(xiàn)的。比如說,學(xué)歷的取值可以是[“小 學(xué)”,“初中”,“高中”,“大學(xué)”],付費方式可能包含[“支付寶”,“現(xiàn)金”,“微信”]等等。在這種情況下,為了讓數(shù)據(jù)適應(yīng)算法和庫,我們必須將數(shù)據(jù)進行編碼,即是說,將文字型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型。
- preprocessing.LabelEncoder:標(biāo)簽專用,能夠?qū)⒎诸愞D(zhuǎn)換為分類數(shù)值
- preprocessing.OrdinalEncoder:特征專用,能夠?qū)⒎诸愄卣鬓D(zhuǎn)換為分類數(shù)值
- preprocessing.OneHotEncoder:獨熱編碼,創(chuàng)建啞變量
我們剛才已經(jīng)用OrdinalEncoder把分類變量Sex和Embarked都轉(zhuǎn)換成數(shù)字對應(yīng)的類別了。在艙門Embarked這一列中,我們使用[0,1,2]代表了三個不同的艙門,然而這種轉(zhuǎn)換是正確的嗎?
我們來思考三種不同性質(zhì)的分類數(shù)據(jù):
1) 艙門(S,C,Q)
三種取值S,C,Q是相互獨立的,彼此之間完全沒有聯(lián)系,表達的是S≠C≠Q(mào)的概念。這是名義變量。
2) 學(xué)歷(小學(xué),初中,高中)
三種取值不是完全獨立的,我們可以明顯看出,在性質(zhì)上可以有高中>初中>小學(xué)這樣的聯(lián)系,學(xué)歷有高低,但是學(xué)歷取值之間卻不是可以計算的,我們不能說小學(xué) + 某個取值 = 初中。這是有序變量。
3) 體重(>45kg,>90kg,>135kg)
各個取值之間有聯(lián)系,且是可以互相計算的,比如120kg - 45kg = 90kg,分類之間可以通過數(shù)學(xué)計算互相轉(zhuǎn)換。這是有距變量。
然而在對特征進行編碼的時候,這三種分類數(shù)據(jù)都會被我們轉(zhuǎn)換為[0,1,2],這三個數(shù)字在算法看來,是連續(xù)且可以計算的,這三個數(shù)字相互不等,有大小,并且有著可以相加相乘的聯(lián)系。所以算法會把艙門,學(xué)歷這樣的分類特征,都誤會成是體重這樣的分類特征。這是說,我們把分類轉(zhuǎn)換成數(shù)字的時候,忽略了數(shù)字中自帶的數(shù)學(xué)性質(zhì),所以給算法傳達了一些不準(zhǔn)確的信息,而這會影響我們的建模。
類別OrdinalEncoder可以用來處理有序變量,但對于名義變量,我們只有使用啞變量的方式來處理,才能夠盡量向算法傳達最準(zhǔn)確的信息:
這樣的變化,讓算法能夠徹底領(lǐng)悟,原來三個取值是沒有可計算性質(zhì)的,是“有你就沒有我”的不等概念。在我們的數(shù)據(jù)中,性別和艙門,都是這樣的名義變量。因此我們需要使用獨熱編碼,將兩個特征都轉(zhuǎn)換為啞變量。
特征可以做啞變量,標(biāo)簽也可以嗎?
可以,使用類sklearn.preprocessing.LabelBinarizer可以對做啞變量,許多算法都可以處理多標(biāo)簽問題(比如說決策樹),但是這樣的做法在現(xiàn)實中不常見,因此我們在這里就不贅述了。
總結(jié)
以上是生活随笔為你收集整理的三、数据预处理——处理分类型数据:编码与哑变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue项目中使用 路由导航守卫 处理页面
- 下一篇: Vite学习笔记