高级特征工程

均值编码(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
 
 
 
 
 
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章