【精通特征工程】學(xué)習(xí)筆記Day4&2.22&D5章&P65-81頁(yè)
5傀蚌、分類變量:自動(dòng)化時(shí)代的數(shù)據(jù)計(jì)數(shù)
- 分類變量是用來(lái)表示類別或標(biāo)記的勋桶,又稱為無(wú)序變量
- 大型分類變量脱衙,分箱計(jì)數(shù)
5.1 分類變量的編碼
分類變量中的類別通常不是數(shù)值型的。例如哥遮,眼睛的顏色可以是“黑色”“藍(lán)色”和“褐 色”岂丘,等等。因此眠饮,需要一種編碼方法來(lái)將非數(shù)值型的類別轉(zhuǎn)換為數(shù)值奥帘。如果簡(jiǎn)單地為 k 個(gè)可能類別中的每個(gè)類別分配一個(gè)整數(shù),如從 1 到 k仪召,但這樣做的結(jié)果是 使類別彼此之間有了順序寨蹋,這在分類變量中是不允許的。
-
三個(gè)不同城市的公寓價(jià)格數(shù)據(jù)集
5.1.1 one-hot 編碼
使用一組比特位扔茅,每個(gè)比特位表示一種可能的類別已旧。如果變量不能同時(shí)屬于 多個(gè)類別,那么這組值中就只有一個(gè)比特位是“開(kāi)”的召娜。這就是 one-hot 編碼运褪,它可以通 過(guò)scikit-learn
中 的 sklearn.preprocessing.OneHotEncoder
實(shí) 現(xiàn)。 每 個(gè) 比 特 位 表 示 一 個(gè) 特 征玖瘸,因此秸讹,一個(gè)可能有 k 個(gè)類別的分類變量就可以編碼為一個(gè)長(zhǎng)度為 k 的特征向量。
-
對(duì)3個(gè)城市的類別進(jìn)行獨(dú)熱編碼
5.1.2 虛擬編碼
one-hot 編碼的問(wèn)題是它允許有 k 個(gè)自由度雅倒,而變量本身只需要 k-1 個(gè)自由度璃诀。虛擬編碼在進(jìn)行表示時(shí)只使用 k-1 個(gè)特征,除去了額外的自由度蔑匣。沒(méi)有被使用的那個(gè)特征通過(guò)一個(gè)全零向量來(lái)表示劣欢,它稱為參照類。虛擬編碼和 one-hot 編碼都可以通過(guò) Pandas 包中的pandas.get_dummies
來(lái)實(shí)現(xiàn)裁良。
-
對(duì)3個(gè)城市的類別進(jìn)行dummy編碼
eg:在獨(dú)熱編碼上的線性回歸
>>> import pandas
>>> from sklearn import linear_model
# 定義一個(gè)模擬數(shù)據(jù)集凿将,表示紐約、舊金山和西雅圖的公寓租金
>>> df = pd.DataFrame({'City': ['SF', 'SF', 'SF', 'NYC', 'NYC', 'NYC','Seattle', 'Seattle', 'Seattle'],
'Rent': [3999, 4000, 4001, 3499, 3500, 3501, 2499, 2500, 2501]})
>>> df['Rent'].mean()
3333.3333333333335
# 將數(shù)據(jù)框中的分類變量轉(zhuǎn)換為one-hot編碼并擬合一個(gè)線性回歸模型
>>> one_hot_df = pd.get_dummies(df, prefix=['city'])
>>> one_hot_df
Rent city_NYC city_SF city_Seattle
0 3999 0 1 0
1 4000 0 1 0
2 4001 0 1 0
3 3499 1 0 0
4 3500 1 0 0
5 3501 1 0 0
6 2499 0 0 1
7 2500 0 0 1
8 2501 0 0 1
model = linear_model.LinearRegression()
model.fit(one_hot_df[['city_NYC', 'city_SF', 'city_Seattle']],
one_hot_df[['Rent']])
>>> model.coef_
array([[ 166.66666667, 666.66666667, -833.33333333]])
>>> model.intercept_
array([ 3333.33333333])
- eg:在虛擬變量上進(jìn)行線性回歸
dummy_df = pd.get_dummies(df, prefix=['city'], drop_first=True)
>>> dummy_df
Rent city_SF city_Seattle
0 3999 1 0
1 4000 1 0
2 4001 1 0
3 3499 0 0
4 3500 0 0
5 3501 0 0
6 2499 0 1
7 2500 0 1
8 2501 0 1
>>> model.fit(dummy_df[['city_SF', 'city_Seattle']], dummy_df['Rent'])
>>> model.coef_
array([ 500., -1000.])
>>> model.intercept_
3500.0
使用 one-hot 編碼時(shí)价脾,截距項(xiàng)表示目標(biāo)變量 Rent 的整體均值牧抵,每個(gè)線性系數(shù)表示相應(yīng)城市的租金均值與整體均值有多大差別。
使用虛擬編碼時(shí)彼棍,偏差系數(shù)表示響應(yīng)變量 y 對(duì)于參照類的均值灭忠,本例中參照類是紐約。第 i個(gè)特征的系數(shù)等于第 i 個(gè)類別的均值與參照類均值的差座硕。
-
線性回歸系數(shù)差距
5.1.3 效果編碼
分類變量編碼的另一種變體稱為Effect編碼弛作。 Effect編碼與虛擬編碼非常相似,區(qū)別在于參考類別現(xiàn)在由所有-1的向量表示华匾。
-
Effect編碼表示3個(gè)城市
Effect編碼與虛擬編碼非常相似映琳,但是在線性回歸中更容易被擬合。截距項(xiàng)表示目標(biāo)變量的整體均值蜘拉,各個(gè)系數(shù)表示了各個(gè)類別的均值與整體均值之間的差萨西。one-hot 編碼實(shí)際上也可以得到同樣的截距和系數(shù),但它的每個(gè)城市都有一個(gè)線性系數(shù)旭旭。在 效果編碼中谎脯,沒(méi)有單獨(dú)的特征來(lái)表示參照類,所以參照類的效果需要單獨(dú)計(jì)算持寄,它是所有其他類別的系數(shù)的相反數(shù)之和源梭。
- 使用效果編碼的線性回歸
>>> effect_df = dummy_df.copy()
>>> effect_df.ix[3:5, ['city_SF', 'city_Seattle']] = -1.0
>>> effect_df
Rent city_SF city_Seattle
0 3999 1.0 0.0
1 4000 1.0 0.0
2 4001 1.0 0.0
3 3499 -1.0 -1.0
4 3500 -1.0 -1.0
5 3501 -1.0 -1.0
6 2499 0.0 1.0
7 2500 0.0 1.0
8 2501 0.0 1.0
>>> model.fit(effect_df[['city_SF', 'city_Seattle']], effect_df['Rent'])
>>> model.coef_
array([ 666.66666667, -833.33333333])
>>> model.intercept_
3333.3333333333335
5.1.4 各種分類變量編碼的優(yōu)缺點(diǎn)
one-hot 編碼、虛擬編碼和效果編碼彼此之間非常相似稍味,它們都有各自的優(yōu)缺點(diǎn)废麻。one-hot 編碼有冗余,這會(huì)使得同一個(gè)問(wèn)題有多個(gè)有效模型模庐,這種非唯一性有時(shí)候比較難以解釋烛愧。 它的優(yōu)點(diǎn)是每個(gè)特征都明確對(duì)應(yīng)一個(gè)類別,而且可以把缺失數(shù)據(jù)編碼為全零向量掂碱,模型輸 出也是目標(biāo)變量的總體均值怜姿。
虛擬編碼和效果編碼沒(méi)有冗余,它們可以生成唯一的可解釋的模型顶吮。虛擬編碼的缺點(diǎn)是不 太容易處理缺失數(shù)據(jù)社牲,因?yàn)槿阆蛄恳呀?jīng)映射為參照類了。它還會(huì)將每個(gè)類別的效果表示 為與參照類的相對(duì)值悴了,這看上去有點(diǎn)不直觀搏恤。
效果編碼使用另外一種編碼表示參照類,從而避免了這個(gè)問(wèn)題湃交,但是全由 -1 組成的向量 是個(gè)密集向量熟空,計(jì)算和存儲(chǔ)的成本都比較高。正是因?yàn)檫@個(gè)原因搞莺,像 Pandas 和 scikit-learn 這樣的常用機(jī)器學(xué)習(xí)軟件包更喜歡使用虛擬編碼或 one-hot 編碼息罗,而不是效果編碼。
當(dāng)類別的數(shù)量變得非常大時(shí)才沧,這 3 種編碼方式都會(huì)出現(xiàn)問(wèn)題迈喉,所以需要另外的策略來(lái)處理 超大型分類變量绍刮。
5.2 處理大型分類變量
5.2.1 特征散列化
- demo : 使用
scikit-learn
的FeatureHasher
函數(shù)
>>> from sklearn.feature_extraction import FeatureHasher
>>> h = FeatureHasher(n_features=m, input_type='string')
>>> f = h.transform(review_df['business_id'])
5.2.2 分箱計(jì)數(shù)
分箱計(jì)數(shù)它不使用分類變量的值作為特征,而是使用目標(biāo)變量取這 個(gè)值的條件概率挨摸。換句話說(shuō)孩革,我們不對(duì)分類變量的值進(jìn)行編碼,而是要計(jì)算分類變量值與 要預(yù)測(cè)的目標(biāo)變量之間的相關(guān)統(tǒng)計(jì)量得运。
小結(jié)
one-hot encoding
空間使用:O(n) 時(shí)間復(fù)雜度:O(nk)
優(yōu)點(diǎn):
- 容易實(shí)現(xiàn)
- 更高的精度
- 在線學(xué)習(xí)特別容易擴(kuò)展
缺點(diǎn)
- 計(jì)算不足
- 如果類別增加則不能夠使用
- 對(duì)線性模型以外的任何其他方法都不可行
- 對(duì)于大數(shù)據(jù)集需要分布式訓(xùn)練
特征散列化 Feature hashing
空間使用:O(n) 時(shí)間復(fù)雜度:O(nm)
優(yōu)點(diǎn):
- 容易實(shí)現(xiàn)
- 容易訓(xùn)練
- 容易擴(kuò)展到新類別
- 容易處理稀有類別
- 在線學(xué)習(xí)容易擴(kuò)展
缺點(diǎn)
- 只能夠使用線性或核模型
- 哈希編碼很難解釋
- 精度有爭(zhēng)議
分箱計(jì)數(shù) Bin-counting
空間使用:O(n+k) 時(shí)間復(fù)雜度:O(n)
優(yōu)點(diǎn):
- 訓(xùn)練快
- 能夠使用樹(shù)模型
- 容易擴(kuò)展到新列類別
- 容易處理稀有類別
- 可解釋
缺點(diǎn)
- 需要利用歷史信息
- 對(duì)于在線學(xué)習(xí)有困難
- 會(huì)有數(shù)據(jù)泄露
參考:《精通特征工程》愛(ài)麗絲·鄭·阿曼達(dá)·卡薩麗
面向機(jī)器學(xué)習(xí)的特征工程學(xué)習(xí)筆記:
【精通特征工程】學(xué)習(xí)筆記(一)
【精通特征工程】學(xué)習(xí)筆記(二)
【精通特征工程】學(xué)習(xí)筆記(三)