1. 程式人生 > >BEYOND ONE-HOT: AN EXPLORATION OF CATEGORICAL VARIABLES

BEYOND ONE-HOT: AN EXPLORATION OF CATEGORICAL VARIABLES

categorical-encoding庫

專案地址:https://github.com/scikit-learn-contrib/categorical-encoding

Star:494

Fork:115

       這個庫擴充套件了很多實現 scikit-learn 資料轉換器介面的分類編碼方法,並實現了常見的分類編碼方法,例如單熱編碼和雜湊編碼,也有更利基的編碼方法,如基本編碼和目標編碼。這個庫對於處理現實世界的分類變數來說很有用,比如那些具有高基數的變數。這個庫還可以直接與 pandas 一起使用,用於計算缺失值,以及處理訓練集之外的變換值。

encoder = ce.BinaryEncoder(cols=[...])

       在這篇文章中有一個概念出現,那就是維度的概念。簡單來說,它只是資料集中的列數,但它對最終模型具有顯著的下游影響。在極端情況下,“維度詛咒”的概念討論了在高維空間中,有些東西會停止正常工作。即使在相對較低的維度問題中,具有更多維度的資料集也需要更多引數供模型理解,這意味著需要更多樣本(就是更多行)來可靠地學習這些引數。如果資料集中的行數是固定的,則新增額外的維度而不新增更多的資訊(更多的樣本資料)到模型裡,會對最終的模型精度產生不利影響。

        我們希望將分類變數編碼為數字,但我們關注這個維度問題。顯而易見的答案是隻為每個類別分配一個整數(我們假設我們事先了解所有可能的類別)。這稱為序數編碼。它不會為問題新增任何維度,但是這種編碼不會顯示變數之間有序的意義。

這篇文章的作者採用了7種編碼方式對3個常見的資料集進行了測試和評估,結果如下圖:

        可以很清楚的看到,二進位制編碼表現良好,而且維度沒有顯著增加,而序數表現一直很差。

        二進位制編碼概念:首先將類別編碼為序數,然後將這些整數轉換為二進位制程式碼,然後將該二進位制字串中的數字拆分為單獨的列。 這樣可以將資料編碼為較少的維度,但距離會有一些失真。

        python程式碼嘗試: