[英]How to handle categorical data for preprocessing in Machine Learning
這可能是一個基本問題,我有一個分類數據,我想將其輸入到我的機器學習模型中。 我的ML模型僅接受數值數據。 將此分類數據轉換為數值數據的正確方法是什么?
我的樣本DF:
T-size Gender Label
0 L M 1
1 L M 1
2 M F 1
3 S F 0
4 M M 1
5 L M 0
6 S F 1
7 S F 0
8 M M 1
我知道以下代碼將我的分類數據轉換為數值
類型1:
df['T-size'] = df['T-size'].cat.codes
上面的行僅將類別從0轉換為N-1。 它們之間沒有任何關系。
對於此示例,我知道S <M <L。當我想像上面那樣轉換數據時應該怎么做。
類型2:
在這種類型中,M和F之間沒有關系。但是我可以說出M
概率大於F
概率。 即樣品為1 /樣品總數
對於男性
(4/5)
對於女性
(2/4)
WKT,
(4/5)>(2/4)
我應該如何代替這種色譜柱?
我可以針對此問題將M替換為(4/5),將F替換為(2/4)嗎?
處理專欄的正確方法是什么?
幫助我更好地理解這一點。
對於第一個問題,如果類別數量較少,則可以使用字典map
該列。 這樣,您可以設置訂單:
d = {'L':2, 'M':1, 'S':0}
df['T-size'] = df['T-size'].map(d)
輸出:
T-size Gender Label
0 2 M 1
1 2 M 1
2 1 F 1
3 0 F 0
4 1 M 1
5 2 M 0
6 0 F 1
7 0 F 0
8 1 M 1
對於第二個問題,您可以使用相同的方法,但我將保留男性和女性的2個值0
和1
。 如果只需要類別,而不必使用值進行運算,則一個值等於另一個。
編碼分類數據的方法有很多種,其中有些取決於您打算如何處理。 例如,獨熱編碼,這是最容易流行的選擇是一個非常糟糕的選擇 ,如果你打算使用決策樹/隨機森林/ GBM。
關於上面的T恤,您可以給熊貓分類輸入以下命令:
df['T-size'].astype(pd.api.types.CategoricalDtype(['S','M','L'],ordered=True)).
如果您按這樣分類設置了.cat.codes
,則.cat.codes
方法將可以完美地工作。 這也意味着您可以輕松使用scikit-learn的LabelEconder
,它可以完美地適合管道。
關於性別編碼,在使用目標變量( Label
)時需要非常小心。 您不希望在火車測試拆分之前進行這種編碼,否則您將使用對看不見的數據的了解,從而使它不是真正看不見的。 如果您使用交叉驗證,這將變得更加復雜,因為您需要在每次CV迭代中進行編碼(即每折新編碼)。 如果要執行此操作,建議您從skcontribs類別編碼器中檢出TargetEncoder ,但再次確保在sklearn Pipeline
使用它,否則您會弄亂火車測試拆分並將測試集中的信息泄漏到訓練集中。
如果要在size參數中具有層次結構,則可以考慮對其使用線性映射。 這將是:
size_mapping = {"S": 1, "M":2 , "L":3}
#mapping to the DataFrame
df['T-size_num'] = df['T-size'].map(size_mapping)
這使您可以在保留層次結構的同時將輸入視為數字數據
至於性別,您會誤以為分區和程序。 如果已經將重新分區作為輸入,則會在數據中引入偏差。 您必須將“男性”和“女性”視為兩個不同的類別,而不管其現有分區如何。 您應該用兩個不同的數字來映射它,但不要引入比例。
df['Gender_num'] = df['Gender'].map({'M':0 , 'F':1})
要獲得比您的問題更詳細的解釋和更多的特殊性,我建議閱讀這篇有關機器學習中分類數據的文章
對於M / F示例,由於它是二進制文件,因此可能有點過時了-但是如果您一直擔心將類別映射到數字形式,則可以考慮使用一種熱門編碼 。 categories, into binary columns. 它基本上將包含類別的單個列擴展為二進制列。
所以一個數據集:
Gender
M
F
M
M
F
會成為
Gender_M Gender_F
1 0
0 1
1 0
1 0
0 1
這消除了任何事物比另一事物更“積極”的概念-具有超過2個選項的分類數據的絕對必須,其中沒有傳遞A> B> C關系,並且您不想通過強制塗抹結果一個進入您的編碼方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.