??本文介紹基于Python下OneHotEncoder與pd.get_dummies兩種方法,實作機器學習中最優的編碼方法——獨熱編碼的方法,
- 1 OneHotEncoder
- 2 pd.get_dummies
??在資料處理與分析領域,對數值型與字符型類別變數加以編碼是不可或缺的預處理操作;這里介紹兩種不同的方法,
1 OneHotEncoder
??首先匯入必要的模塊,
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
??其中,OneHotEncoder是我們實作獨熱編碼的關鍵模塊,
??接下來,匯入并顯示資料前五行,
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)
??關于這里匯入資料代碼的解釋,大家可以查看多變數兩兩相互關系聯合分布圖的Python繪制與Python TensorFlow深度學習回歸代碼:DNNRegressor這兩篇文章,這里就不再贅述啦~
??資料前五行展示如下圖,其中,前兩列'EVI0610'與'EVI0626'為數值型連續變數,而'SoilType'為數值型類別變數,我們要做的,也就是將第三列'SoilType'進行獨熱編碼,

??接下來,進行獨熱編碼的配置,
ohe=OneHotEncoder(handle_unknown='ignore')
ohe.fit(test_data_1)
??在這里,第一行是對獨熱編碼的配置,第二行則是對我們剛付訓入的資料進行獨熱編碼處理,得到一個獨熱編碼配置的輸出結果,

??接下來,看看獨熱編碼處理后,將我們的資料分成了哪些類別,
ohe.categories_
??得到結果如下圖,

??可以發現,一共有三個array,為什么呢?仔細看可以發現,獨熱編碼是將我們匯入的三列資料全部都當作類別變數來處理了,之所以會這樣,是因為我們在一開始沒有表明哪一列是類別變數,需要進行獨熱編碼;而哪一列不是類別變數,從而不需要進行獨熱編碼,
??那么,我們如何實作上述需求,告訴程式我們要對哪一行進行獨熱編碼呢?在老版本的sklearn中,我們可以借助categorical_features=[x]引數來實作這一功能,但是新版本sklearn取消了這一引數,那么此時,一方面,我們可以借助ColumnTransformer來實作這一程序,另一方面,我們可以直接對需要進行轉換的列加以處理,后者相對較為容易理解,因此本文對后者進行講解,
??我們將test_data_1中的'SoilType'列作為索引,從而僅僅對該列資料加以獨熱編碼,
ohe_column=pd.DataFrame(ohe.fit_transform(test_data_1[['SoilType']]).toarray())
ohe_column.head(5)
??其中,[['SoilType']]表示僅僅對這一列進行處理,得到結果如下圖,

??可以看到,原來的'SoilType'列現在成為了63列的編碼列,那么這樣的話,說明我們原先的'SoilType'應該一共是有63個不同的數值,是不是這個樣子呢?我們來檢查一下,
count=pd.DataFrame(test_data_1['SoilType'].value_counts())
print(count)
??得到結果如下,

??好的,沒有問題:可以看到此結果共有63行,也就是'SoilType'列原本是有63個不同的值的,證明我們的獨熱編碼沒有出錯,
??此時看一下我們的test_data_1資料目前長什么樣子,
test_data_1.head(5)

??是的,我們僅僅對'SoilType'列做了處理,沒有影響到整個初始資料,那么先將原本的'SoilType'列剔除掉,
test_data_1=test_data_1.drop(['SoilType'],axis=1)
test_data_1.head(5)

??再將經過獨熱編碼處理后的63列加上,
test_data_1.join(ohe_column)

??大功告成!
??但是這里還有一個問題,我們經過獨熱編碼所得的列名稱是以數字來命名的,非常不方便,因此,有沒有什么辦法可以在獨熱編碼進行的同時,自動對新生成的列加以重命名呢?
2 pd.get_dummies
??pd.get_dummies是一個最好的辦法!其具體用法與上述OneHotEncoder類似,因此具體程序就不再贅述啦,大家看代碼就可以明白,
??首先還是匯入與上述內容中一致的初始資料,
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)

??進行獨熱編碼并看看結果,
test_data_2_ohe=pd.get_dummies(test_data_2,columns=['SoilType'])
test_data_2_ohe.head(5)

??最終結果中,列名稱可以說是非常醒目,同時,共有65列資料,自動洗掉了原本的'SoilType'列,實作了“獨熱編碼”“新列重命名”與“原始列洗掉”,可謂一舉三得,簡直是太方便啦~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543973.html
標籤:Python
上一篇:【爬蟲+資料清洗+可視化分析】輿情分析嗶哩嗶哩"狂飆"的評論
下一篇:1.8 習題
