數據特征的編碼方式


數據的探索型分析

數據的特征探索

image

數據探索性分析需要從兩種方面來看:

字段vs標簽

字段vs字段

數據分布分析

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

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

特征工程基礎——特征類型及處理方法

類別特征

在任何時候都要進行處理

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

很難進行缺失值填充

分成有序和無序的

處理過程

獨熱編碼

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

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

標簽編碼

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

缺點:會改變原始標簽的次序關系

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

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

順序編碼

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

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

缺點:需要人工知識且

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

頻率編碼

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

image

Mean/Target編碼

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

image

數值特征處理方法

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

Round

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

image

Binning將數值進行分箱

就和分段函數一樣

image

特征過程代碼處理速查

構造實驗數據集如下所示:

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]
})

image

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

Onehot_code

首先我們對教育編碼

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

image

建議使用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)

image

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

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

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

image

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

Ordinal Encoding

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

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

image

二進制編碼

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

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

image

Frequency Encoding、Count Encoding

注意這里.map函數的使用

這里是把標簽出現的頻率作為特征進行編碼

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

image

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

image

Mean/Target Encoding

這里是將標簽的平均值作為編碼(注意,這種方法會將標簽信息泄露)

df['country_target'] = df['country'].map(df.groupby(['country'])['target'].mean())
df.head(10)

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM