資料特徵的編碼方式
資料的探索型分析
資料的特徵探索
資料探索性分析需要從兩種方面來看:
欄位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)
很喜歡聽到一個老師說的“半年理論”,現在做出的努力,一般要在半年的沉澱之後,才能出結果,所以在遇到瓶頸之時,不妨再努力半年