1. 程式人生 > 其它 >資料特徵的編碼方式

資料特徵的編碼方式

資料的探索型分析

資料的特徵探索

資料探索性分析需要從兩種方面來看:

欄位vs標籤

欄位vs欄位

資料分佈分析

有可能因為訓練集和驗證集分佈不一樣,比如出現本地和線上得分變換趨勢相反的情況。

可以構造一個分類器區分訓練集和驗證集,如果無法分辨樣本(AUC接近0.5)說明資料分佈一致,否則,說明訓練集和測試集分佈不太一致。

特徵工程基礎——特徵型別及處理方法

類別特徵

在任何時候都要進行處理

高基數(類別多)會帶來離散資料

很難進行缺失值填充

分成有序和無序的

處理過程

獨熱編碼

優點:簡單,能將類別特徵進行有效編碼

缺點:會帶來維度爆炸和特徵稀疏

標籤編碼

優點:簡單,不新增類別的維度

缺點:會改變原始標籤的次序關係

適合在樹模型中使用。數模型中labelEncoder甚至優於獨熱編碼

方法:pandas中的facotrize或sklearn上的LABELENCODER

順序編碼

按照類別大小關係進行編碼

優點:簡單,不增加類別的維度

缺點:需要人工知識且

df[feature].map({對映的字典})必須覆蓋所有種類,但是這個方法需要覆蓋所有類別

頻率編碼

將出現或次數頻率作為編碼

Mean/Target編碼

將類別給出的標籤概率作為編碼,此時最後一列的含義是以該國家分類下target的平均值

數值特徵處理方法

數值特徵時最常見的連續特徵,容易出現異常值和離群點

Round

形式:將數值進行縮放、取整,可以保留大部分資訊

Binning將數值進行分箱

就和分段函式一樣

特徵過程程式碼處理速查

構造實驗資料集如下所示:

df = pd.DataFrame({
    'student_id': [1,2,3,4,5,6,7],
    'country': ['China', 'USA', 'UK', 'Japan', 'Korea', 'China', 'USA'],
    'education': ['Master', 'Bachelor', 'Bachelor', 'Master', 'PHD', 'PHD', 'Bachelor'],
    'target': [1, 0, 1, 0, 1, 0, 1]
})

下面給出其特徵編碼方式,作為程式碼參考:

Onehot_code

首先我們對教育編碼

pd.get_dummies(df, columns=['education'])

建議使用pandas庫,因為操作很簡單

還可以用sklearn中的OneHotEncoder方法,操作較為複雜

這裡最後將得出的獨熱特徵寫入df

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
labels = []
for i in range(len(df['country'].unique())):
    label = 'country_'+str(i)
    labels.append(label)
df[labels] = ohe.fit_transform(df[['country']]).toarray()

LabelEncoder

進行型別編碼,可以使用LabelEncoder庫

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['country_LabelEncoder'] = le.fit_transform(df['country'])
df.head(10)

還可以使用pandas中自帶的方法

df['country_LabelEncoder'] = pd.factorize(df['country'])[0]
df.head(10)

其中,pd.factorize方法得出一個這樣的結果

[0]為編碼號,[1]為編碼對應的型別

Ordinal Encoding

這裡必須序號和所有出現的評級相對應,不然會報錯

df['education'] = df['education'].map(
                    {'Bachelor': 1, 
                    'Master': 2, 
                    'PHD': 3})
df.head(10)

二進位制編碼

import category_encoders as ce
encoder = ce.BinaryEncoder(cols= ['country'])

pd.concat([df, encoder.fit_transform(df['country']).iloc[:, 1:]], axis=1)

Frequency Encoding、Count Encoding

注意這裡.map函式的使用

這裡是把標籤出現的頻率作為特徵進行編碼

df['country_count'] = df['country'].map(df['country'].value_counts()) / len(df)
df.head(10)
df['country_count'] = df['country'].map(df['country'].value_counts())
df.head(10)

Mean/Target Encoding

這裡是將標籤的平均值作為編碼(注意,這種方法會將標籤資訊洩露)

df['country_target'] = df['country'].map(df.groupby(['country'])['target'].mean())
df.head(10)
很喜歡聽到一個老師說的“半年理論”,現在做出的努力,一般要在半年的沉澱之後,才能出結果,所以在遇到瓶頸之時,不妨再努力半年