Python實(shí)現(xiàn)類別變量的獨(dú)熱編碼
在數(shù)據(jù)處理與分析領(lǐng)域,對(duì)數(shù)值型與字符型類別變量加以編碼是不可或缺的預(yù)處理操作;這里介紹兩種不同的方法。
1 OneHotEncoder
首先導(dǎo)入必要的模塊。
import pandas as pd from sklearn.preprocessing import OneHotEncoder
其中,OneHotEncoder
是我們實(shí)現(xiàn)獨(dú)熱編碼的關(guān)鍵模塊。
接下來(lái),導(dǎo)入并顯示數(shù)據(jù)前五行。
test_data_1=pd.read_csv('G:/CropYield/03_DL/00_Data/onehot_test.csv',names=['EVI0610','EVI0626','SoilType'],header=0) test_data_1.head(5)
關(guān)于這里導(dǎo)入數(shù)據(jù)代碼的解釋,大家可以查看多變量?jī)蓛上嗷リP(guān)系聯(lián)合分布圖的Python繪制與Python TensorFlow深度學(xué)習(xí)回歸代碼:DNNRegressor這兩篇文章,這里就不再贅述啦~
數(shù)據(jù)前五行展示如下圖。其中,前兩列'EVI0610'
與'EVI0626'
為數(shù)值型連續(xù)變量,而'SoilType'
為數(shù)值型類別變量。我們要做的,也就是將第三列'SoilType'
進(jìn)行獨(dú)熱編碼。
接下來(lái),進(jìn)行獨(dú)熱編碼的配置。
ohe=OneHotEncoder(handle_unknown='ignore') ohe.fit(test_data_1)
在這里,第一行是對(duì)獨(dú)熱編碼的配置,第二行則是對(duì)我們剛剛導(dǎo)入的數(shù)據(jù)進(jìn)行獨(dú)熱編碼處理。得到一個(gè)獨(dú)熱編碼配置的輸出結(jié)果。
接下來(lái),看看獨(dú)熱編碼處理后,將我們的數(shù)據(jù)分成了哪些類別。
ohe.categories_
得到結(jié)果如下圖。
可以發(fā)現(xiàn),一共有三個(gè)array
,為什么呢?仔細(xì)看可以發(fā)現(xiàn),獨(dú)熱編碼是將我們導(dǎo)入的三列數(shù)據(jù)全部都當(dāng)作類別變量來(lái)處理了。之所以會(huì)這樣,是因?yàn)槲覀冊(cè)谝婚_(kāi)始沒(méi)有表明哪一列是類別變量,需要進(jìn)行獨(dú)熱編碼;而哪一列不是類別變量,從而不需要進(jìn)行獨(dú)熱編碼。
那么,我們?nèi)绾螌?shí)現(xiàn)上述需求,告訴程序我們要對(duì)哪一行進(jìn)行獨(dú)熱編碼呢?在老版本的sklearn
中,我們可以借助categorical_features=[x]
參數(shù)來(lái)實(shí)現(xiàn)這一功能,但是新版本sklearn
取消了這一參數(shù)。那么此時(shí),一方面,我們可以借助ColumnTransformer
來(lái)實(shí)現(xiàn)這一過(guò)程,另一方面,我們可以直接對(duì)需要進(jìn)行轉(zhuǎn)換的列加以處理。后者相對(duì)較為容易理解,因此本文對(duì)后者進(jìn)行講解。
我們將test_data_1
中的'SoilType'
列作為索引,從而僅僅對(duì)該列數(shù)據(jù)加以獨(dú)熱編碼。
ohe_column=pd.DataFrame(ohe.fit_transform(test_data_1[['SoilType']]).toarray()) ohe_column.head(5)
其中,[['SoilType']]
表示僅僅對(duì)這一列進(jìn)行處理。得到結(jié)果如下圖。
可以看到,原來(lái)的'SoilType'
列現(xiàn)在成為了63
列的編碼列,那么這樣的話,說(shuō)明我們?cè)鹊?code>'SoilType'應(yīng)該一共是有63
個(gè)不同的數(shù)值。是不是這個(gè)樣子呢?我們來(lái)檢查一下。
count=pd.DataFrame(test_data_1['SoilType'].value_counts()) print(count)
得到結(jié)果如下。
好的,沒(méi)有問(wèn)題:可以看到此結(jié)果共有63
行,也就是'SoilType'
列原本是有63
個(gè)不同的值的,證明我們的獨(dú)熱編碼沒(méi)有出錯(cuò)。
此時(shí)看一下我們的test_data_1
數(shù)據(jù)目前長(zhǎng)什么樣子。
test_data_1.head(5)
是的,我們僅僅對(duì)'SoilType'
列做了處理,沒(méi)有影響到整個(gè)初始數(shù)據(jù)。那么先將原本的'SoilType'
列剔除掉。
test_data_1=test_data_1.drop(['SoilType'],axis=1) test_data_1.head(5)
再將經(jīng)過(guò)獨(dú)熱編碼處理后的63
列加上。
test_data_1.join(ohe_column)
大功告成!
但是這里還有一個(gè)問(wèn)題,我們經(jīng)過(guò)獨(dú)熱編碼所得的列名稱是以數(shù)字來(lái)命名的,非常不方便。因此,有沒(méi)有什么辦法可以在獨(dú)熱編碼進(jìn)行的同時(shí),自動(dòng)對(duì)新生成的列加以重命名呢?
2 pd.get_dummies
pd.get_dummies
是一個(gè)最好的辦法!其具體用法與上述OneHotEncoder
類似,因此具體過(guò)程就不再贅述啦,大家看代碼就可以明白。
首先還是導(dǎo)入與上述內(nèi)容中一致的初始數(shù)據(jù)。
test_data_2=pd.read_csv('G:/CropYield/03_DL/00_Data/onehot_test.csv',names=['EVI0610','EVI0626','SoilType'],header=0) test_data_2.head(5)
進(jìn)行獨(dú)熱編碼并看看結(jié)果。
test_data_2_ohe=pd.get_dummies(test_data_2,columns=['SoilType']) test_data_2_ohe.head(5)
最終結(jié)果中,列名稱可以說(shuō)是非常醒目,同時(shí),共有65
列數(shù)據(jù),自動(dòng)刪除了原本的'SoilType'
列,實(shí)現(xiàn)了“獨(dú)熱編碼”“新列重命名”與“原始列刪除”,可謂一舉三得,簡(jiǎn)直是太方便啦~
到此這篇關(guān)于Python實(shí)現(xiàn)類別變量的獨(dú)熱編碼的文章就介紹到這了,更多相關(guān)Python獨(dú)熱編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中index()函數(shù)與find()函數(shù)的區(qū)別詳解
這篇文章主要介紹了Python中index()函數(shù)與find()函數(shù)的區(qū)別詳解,Python index()方法檢測(cè)字符串中是否包含子字符串 str ,如果指定beg開(kāi)始和end結(jié)束范圍,則檢查是否包含在指定范圍內(nèi),需要的朋友可以參考下2023-08-08在python3中使用Supervisor的詳細(xì)教程
Supervisor是用Python開(kāi)發(fā)的一個(gè)client/server服務(wù),是Linux/Unix系統(tǒng)下的一個(gè)進(jìn)程管理工具,不支持Windows系統(tǒng),本文給大家介紹在python3中使用Supervisor的方法,感興趣的朋友一起看看吧2022-01-01淺談Python中的可迭代對(duì)象、迭代器、For循環(huán)工作機(jī)制、生成器
這篇文章主要介紹了Python中的可迭代對(duì)象、迭代器、For循環(huán)工作機(jī)制、生成器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03TensorFlow搭建神經(jīng)網(wǎng)絡(luò)最佳實(shí)踐
這篇文章主要為大家詳細(xì)介紹了TensorFlow搭建神經(jīng)網(wǎng)絡(luò)最佳實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03