官术网_书友最值得收藏!

3.4 分類變量編碼

1. 背景知識

在統計學中,分類變量是指具有有限的、通常是固定數量值的變量,其變量值是定性的,表現為互不相容的類別或屬性。若按每個分類變量值分組,則每個被觀察的數據點或記錄屬于某一特定組。在計算機科學和一些數學分支中,分類變量被稱為枚舉類型。有時將分類變量的每一個可能值稱為級別,與隨機分類變量相關的概率分布稱為分類分布。

回歸分析時需要特別注意分類變量。與雙值或連續變量不同,分類變量不能直接代入回歸方程。例如,假設有一個名為race的變量,其編碼為1=Hispanic、2=Asian、3=Black、4=White,那么在回歸中直接代入race變量的數字值,將會得出線性效果,但這并不是分類本來的意義。因此,像這樣的分類變量需要被編碼成一系列指示變量,然后就可以將指示值輸入到回歸模型中。從數據庫的角度來看,所謂分類變量編碼,簡單說就是為分類列的每個值創建一個新的分類編碼列,然后將數據的類別指示值(通常就是0或1)賦給各個分類編碼列。有多種編碼系統用于分類編碼,常見的包括one-hot、dummy、effects、orthogonal和Helmert等。MADlib當前支持one-hot和dummy編碼技術。

?當需要用一組特定的預測變量與其他預測變量組做比較時,通常使用啞編碼(dummy coding),與之比較的變量組稱為參照組。

?one-hot編碼與啞編碼類似,兩者的區別是前者為每種分類值建立數字類型的0/1指示列。在每行數據中(對應一個數據點)只有一個分類編碼列的值可以為1。one-hot編碼中沒有參考類別。

2. 函數語法

3. 參數說明

encode_categorical_variables函數的參數說明如表3-6所示。

表3-6 encode_categorical_variables函數參數說明

(續表)

(續表)

4. 示例

(1)使用鮑魚數據集的子集。

鮑魚數據集(Abalone Dataset,參見https://archive.ics.uci.edu/ml/datasets/Abalone)是一個機器學習應用標準數據集,涉及根據鮑魚個體的測量數據來預測鮑魚的年齡(環的數量)。這是一個多分類(multi-class classification)問題,但也可以抽象為回歸問題。該數據集有4177個觀察值、8個輸入變量和1個輸出變量,每個類的觀察值數量不均等。變量名包括性別(M, F, I)、長度、直徑、高度、總重量、剝殼重量、內臟重量、殼重、環的數量。

drop table if exists abalone;
create table abalone (
    id serial,
    sex character varying,
    length double precision,
    diameter double precision,
    height double precision,
    rings int
);
insert into abalone (sex, length, diameter, height, rings) values
('m',    0.455,  0.365,  0.095,  15), ('m',    0.35,   0.265,  0.09,   7),
('f',    0.53,   0.42,   0.135,  9), ('m',    0.44,   0.365,  0.125,  10),
('i',    0.33,   0.255,  0.08,   7), ('i',    0.425,  0.3,    0.095,  8),
('f',    0.53,   0.415,  0.15,   20), ('f',    0.545,  0.425,  0.125,  16),
('m',  0.475,  0.37,   0.125,  9), (null,  0.55,   0.44,   0.15,   19),
('f',  0.525,  0.38,   0.14,   14), ('m',   0.43,   0.35,   0.11,   10),
('m',  0.49,   0.38,   0.135,  11), ('f',   0.535,  0.405,  0.145,  10),
('f',  0.47,   0.355,  0.1,    10), ('m',   0.5,    0.4,    0.13,   12),
('i',  0.355,  0.28,   0.085,  7), ('f',   0.44,   0.34,   0.1,    10),
('m',  0.365,  0.295,  0.08,   7), (null,  0.45,   0.32,   0.1,    9);

(2)使用one-hot編碼創建新表,通過對‘sex’列編碼,替換‘f’‘m’和‘i’三個值,默認不對NULL編碼。

結果:

(3)包含NULL值的one-hot編碼,注意新增的‘sex_NULL’列。

結果:

(4)對源表中的所有列編碼,并且指定‘id’列作為主鍵列,使得輸出表中只包含主鍵和分類編碼列。

結果:

源表有id、sex、length、diameter、height、rings六列,由于指定了id列為索引列,因此id列不被編碼;length、diameter、height這三列是double precision類型,而編碼只針對布爾、整數和文本數據類型,因此這三列也不被編碼,對剩下的sex列的3個值、rings列的11個值進行編碼,結果表共有包含id在內的15列。

(5)只對top n的分類值編碼,把其他值分組到另一個雜項列中。top值或針對所有編碼列,或按列指定。作為后者的一個例子,這里對‘sex’的值指定top 2、對‘rings’的值指定top 50%。

結果:

可以看到,結果表中對sex列的‘m’和‘f’兩個值創建了編碼列,其他值創建了一個雜項編碼列;同樣對rings列的10、7、9三個值創建了編碼列,其他值創建了一個雜項編碼列。

下面驗證一下占前兩位的sex值是‘m’和‘f’:

再驗證一下rings取值占總記錄數50%的值為10、7、9:

(6)如果希望在輸出結果表里同時看到原始分類及其編碼,可以在index參數中包含分類變量列。正如前面所講,如果‘categorical_cols’參數值為‘*’,那么這種方法不可行,因為此情況下‘row_id’參數中指定的列根本就不會被編碼。

結果:

(7)對于啞編碼方式,我們將‘sex’中的‘i’值作為參考值,這里使用了‘value_to_drop’參數。

結果:

結果表中只有三列,分別是id列和sex值為‘m’‘f’的兩個編碼列。id為5、6、17的三行,編碼的兩列值都是0,因為這三行的sex值為‘i’,id為10、20的兩行編碼的兩列值也都是0,因為這兩行的sex值為空。

(8)為源表中的兩個分類變量創建輸出數組。

結果:

對比(4)的結果,這里用(4)的結果列構成了結果數組,注意結果數組元素的排列順序,先按分類列的出現順序sex、rings排序,再按sex、rings兩列分類值的升序順序。

查看帶有數組元素索引的字典表。

(9)創建輸出字典表。

結果:

查看字典表,該表定義輸出表中的數字編碼列。

(10)選擇數據分布策略,例如隨機分布。

查看輸出表的數據分布策略。

(11)如果需要對FLOAT數據類型的變量進行編碼,可以在函數調用中按以下方式進行顯式數據類型轉換。

結果:

主站蜘蛛池模板: 南京市| 芜湖县| 镇安县| 泽库县| 鄢陵县| 土默特右旗| 黎平县| 鸡东县| 乐昌市| 慈利县| 芦山县| 麻栗坡县| 彰化县| 平遥县| 苍南县| 永新县| 岳阳市| 和平县| 新密市| 远安县| 新化县| 洛阳市| 藁城市| 房山区| 东莞市| 游戏| 通榆县| 普洱| 金塔县| 鞍山市| 衡阳县| 武宣县| 乐山市| 勃利县| 健康| 永善县| 红河县| 清水河县| 囊谦县| 五台县| 阳山县|