高級特徵工程

均值編碼(mean ecoding)

1)有監督類型的編碼方式:根據label進行編碼,在類別Moscow中的feature_mean = #(target=1)/#Moscow(注意與frequency encoding編碼的區別)

means = X_tr.groupby(col).target.mean()
train_new[col+'_mean_target'] = train_new[col].map(means)
val_new[col+'_mean_target'] = val_new[col].map(means)

2)均值編碼的效果能夠幫助目標對象分離,而普通的Label Encoding由於屬於無監督編碼,其編碼最後的效果比較隨機。

 
3)均值編碼的正則化技術
策略:
  1. CV loop inside training data(推薦)
  2. Smoothing
  3. Adding random noise
  4. Sorting and calculating expanding mean
 
使用CV技術來進行均值編碼:使用4-5折交叉驗證技術,對每一個fold利用其餘子集的均值進行編碼,而不是使用整個數據集的均值對特徵進行編碼。

代碼實現:
y_tr = df_tr['target'].values
skf = StratifiedKFold(y_tr,5,shuffle=True,random_state=123)
for tr_ind,val_ind in skf:
    X_tr,X_val = df_tr.iloc[tr_ind],d_tr.iloc[val_ind]
    for in cols: ## Iterate through the need to ecode cols
        means = X_val[col].map(X_tr.groupby(col)['target'].mean())
        X_val[col+'_mean_target'] = means
    train_new.iloc[val_ind] = X_val

prior = df_tr['target'].mean()
train_new.fillna(prior,inplace=True)

Smoothing:在原來均值編碼的基礎上添加一項係數α來正則化表達,α需要調參。計算公式如下:

 
Expanding mean 擴展均值
cumsum = df_tr.groupby(col).['target'].cumsum() - df_tr['target']
cumcnt = df_tr.groupby(col).cumcount()
train_new[col+'_mean_target'] = cumsum/cumcnt

還有很多代表性的技術:

 

統計特徵與鄰域特徵

1)groupby:依靠特徵之間的依賴關係生成新的統計特徵,例如下表中,利用User和page之間關係,生成對應的Ad_price和Ad_position的特徵。

 
gb=df.groupby(['User_id','Page_id'],as_index=False).agg(
                {"Ad_price":{'Max_price':np.max,'Min_price':np.min}
                }
             )
gb.columns = ['user_id','page_id','min_price','max_price']
df = pd.merge(df,gb,how='left',on=['User_id','Page_id'])

Noteagg函數的應用,實例如下:

 
2)近鄰特徵:反映區域的特徵
 
 

矩陣分解

不同的特徵羣通過降維進行融合

  • 可以僅僅對樣本集的某些特徵進行降維分解
  • 提供了額外的多樣性
    • 利於模型融合
  • 存在信息的損失,對於某些特定的任務比較有效
    • 降維後的維度一般在5-100
    • 特定任務
 
具體實現:
  • SVD 和PCA
  • TruncatedSVD
    • 針對稀疏矩陣
  • None-negative Matrix Factorization(NMF)
    • 確保所有的元素非負
    • 對計數(count)性質的數據比較好
 
注意:在全數據集上做降維,而不要只在訓練集上
 
 

特徵交互

1)類別變量通過特徵之間的join形成新的特徵,進行one-hot編碼
如果某些特徵之間具有從屬關係,例如國家與省、省與市可以通過join生成新的特徵,總的來說join出來的特徵要具有一定物理意義上的可解釋性。
 
策略1:

 
策略2:

 
2)數值類型變量可以通過兩兩特徵之間的基本數學運算形成新的特徵
        常見的操作:乘、加、減

 
        實戰中,會存在很多種不同特徵之間的交互,因此一方面在進行交互生成特徵中要充分考慮特徵之間的物理含義,二對於生成的特徵可以進行維度約簡的操作(降維),或者根據樹模型的特徵重要性進行特徵選擇。

 
3)從樹模型的葉子節點中提取特徵
        通過每個樣本在樹模型葉子節點的Index進行特徵生成,最後通過Liner Model實現任務要求,具體的實現查看樹模型的幫助文檔一般會提供相應的API接口獲取每個樣本的葉子節點編碼特徵。
 

 
實例:
 

tSNE

 
前面談到的降維技術主要是線性降維,而tSNE屬於非線性降維方法,或者稱爲流形學習
tSNE在EDA分析中經常使用,tSNE對超參數的設置異常敏感,因此在實際應用中要注意以下幾點:
  1. 嘗試不同的hyperparameters
  2. train和test需要放在一起降維
  3. 當矩陣維度過大時,需要事先降維處理,再進行tSNE
 
 
 
 
 
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章