特征工程 - 你不知道的特征筛选

不管是在机器学习,还是深度学习场景中,特征决定了模型效果的天花板。在互联网公司中,总会有那么些团队专门去做用户画像,他们提取用户落下的日志,转化成能够精准描述用户的特征,这部分特征可以自己组内提出,也可以是算法组提出,将用户用一连串的特征去表示,来达到某种特定模型上线最好的效果。

做特征,需要紧紧围绕目标去做特征,而不是为了做特征而做特征,不合适的特征后续的存储、维护问题很多,以信息流推荐场景为例,目标是希望推给用户的内容都是用户喜欢的。我们可以通过用户对推荐的某篇文章或视频的点击、点赞、评论、转发、收藏、浏览播放时长等数据来综合衡量用户对该文章或视频的喜欢程度;可以通过用户打开APP的次数、用户返回APP的时间间隔、用户一次停留时长等来衡量用户对APP的满意程度。

知道了目标,确定了衡量目标的标准,我们围绕这些标准来做特征。这部分特征包括:用户画像,用户的历史行为、用户所处的环境、文章的内容和属性等因素相关。

上线的模型并不是用了所有特征,针对不同的场景,会增加特定特征。例如,序列化推荐会添加用户历史交互信息特征 hist_item, 时序预测项目中,添加了过去m天的滑窗特征增加对未来N天的预测效果等。
 
 

在获得了诸多的特征后,如何进行特征筛选,或者类别特征和连续特征如何进行处理?

1 特征筛选方法

按照传统统计学上面的回答:

  • 基于统计量筛选:选择方差大的特征、皮尔逊相关系数(与target相关系数高,数据正态且连续)、覆盖率、假设检验。

假设检验;假设特征变量和目标变量之间相互独立,选择适当检验方法计算统计量,然后根据统计量做出统计推断。例如,对于特征变量为类别变量而目标变量为连续数值变量的情况,可以使用方差分析,对于特征变量和目标变量都为连续数值变量的情况,可以使用皮尔森卡方检验。卡方统计量取值越大,特征相关性越高。(方差分析所要研究的是分类自变量对数值因变量的影响。卡方检验分析两个变量间的关系:是否相互独立,是否来自一个总体。)

  • 基于模型选择:
    1. 基于模型参数;LR 系数
    2. 树模型;最开始分裂特征,重要的特征更有可能出现在树生成早期的节点,作为分裂节点的次数也越多。
    3. L1正则;L1可以得到稀疏解,也就是可以对特真进行降维
  • AutoML:
    1. AutoML 在推荐系统中的应用

这里再解释几种特征筛选的方法:
(1) 对于类别特征 计算单特征的 AUC

意思就是说,将所有离散特征与target离散label,计算单值特征的AUC;再进行特征重要性排序,取出单值特征AUC较高的特征。

REF: AUC 理解与应用

单特征的AUC和 训练集与验证集划分划分有关,因为拿的是训练集中特征值的占比作为预测值,划分大小不一样,映射到验证集上也不一样吧。那这样是给了数据集了 就可以手算出来了。

(2) 树模型
XGBoost, lightGBM树模型都可以用来特征筛选;运用 plot_importance() 可以得到所有特征的 score, 然后进行排序。

 
 


ps:2. 类别特征和连续特征处理方法(sparse feature, dense feature).

(1)sparse feature
离散特征是非常常见的一类特征,如性别、标签等等。

  • one-hot
  • 散列编码 (类似于 mutil-hot)
    https://www.jianshu.com/p/9c40b8dc60bf
  • 离散特征之间交叉 (男-北京,男-上海)
  • 离散特征与连续特征交叉
    将离散特征a对连续特征进行groupby,取连续特征的sum, mean, max, min;然后 to 到 离散特征后面。

(2)dense feature

  • 离散化
    分桶(等距,等频,模型分桶(聚类K类))
  • 特征交叉
    这里通过 z=f(x,y)的形式。
  • 滑窗特征
    一般用在时序数据上,通过统计过去N天同连续特征值下的mean, max, min等。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
特征筛选是指从给定的特征集合中选择最具有代表性和相关性的特征,以提高机器学习模型的性能和效果。在Python中,可以使用 scikit-learn 库中的 feature_selection 模块进行特征筛选。 参考引用中的代码,通过使用 SelectPercentile 类从给定的特征集合中选择特定百分比的特征来进行特征筛选。具体步骤如下: 1. 导入所需的库和模块:首先,导入需要的库,如 numpy 和 sklearn 中的 feature_selection 和 cross_val_score。同时,确保已经导入了相关的数据集和模型。 2. 定义特征筛选的百分比范围:使用 range 函数定义特征筛选的百分比范围,例如 range(1, 100, 2)表示从1%到99%,步长为2%。 3. 进行特征筛选:使用 SelectPercentile 类和 chi2 方法创建一个特征筛选器(fs),并将其应用于训练数据集(X_train)。可以根据具体需求选择不同的特征选择方法和百分比。 4. 进行交叉验证:使用 cross_val_score 函数在特征筛选后的数据集上进行交叉验证,并计算模型的得分。可以根据具体需求选择交叉验证的次数和评分指标。 5. 收集结果:将每个百分比对应的得分保存在一个数组(results)中。 6. 找到最佳特征筛选百分比:通过找到得分最高的特征筛选百分比,确定最佳的特征筛选比例。 7. 输出最佳特征筛选百分比:输出得分最高的特征筛选百分比,以及对应的最佳特征筛选个数。 下面是一个示例代码,展示了如何在 Python 中进行特征筛选: ```python from sklearn import feature_selection from sklearn.model_selection import cross_val_score import numpy as np # 定义特征筛选的百分比范围 percentiles = range(1, 100, 2) # 存储结果的数组 results = [] # 特征筛选和交叉验证 for i in percentiles: fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=i) X_train_fs = fs.fit_transform(X_train, y_train) scores = cross_val_score(dt, X_train_fs, y_train, cv=5) results = np.append(results, scores.mean()) # 找到最佳特征筛选百分比 opt = np.where(results == results.max())[0] # 输出最佳特征筛选百分比 print('Optimal number of features: %d' % percentiles[int(opt)]) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值