Feature Engineering 特征工程 4. Feature Selection

文章目录

    • 1. Univariate Feature Selection 单变量特征选择
    • 2. L1 regularization L1正则

learn from https://www.kaggle.com/learn/feature-engineering

上一篇:Feature Engineering 特征工程 3. Feature Generation


经过各种编码和特征生成后,通常会拥有成百上千个特征。这可能导致两个问题:

  • 首先,拥有的特征越多,就越有可能过拟合
  • 其次,拥有的特征越多,训练模型和优化超参数所需的时间就越长。使用较少的特征可以加快预测速度,但会降低预测准确率

为了解决这些问题,使用特征选择技术来为模型保留最丰富的特征

1. Univariate Feature Selection 单变量特征选择

最简单,最快的方法是基于单变量统计检验

  • 统计label对每个单一特征的依赖程度
  • scikit-learn特征选择模块中,feature_selection.SelectKBest返回 K 个最佳特征
  • 对于分类问题,该模块提供了三种不同的评分功能:χ2\chi^2χ2ANOVA F-valuemutual information score
  • F-value测量特征变量和目标之间的线性相关性。这意味着如果是非线性关系,得分可能会低估特征与目标之间的关系
  • mutual information score是非参数的,可以捕获非线性关系
from sklearn.feature_selection import SelectKBest, f_classiffeature_cols = baseline_data.columns.drop('outcome')# Keep 5 features 保留5个最好的特征
selector = SelectKBest(f_classif, k=5)# 评价函数, 保留特征数量
X_new = selector.fit_transform(baseline_data[feature_cols],baseline_data['outcome'])# 特征, 标签
X_new
array([[2015.,    5.,    9.,   18., 1409.],[2017.,   13.,   22.,   31.,  957.],[2013.,   13.,   22.,   31.,  739.],...,[2010.,   13.,   22.,   31.,  238.],[2016.,   13.,   22.,   31., 1100.],[2011.,   13.,   22.,   31.,  542.]])

但是,上面犯了严重的错误,特征选择时fit,把所有数据用进去了,会造成数据泄露
我们应该只用训练集来进行fit,选择特征

feature_cols = baseline_data.columns.drop('outcome')
train, valid, _ = get_data_splits(baseline_data)# Keep 5 features
selector = SelectKBest(f_classif, k=5)X_new = selector.fit_transform(train[feature_cols], train['outcome'])#  区别,仅用 训练集
X_new
array([[2.015e+03, 5.000e+00, 9.000e+00, 1.800e+01, 1.409e+03],[2.017e+03, 1.300e+01, 2.200e+01, 3.100e+01, 9.570e+02],[2.013e+03, 1.300e+01, 2.200e+01, 3.100e+01, 7.390e+02],...,[2.011e+03, 1.300e+01, 2.200e+01, 3.100e+01, 5.150e+02],[2.015e+03, 1.000e+00, 3.000e+00, 2.000e+00, 1.306e+03],[2.013e+03, 1.300e+01, 2.200e+01, 3.100e+01, 1.084e+03]])
  • 可以看见,两种情况下,选择了不同的特征
  • 现在,我们需要把得到的特征数值,转换回去,并丢弃其他未选择的特征
# Get back the features we've kept, zero out all other features
selected_features = pd.DataFrame(selector.inverse_transform(X_new), index=train.index, columns=feature_cols)
selected_features.head()
goalhourdaymonthyearcategorycurrencycountrycategory_currencycategory_countrycurrency_countrycount_7_daystime_since_last_project
00.00.00.00.02015.00.05.09.00.00.018.01409.00.0
10.00.00.00.02017.00.013.022.00.00.031.0957.00.0
20.00.00.00.02013.00.013.022.00.00.031.0739.00.0
30.00.00.00.02012.00.013.022.00.00.031.0907.00.0
40.00.00.00.02015.00.013.022.00.00.031.01429.00.0
  • 我们发现逆转换回去后,未被选择的特征都是0.0,需要丢弃它们
# Dropped columns have values of all 0s, so var is 0, drop them
# 保留方差不为0的
selected_columns = selected_features.columns[selected_features.var() != 0]# Get the valid dataset with the selected features.
valid[selected_columns].head()
yearcurrencycountrycurrency_countrycount_7_days
30289620151322311534.0
3028972013132231625.0
30289820145918851.0
30289920141322311973.0
302900201459182163.0

2. L1 regularization L1正则

单变量方法在做出选择决定时一次只考虑一个特征

相反,我们可以通过将所有特征包括在具有L1正则化的线性模型中来使用所有特征进行特征筛选

与惩罚系数平方的 L2(Ridge)回归相比,这种类型的正则化(有时称为Lasso)会惩罚系数的绝对大小

随着L1正则化强度的提高,对于预测目标而言次要的特征将设置为0

对于回归问题,可以使用sklearn.linear_model.Lasso
分类问题,可以使用sklearn.linear_model.LogisticRegression
这些都可以跟sklearn.feature_selection.SelectFromModel一起使用,来选择非零系数

from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModeltrain, valid, _ = get_data_splits(baseline_data)X, y = train[train.columns.drop("outcome")], train['outcome']# Set the regularization parameter C=1
logistic = LogisticRegression(C=1, penalty="l1", random_state=7).fit(X, y)
model = SelectFromModel(logistic, prefit=True)X_new = model.transform(X)
X_new
array([[1.000e+03, 1.200e+01, 1.100e+01, ..., 1.900e+03, 1.800e+01,1.409e+03],[3.000e+04, 4.000e+00, 2.000e+00, ..., 1.630e+03, 3.100e+01,9.570e+02],[4.500e+04, 0.000e+00, 1.200e+01, ..., 1.630e+03, 3.100e+01,7.390e+02],...,[2.500e+03, 0.000e+00, 3.000e+00, ..., 1.830e+03, 3.100e+01,5.150e+02],[2.600e+03, 2.100e+01, 2.300e+01, ..., 1.036e+03, 2.000e+00,1.306e+03],[2.000e+04, 1.600e+01, 4.000e+00, ..., 9.200e+02, 3.100e+01,1.084e+03]])

类似于单变量测试,返回具有选定特征的数组。我们要将它们转换为DataFrame,以便获得选定的特征列

# Get back the kept features as a DataFrame with dropped columns as all 0s
selected_features = pd.DataFrame(model.inverse_transform(X_new), index=X.index,columns=X.columns)# Dropped columns have values of all 0s, keep other columns 
selected_columns = selected_features.columns[selected_features.var() != 0]
  • 通常,使用L1正则化进行特征选择比单变量测试更强大
  • 但是在具有大量数据和大量特征的情况下,L1正则化的特征选择速度也会很慢
  • 在大型数据集上,单变量测试将更快,但预测性能可能会更差

完成课程和练习,获得证书一张,继续加油!🚀🚀🚀
在这里插入图片描述


上一篇:Feature Engineering 特征工程 3. Feature Generation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分销平台使用手册

分销平台使用手册 分销商和供应商流程图 基本资料维护 1、分销联系人资料:包括:联系人;联系固话(手机号码);email;阿里旺旺(建议用已认证过的账号或商城店铺的阿里旺旺子账号&#x…

LeetCode 474. 一和零(01背包动态规划)

1. 题目 在计算机界中,我们总是追求用有限的资源获取最大的收益。 现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。 你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字…

android es管理工具,Android

Android ES文件管理器在文件管理器中,ES文件管理器的名气是比较大的,这款文件管理器也在近日进行了更新,更新后的ES文件管理器支持了更多网络存储空间,可以直接访问百度网盘、快盘、酷盘、微盘、box、sugarsync、dropbox和skydriv…

深入浅出InfoPath——让管理员来部署InfoPath表单

应用场景: 我们(乙方)在给客户提供基于InfoPath表单(尤其是包含托管代码的)的工作流解决方案的时候,常常需要客户(甲方)的SharePoint管理员来帮忙在安装SharePoint Server的服务器上…

LeetCode 932. 漂亮数组(分治递归/循环)

文章目录1. 题目2. 解题2.1 分治递归2.2 循环1. 题目 对于某些固定的 N&#xff0c;如果数组 A 是整数 1, 2, …, N 组成的排列&#xff0c;使得&#xff1a; 对于每个 i < j&#xff0c;都不存在 k 满足 i < k < j 使得 A[k] * 2 A[i] A[j]。 那么数组 A 是漂亮…

android 修改系统参数设置,2021-05-15 [RK3399][Android7.1] 调试笔记 ---显示参数动态设置接口...

系统环境&#xff1a;Platform: RK3399OS: Android 7.1Kernel: v4.4.83接口代码所在位置为&#xff1a;/frameworks/base/core/java/android/os/DisplayOutputManager.java如图&#xff1a;image.png1. 设置背光亮度public void setBrightness(int display, int brightness)设置…

Lucene.Net:关于索引的一些补充说明和总结

在前面的几篇关于lucene的文章中&#xff0c;我已经简要说明了如何利用lucene进行分词、索引和搜索。最近大部分时间耗在查资料上&#xff0c;看得比较多比较杂但是一贯的不够深入&#xff0c;还好多数都是不会影响编程实践的概念性的东西。有时候我自己也感觉到有心无力&#…

在2008 server安装vm server时发生的错误error1718、error1335……

;转载于:https://www.cnblogs.com/minglog/archive/2011/02/15/1955290.html

hibernate3.6.0日志配置

hibernate3 自带的默认的日志框架是slf4j&#xff0c;hibernate3的slf只是一个日志的接口&#xff0c;而hibernate3 自带默认的日志框架&#xff0c;在实际开发中很少有公司或者是项目中用到&#xff0c;这里记录一种使用log4j的日志框架来代替slf4j日志框架的实现&#xff0c;…

android stackview,Android StackView 使用示例

cell.xml 布局文件&#xff1a;xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/cellImage"android:layout_width"200dp"android:layout_height"200dp"/>主布局文件&#xff1a;android:id"id/activ…

WCF 体系结构图

转载于:https://www.cnblogs.com/agressivo/articles/1958858.html

android studio电影院选座,8排电影院选座最佳位置

8排电影院选座最佳位置在哪里呢&#xff1f;8排电影院属于小影厅&#xff0c;小影厅银幕宽度在10米以下&#xff0c;座位100以内&#xff0c;座位排数通常拥有8-14排&#xff0c;小影厅整体空间小&#xff0c;选座时要选中间稍靠后一些的位置。由于整体排数少&#xff0c;因此选…

仿Jquery链式操作的xml操作类

经常需要对xml文件进行操作&#xff0c;参考了Jquery的链式操作后实现了xmlHelper类。代码usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Xml;namespaceConfigUpdate{ ///<summary>///调用非静态的操作方法的 ///</summary>publiccla…

4月17日鸿蒙开发者大会,4月17日这天,将载入华为史册

文/笨鸟原创不易&#xff0c;禁止抄袭、洗稿&#xff0c;违者必究&#xff01;万众瞩目的华为鸿蒙系统对于国人来说&#xff0c;一部智能手机只有实现了芯片和系统技术的自主化&#xff0c;才能被称之为真正的国产手机。而就目前的国内手机市场而言&#xff0c;除华为之外的所有…

html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)

今天给大家一个if else的Javascript小示例&#xff0c;其中我在js文件里写了很多注释&#xff0c;有兴趣的同学自己看注释&#xff0c;另外对于聊天界面的显示方式&#xff0c;我写了两种&#xff0c;大家也可以分别试试&#xff1a;老规矩&#xff0c;先上图&#xff1a;html代…

LeetCode 1457. 二叉树中的伪回文路径(位运算+递归)

1. 题目 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 示例 1&…

LeetCode 837. 新21点(动态规划)

文章目录1. 题目2. 解题2.1 暴力超时2.2 优化1. 题目 爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏&#xff0c;描述如下&#xff1a; 爱丽丝以 0 分开始&#xff0c;并在她的得分少于 K 分时抽取数字。 抽取时&#xff0c;她从 [1, W] 的范围中随机获得一个整数作为…

计算机网络划分的标准,计算机网络基础

1.具有统一的网络体系结构、遵循国际标准化协议的计算机网络在第三代网络出现以前各厂家为了霸占市场采用自己独特的技术并开发了自己的网络体系结构网络无法实现不同厂家设备互连这样就阻碍了大范围网络的发展。后来为了实现网络大范围的发展和不同厂家设备的互连1977年国际标…

大型软件是否占用计算机内存,电脑系统开机内存占用多少正常

原标题&#xff1a;电脑系统开机内存占用多少正常正常情况下有多少启动内存&#xff1f;如果使用2G内存&#xff0c;则Win7在启动时基本上可以达到50&#xff05;以上&#xff0c;运行点程序肯定会达到80&#xff05;&#xff0c;这是正常的。如果使用4G内存&#xff0c;则Win7…

LeetCode 1267. 统计参与通信的服务器(计数)

1. 题目 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一…