参加kaggle的都知道,特征处理比跑模型重要的多,在特征处理上的时间也更多,这里总结一下常见的特征处理方法,在书上或者博客上看见一些比较好的处理特征的方法,我就总结在这里,并注明出处,持续更新。。。html
先看看特征工程的整体,下面这幅图来自一次kaggle的特征工程总结,后面的总结不像这幅图系统,可是我会作到尽可能分类,尽可能系统。
机器学习
若是某一列是离散型特征,并且这一列有些值出现的次数很是小(常常要对离散型特征的值统计一下次数,才能判断多小才是小),咱们能够把这些值统一给一个值,例如Rare,在kaggle泰坦尼克号里面,就能够这么对人姓名的title这么处理。性能
这应该是最简单的特征选择方法了:假设某特征的特征值只有0和1,而且在全部输入样本中,95%的实例的该特征取值都是1,那就能够认为这个特征做用不大。若是100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,若是是连续型变量,就须要将连续变量离散化以后才能用,并且实际当中,通常不太会有95%以上都取某个值的特征存在,因此这种方法虽然简单可是不太好用。能够把它做为特征选择的预处理,先去掉那些取值变化小的特征,而后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。摘自干货:结合Scikit-learn介绍几种经常使用的特征选择方法学习
参加个人这篇博客Label Encoding vs One Hot Encoding测试
连续型特征在kaggle里经常被映射成离散型特征,具体的分析能够看个人博客机器学习模型为何要将特征离散化。优化
通常来讲,连续型特征经常要作归一化或者标准化处理,可是假如你把特征映射成了离散型特征,那这个归一化或标准化处理可作可不作(通常可作可不作,就是不作,否则要增长计算量)。.net
用平均数、众数、K最近邻平均数等来赋值,要是离散型特征,能够直接用pandas的fillna()来填“missing”,而后作Label Encoding或者One Hot Encoding。htm
这里的特征选择仅仅是筛选特征,不包括降维。blog
按照周志华版的机器学习的第11章,他把特征选择的方法总结成了三类:过滤式,包裹式和嵌入式。(注:过滤式和包裹式的处理方式挺少见)ci
过滤式方法先对数据集进行特征选择,而后再训练学习器,特征选择过程和后续的学习器无关。选择过程有前向搜索和后向搜索,评价标准有子集的信息增益,相关统计量(周志华书)和拟合优度断定系数(ISLR)。
包裹式特征选择是把学习器的性能做为特征子集的评价标准。通常来讲,包裹式特征选择比过滤式更好(由于过滤式特征选择不考虑后续的学习器的性能),可是计算开销上却比过滤式大得多。
嵌入式特征选择是将特征选择和学习器训练过程融合一体,二者在同一个优化过程当中完成,常见的有L1正则化和L2正则化,可是L1正则化能更易得到一个稀疏的解。
单变量特征选择可以对每个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉很差的特征。对于回归和分类问题能够采用卡方检验,皮尔逊相关系数等方式对特征进行测试。
这种方法比较简单,易于运行,易于理解,一般对于理解数据有较好的效果(但对特征优化、提升泛化能力来讲不必定有效);这种方法有许多改进的版本、变种。摘自干货:结合Scikit-learn介绍几种经常使用的特征选择方法。
通常通过One Hot Encoding后,矩阵的维度可能会变的很大,此时通常须要进行降维的操做,常见的降维方法有PCA,更多的方法能够看看个人博客机器学习降维方法总结。
泰坦尼克号比赛里面经常使用的一个构造新特征的方法是把兄弟姐妹的数量,伴侣的数据,父母子女的数量加起来,构形成一个新的特征:家庭的大小。
除了上面的直接相加,还有构造多项式特征(特征相乘)等。