數據的探索型分析
數據的特征探索
數據探索性分析需要從兩種方面來看:
字段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)