機器學習sklearn(十三): 特徵工程(三)特徵編碼(一)特徵雜湊(一)
阿新 • • 發佈:2021-06-19
來源:https://www.freesion.com/article/24301262498/
本文介紹的是一種面對高基數類別特徵的普適性方法:特徵雜湊(FeatureHasher)。目前這只是本人的一種想法,具體效果如何還需要在實際專案中驗證。
如果說獨熱編碼後新生成的特徵數量會跟隨類別數量而變化,那麼FeatureHasher的方法所新生成的特徵數量是可以人為給定的。這樣在特徵冗餘或維度爆炸問題上就不必擔心了。個人感覺FeatureHasher有點像word2vec,都是將新特徵壓縮到一個給定的維度。
那麼接下來通過程式碼介紹一下如何使用FeatureHasher。首先要從scikit-learn中匯入:
import numpy as np import pandas as pd import random from sklearn.feature_extraction import FeatureHasher
建立一個數據集,含有年齡與城市兩個特徵,可以看到城市這個特徵的屬性數量有10個。
city = ['北京', '上海', '成都', '深圳', '廣州', '杭州', '天津', '蘇州', '武漢', '西安'] data = pd.DataFrame({'age': np.random.randint(0, 70, size=500),'city': random.choices(city, k=500)}) data.head()
data.city.value_counts()
如果用獨熱編碼來處理的話會產生10個新特徵。那麼如果類別屬性有上百種,並且分佈比較平均那麼直接用獨熱編碼就會造成特徵冗餘或維度爆炸的問題。
dummy_data = pd.get_dummies(data, prefix='city') dummy_data.head()
嘗試FeatureHasher的方法,指定新生成的維度為2:
fea_hs = FeatureHasher(n_features=2, input_type='string') hasherd = fea_hs.fit_transform(data.city) print(hasherd.toarray().shape)
hash_data = pd.DataFrame(hasherd.toarray(), columns=[f'city_{i}' for i in range(2)]) hasher_data = pd.concat([data, hash_data], axis=1, ignore_index=False) hasher_data.head(10)
這樣就將原本基數很大的特徵對映到了較低的維度中。