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…

非常好的C语言章节习题集带答案,非常好的C语言章节习题集带答案选编.doc

非常好的C语言章节习题集带答案选编PAGE \* MERGEFORMAT 90第1章 认识C语言二、习题(一)、是非题1.程序是指挥计算机进行各种信息处理任务的一组指令序列。A.对 B.错2.机器语言与硬件平台相关,但汇编语言和硬件平台无关。A.对 B.错3.编译型高级语言明显优于解释型高…

LeetCode 662. 二叉树最大宽度(递归)

1. 题目 给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。 每一层的宽度被定义为两个端点(该层最左和最右的非…

生物信息考研C语言,四川大学生物信息学初试经验分享

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼关于生物学(656):我所用的教材是《陈阅增普通生物学》。以及陈增阅的普生的配套练习册。今年还加了两本参考书 动物生物学和植物生物学题型:1.选择(10个,每个2分) 2.判断(10个,每个2分…

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

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

LeetCode 452. 用最少数量的箭打破气球(贪心)

1. 题目 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。 由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。 开始坐标总是小于结束坐标。平面内最多存…

android发展的外文文献综述,android文献综述总结.docx

android文献综述总结单位代码01  学号  分类号TP315  密级  文献综述  AJAXWeb应用程序开发技术的讨论  院名称  专业名称  学生姓名  指导教师  信息工程学院计算机科学与技术高博张亚娟  XX年2月21日  AJAXWeb应用程序开发技术的讨论  摘要  传统…

如何通过对方IP地址查对方的MAC

ping 对方IP 在用arp -a 查看机器上的arp缓存,其中一个是你自己机器的还有个就是那个IP的用ipconfig /all 查自己的MAC地址查同网段其他机器的nbtstat -A ip 或者 ping过的IP地址其主机nic的mac地址都会保存到arp缓存里面用arp -a就可以查看里面的内容。&#xff0…

Web 安全之文件下载漏洞详解

目录 引言 文件下载漏洞原理 文件下载漏洞的危害 文件下载漏洞类型 文件下载漏洞的利用方法 文件下载漏洞示例 文件下载漏洞的防护措施 漏洞检测与测试 小结 引言 在数字化时代,文件下载是网络应用程序的重要的功能之一,用户可以通过这一功能获…

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;还好多数都是不会影响编程实践的概念性的东西。有时候我自己也感觉到有心无力&#…

android wsdl封装,《android 解析WebService》

android端解析WebService我采用的是ksoap来完成的。ksoap相对来说也是比较简单的。代码如下package com.lv.test;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.t…

LeetCode 638. 大礼包(无限背包DP)

1. 题目 在LeetCode商店中&#xff0c; 有许多在售的物品。 然而&#xff0c;也有一些大礼包&#xff0c;每个大礼包以优惠的价格捆绑销售一组物品。 现给定每个物品的价格&#xff0c;每个大礼包包含物品的清单&#xff0c;以及待购物品清单。请输出确切完成待购清单的最低…

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

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

keepass2Android密码,Keepass2Android密码管理(快速解锁密码)

Keepass2Android密码管理能帮助我们保存各类网站、应用的密码&#xff0c;大家提前设置好之后每次输入密码的时候只需要输入很少的字符就能快速解锁密码&#xff0c;为大家的日常使用提供方便。软件特色* 几乎可与所有的Android 的浏览器结合使用 (见下文)*快速解锁&#xff1a…

LeetCode 845. 数组中的最长山脉(中心扩展)

1. 题目 我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”&#xff1a; B.length > 3存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i1] > ... > B[B.length - 1] &#xff08;注意&#xff1a;B 可以是 A 的…

hibernate3.6.0日志配置

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