變數編碼方式

2021-09-30 01:27:42 字數 1284 閱讀 6164

機器學習模型只能處理數字。數值(連續、定量)變數是可以在有限或無限區間內取任何值的變數,它們可以很自然地用數字表示,所以可以在模型中直接使用。原始類別變數通常以字串的形式存在,在傳入模型之前需要變換。

類別編碼的兩個基本方法是獨熱編碼(onehot encoding)和標籤編碼(label encoding)。獨熱編碼可以通過pandas.get_dummies完成。具備k個類別的變數的編碼結果是乙個k列的二值矩陣,其中第i列的值為1意味著這項觀測屬於第i類。

標籤編碼直接將類別轉換為數字。pandas.factorize提供了這一功能,或者,pandas中category型別的列提供了cat.codes。使用標籤編碼能夠保持原本的維度。

還有一些不那麼標準的編碼方法也值得一試,它們可能可以提公升模型的表現。這裡將介紹三種方法:

頻數編碼(count encoding)

labelcount編碼

目標編碼 (target encoding)

頻數編碼

頻數編碼使用頻次替換類別,頻次根據訓練集計算。這個方法對離群值很敏感,所以結果可以歸一化或者轉換一下(例如使用對數變換)。未知類別可以替換為1。儘管可能性不是非常大,有些變數的頻次可能是一樣的,這將導致碰撞——兩個類別編碼為相同的值。沒法說這是否會導致模型退化或者改善,不過原則上我們不希望出現這種情況。

labelcount編碼

labelcount編碼我們下面將描述的方法稱為labelcount編碼,它根據類別在訓練集中的頻次排序類別(公升序或降序)。相比標準的頻次編碼,labelcount具有特定的優勢——對離群值不敏感,也不會對不同的值給出同樣的編碼。

目標編碼

目標編碼最後是最有技巧性的方法——目標編碼。它使用目標變數的均值編碼類別變數。我們為訓練集中的每個分組計算目標變數的統計量(這裡是均值),之後會合併驗證集、測試集以捕捉分組和目標之間的關係。

舉乙個更明確的例子,我們可以在每個subreddit上計算answer_score的均值,這樣,在特定subreddit發帖可以期望得到多少贊,我們可以有個大概的估計。

使用目標變數時,非常重要的一點是不要洩露任何驗證集的資訊。所有基於目標編碼的特徵都應該在訓練集上計算,接著僅僅合併或連線驗證集和測試集。即使驗證集中有目標變數,它不能用於任何編碼計算,否則會給出過於樂觀的驗證誤差估計。

如果使用k折交叉驗證,基於目標的特徵應該在摺內計算。如果僅僅進行單次分割,那麼目標編碼應該在分開訓練集和驗證集之後進行。

此外,我們可以通過平滑避免將特定類別編碼為0. 另一種方法是通過增加隨機雜訊避免可能的過擬合。

處置妥當的情況下,無論是線性模型,還是非線性模型,目標編碼都是最佳的編碼方式。

變數編碼方式

在機器學習問題中,我們通過訓練資料集學習得到的其實就是一組模型的引數,然後通過學習得到的引數確定模型的表示,最後用這個模型再去進行我們後續的 分類等工作。在模型訓練過程中,我們會對訓練資料集進行抽象 抽取大量特徵,這些特徵中有離散型特徵也有連續型特徵。若此時你使用的模型是簡單模型 如lr 那麼通常我...

離散變數的編碼方式

在機器學習問題中,我們通過訓練資料集學習得到的其實就是一組模型的引數,然後通過學習得到的引數確定模型的表示,最後用這個模型再去進行我們後續的 分類等工作。在模型訓練過程中,我們會對訓練資料集進行抽象 抽取大量特徵,這些特徵中有離散型特徵也有連續型特徵。若此時你使用的模型是簡單模型 如lr 那麼通常我...

編碼方式,編碼之問題

編碼方式對於程式的重要不言而喻,若是不能徹底理解編碼方式,則在許多的地方都會困擾著你。對於編碼方式的困擾,在剛學習jsp時出現的亂碼問題到現在一年有餘,一直在模糊狀態,如今,也不知道是不是真的徹底明白,只是有一點小小的收穫,期待以後的徹底理解,在此先記錄一下點點滴滴。從開始的亂碼起。首先是jsp中的...