特征工程


优秀作文 2019-06-07 11:20:59 优秀作文
[摘要]特征工程篇(一):七种常用特征工程像一个优秀的工程师一样使用机器学习,而不要像一个机器学习专家一样使用机器学习方法。 ---google当在做数据挖掘和数据分析时,数据是所有问题的基础,并且会影响整个工程的流程。相比一些复杂的算法,如何灵活的处理好数据经常会取到意想不到的效益。而处理数据不可或缺的需

【www.shanpow.com--优秀作文】

特征工程篇(一):七种常用特征工程


  
像一个优秀的工程师一样使用机器学习,而不要像一个机器学习专家一样使用机器学习方法。 ---google
    当在做数据挖掘和数据分析时,数据是所有问题的基础,并且会影响整个工程的流程。相比一些复杂的算法,如何灵活的处理好数据经常会取到意想不到的效益。而处理数据不可或缺的需要使用到特征工程。
一、什么是特征工程
    简单的说,特征工程是能够将数据像艺术一样展现的技术。为什么这么说呢?因为好的特征工程很好的混合了专业领域知识、直觉和基本的数学能力。但是最有效的数据呈现其实并不涉及任何的数据运算。
    本质上来说,呈现给算法的数据应该能拥有基本数据的相关结构或属性。当你做特征工程时,其实是将数据属性转换为数据特征的过程,属性代表了数据的所有维度,在数据建模时,如果对原始数据的所有属性进行学习,并不能很好的找到数据的潜在趋势,而通过特征工程对你的数据进行预处理的话,你的算法模型能够减少受到噪声的干扰,这样能够更好的找出趋势。事实上,好的特征甚至能够帮你实现使用简单的模型达到很好的效果。
    但是对于特征工程中引用的新特征,需要验证它确实提高的预测的准确度,而不是加入了一个无用的特征,不然只会增加算法运算的复杂度。
    本文只提供一些简单的特征工程技巧,希望能够在你以后的分析中提供帮忙。
二、常用方法
1. 时间戳处理
    时间戳属性通常需要分离成多个维度比如年、月、日、小时、分钟、秒钟。但是在很多的应用中,大量的信息是不需要的。比如在一个监督系统中,尝试利用一个’位置+时间‘的函数预测一个城市的交通故障程度,这个实例中,大部分会受到误导只通过不同的秒数去学习趋势,其实是不合理的。并且维度"年"也不能很好的给模型增加值的变化,我们可能仅仅需要小时、日、月等维度。因此当我们在呈现时间的时候,试着保证你所提供的所有数据是你的模型所需要的。
    并且别忘了时区,假如你的数据源来自不同的地理数据源,别忘了利用时区将数据标准化。
2. 分解类别属性
    一些属性是类别型而不是数值型,举一个简单的例子,由{红,绿、蓝}组成的颜色属性,最常用的方式是把每个类别属性转换成二元属性,即从{0,1}取一个值。因此基本上增加的属性等于相应数目的类别,并且对于你数据集中的每个实例,只有一个是1(其他的为0),这也就是独热(one-hot)编码方式(类似于转换成哑变量)。
    如果你不了解这个编码的话,你可能会觉得分解会增加没必要的麻烦(因为编码大量的增加了数据集的维度)。相反,你可能会尝试将类别属性转换成一个标量值,例如颜色属性可能会用{1,2,3}表示{红,绿,蓝}。这里存在两个问题,首先,对于一个数学模型,这意味着某种意义上红色和绿色比和蓝色更“相似”(因为|1-3| > |1-2|)。除非你的类别拥有排序的属性(比如铁路线上的站),这样可能会误导你的模型。然后,可能会导致统计指标(比如均值)无意义,更糟糕的情况是,会误导你的模型。还是颜色的例子,假如你的数据集包含相同数量的红色和蓝色的实例,但是没有绿色的,那么颜色的均值可能还是得到2,也就是绿色的意思。
    能够将类别属性转换成一个标量,最有效的场景应该就是只有两个类别的情况。即{0,1}对应{类别1,类别2}。这种情况下,并不需要排序,并且你可以将属性的值理解成属于类别1或类别2的概率。
3.分箱/分区
    有时候,将数值型属性转换成类别呈现更有意义,同时能使算法减少噪声的干扰,通过将一定范围内的数值划分成确定的块。举个例子,我们预测一个人是否拥有某款衣服,这里年龄是一个确切的因子。其实年龄组是更为相关的因子,所有我们可以将年龄分布划分成1-10,11-18,19-25,26-40等。而且,不是将这些类别分解成2个点,你可以使用标量值,因为相近的年龄组表现出相似的属性。
    只有在了解属性的领域知识的基础,确定属性能够划分成简洁的范围时分区才有意义。即所有的数值落入一个分区时能够呈现出共同的特征。在实际应用中,当你不想让你的模型总是尝试区分值之间是否太近时,分区能够避免出现过拟合。例如,如果你所感兴趣的是将一个城市作为整体,这时你可以将所有落入该城市的维度值进行整合成一个整体。分箱也能减小小错误的影响,通过将一个给定值划入到最近的块中。如果划分范围的数量和所有可能值相近,或对你来说准确率很重要的话,此时分箱就不适合了。
4. 交叉特征
    交叉特征算是特征工程中非常重要的方法之一了,交叉特征是一种很独特的方式,它将两个或更多的类别属性组合成一个。当组合的特征要比单个特征更好时,这是一项非常有用的技术。数学上来说,是对类别特征的所有可能值进行交叉相乘。
    假如拥有一个特征A,A有两个可能值{A1,A2}。拥有一个特征B,存在{B1,B2}等可能值。然后,A&B之间的交叉特征如下:{(A1,B1),(A1,B2),(A2,B1),(A2,B2)},并且你可以给这些组合特征取任何名字。但是需要明白每个组合特征其实代表着A和B各自信息协同作用。
       举个栗子,如下图中:
     所有的蓝色点属于一类,红色属于另外一类。我们不考虑实际模型,首先,将X,Y值分成{x<0,x>=0}&{y<0,y>=0}对我们来说会很有用,将划分结果取名为{Xn,Xp}和{Yn,Yp}。很显然I&III象限对应于红色类别,II&IV象限是蓝色类。因此如果现在将特征X和特征Y组成成交叉特征,你会有四个象限特征,{I,II,III,IV}分别对应于{(Xp, Yp), (Xn, Yp), (Xn, Yn), (Xp, Yn)} 。
     一个更好地诠释好的交叉特征的实例是类似于(经度,纬度)。一个相同的经度对应了地图上很多的地方,纬度也是一样。但是一旦你将经度和纬度组合到一起,它们就代表了地理上特定的一块区域,区域中每一部分是拥有着类似的特性。
     有时候,能够通过简单的数学技巧将数据的属性组合成一个单一的特征。在上一个例子中,将更改的特征设定为,并且有如下关系:
            将新的特征定义为,有:
            我们可以根据确定特征,如果为1,类别是红色,如果是为其他值,则是蓝色;
5. 特征选择
     为了得到更好的模型,使用某些算法自动的选出原始特征的子集。这个过程,你不会构建或修改你拥有的特征,但是会通过修剪特征来达到减少噪声和冗余。 
那些和我们解决的问题无关需要被移除的属性,在我们的数据特征中存在了一些特征对于提高模型的准确率比其他更重要的特征,也还有一些特征与其他特征放在一起出现了冗余,特征选择是通过自动选出对于解决问题最有用的特征子集来解决上述问题的。
    特征选择算法可能会用到评分方法来排名和选择特征,比如相关性或其他确定特征重要性的方法,更进一步的方法可能需要通过试错,来搜索出特征子集。
    还有通过构建辅助模型的方法,逐步回归就是模型构造过程中自动执行特征选择算法的一个实例,还有像Lasso回归和岭回归等正则化方法也被归入到特征选择,通过加入额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。
6. 特征缩放
    有时候,你可能会注意到某些特征比其他特征拥有高得多的跨度值。举个例子,将一个人的收入和他的年龄进行比较,更具体的例子,如某些模型(像岭回归)要求你必须将特征值缩放到相同的范围值内。通过缩放可以避免某些特征比其他特征获得大小非常悬殊的权重值。
7. 特征提取
    特征提取涉及到从原始属性中自动生成一些新的特征集的一系列算法,降维算法就属于这一类。特征提取是一个自动将观测值降维到一个足够建模的小数据集的过程。对于列表数据,可使用的方法包括一些投影方法,像主成分分析和无监督聚类算法。对于图形数据,可能包括一些直线检测和边缘检测,对于不同领域有各自的方法。
    特征提取的关键点在于这些方法是自动的(虽然可能需要从简单方法中设计和构建得到),还能够解决不受控制的高维数据的问题。大部分的情况下,是将这些不同类型数据(如图,语言,视频等)存成数字格式来进行模拟观察。

特征工程篇(二):特征工程


七月在线4月机器学习算法班课程笔记——No.6
前言
  机器学习领域的大神Andrew Ng(吴恩达)老师曾说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”表达了特征工程是比较难,比较耗时的一个过程,需要较强的领域知识。我们也了解到,Kagglers比赛和天池比赛的冠军其实在比赛中并没有用到很高深的算法,大多数都是在特征工程这个环节做出了出色的工作,然后使用一些常见的算法,比如逻辑回归,就能得到出色的性能。可见特征工程在实际的实验研究中占着重要的位置,那么这样一个耗时又重要的工作解决的是什么问题呢?please read on.
  特征是数据中抽取出来的对结果预测有用的信息,可以是文本或者数据。特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。过程包含了特征提取、特征构建、特征选择等模块。
  特征工程的目的是筛选出更好的特征,获取更好的训练数据。因为好的特征具有更强的灵活性,可以用简单的模型做训练,更可以得到优秀的结果。“工欲善其事,必先利其器”,特征工程可以理解为利其器的过程。互联网公司里大部分复杂的模型都是极少数的数据科学家在做,大多数工程师们做的事情基本是在数据仓库里搬砖,不断地数据清洗,再一个是分析业务不断地找特征。 例如,某广告部门的数据挖掘工程师,2周内可以完成一次特征迭代,一个月左右可以完成模型的小优化,来提升auc。
1. 数据采集/清洗/采样
  寒老师有多年的互联网从业经验,所以讲解的过程中结合了很多工业界的应用,更加的深入浅出。
  数据采集:数据采集前需要明确采集哪些数据,一般的思路为:哪些数据对最后的结果预测有帮助?数据我们能够采集到吗?线上实时计算的时候获取是否快捷?
  举例1:我现在要预测用户对商品的下单情况,或者我要给用户做商品推荐,那我需要采集什么信息呢?
  -店家:店铺的评分、店铺类别……
  -商品:商品评分、购买人数、颜色、材质、领子形状……
  -用户:历史信息(购买商品的最低价最高价)、消费能力、商品停留时间……
  数据清洗: 数据清洗也是很重要的一步,机器学习算法大多数时候就是一个加工机器,至于最后的产品如何,取决于原材料的好坏。数据清洗就是要去除脏数据,比如某些商品的刷单数据。
  那么如何判定脏数据呢?
  1) 简单属性判定:一个人身高3米+的人;一个人一个月买了10w的发卡。
  2) 组合或统计属性判定:号称在米国却ip一直都是大陆的新闻阅读用户?你要判定一个人是否会买篮球鞋,样本中女性用户85%?
  3) 补齐可对应的缺省值:不可信的样本丢掉,缺省值极多的字段考虑不用。
  数据采样:采集、清洗过数据以后,正负样本是不均衡的,要进行数据采样。采样的方法有随机采样和分层抽样。但是随机采样会有隐患,因为可能某次随机采样得到的数据很不均匀,更多的是根据特征采用分层抽样。
2. 特征处理
  我们把特征工程的数据分别下面几种类型,分别来看一下其特点。
2.1 数值型
幅度调整/归一化:python中会有一些函数比如preprocessing.MinMaxScaler()将幅度调整到 [0,1] 区间。
统计值:包括max, min, mean, std等。python中用pandas库序列化数据后,可以得到数据的统计值。
离散化:把连续值转成非线性数据。例如电商会有各种连续的价格表,从0.03到100元,假如以一元钱的间距分割成99个区间,用99维的向量代表每一个价格所处的区间,1.2元和1.6元的向量都是 [0,1,0,…,0]。pd.cut() 可以直接把数据分成若干段。
柱状分布:离散化后统计每个区间的个数做柱状图。
2.2 类别型
  类别型一般是文本信息,比如颜色是红色、黄色还是蓝色,我们存储数据的时候就需要先处理数据。处理方法有:
  1. one-hot编码,编码后得到哑变量。统计这个特征上有多少类,就设置几维的向量,pd.get_dummies()可以进行one-hot编码。
  2. Hash编码成词向量:
  
  3. Histogram映射:把每一列的特征拿出来,根据target内容做统计,把target中的每个内容对应的百分比填到对应的向量的位置。优点是把两个特征联系起来。
  
  上表中,我们来统计“性别与爱好的关系”,性别有“男”、“女”,爱好有三种,表示成向量 [散步、足球、看电视剧],分别计算男性和女性中每个爱好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了两个特征的关系。
2.3 时间型
  时间型特征的用处特别大,既可以看做连续值(持续时间、间隔时间),也可以看做离散值(星期几、几月份)。数据挖掘中经常会用时间作为重要特征,比如电商可以分析节假日和购物的关系,一天中用户喜好的购物时间等。
2.4 文本型
  1. 词袋:文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。Python中用CountVectorizer处理词袋.
  2. 把词袋中的词扩充到n-gram:n-gram代表n个词的组合。比如“我喜欢你”、“你喜欢我”这两句话如果用词袋表示的话,分词后包含相同的三个词,组成一样的向量:“我 喜欢 你”。显然两句话不是同一个意思,用n-gram可以解决这个问题。如果用2-gram,那么“我喜欢你”的向量中会加上“我喜欢”和“喜欢你”,“你喜欢我”的向量中会加上“你喜欢”和“喜欢我”。这样就区分开来了。
  3. 使用TF-IDF特征:TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数),IDF(t) = ln(总文档数/ 含t的文档数),TF-IDF权重 = TF(t) * IDF(t)。自然语言处理中经常会用到。
2.5 统计型
  历届的Kaggle/天池比赛, 天猫/京东排序和推荐业务线里模型用到的特征。统计的内容包括加减平均、分位线、次序型、比例类等。
  比如“天池大数据之移动推荐算法大赛”中,给比赛选手两张表,介绍用户和商品信息,要求预测把哪些商品推荐给用户,用户最有可能购买。下面是两张表的内容:
  
  下面举例说明选手们是怎么进行特征处理的:
  
  
  可见,选手需要进行制定规则、数据清洗、各个种类的特征处理等,对特征的研究是非常细化的。
2.6 组合特征
  1. 拼接型:简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型。
  - user_id&&category: 10001&&女裙 10002&&男士牛仔
  - user_id&&style: 10001&&蕾丝 10002&&全棉  
  2. 模型特征组合:
  - 用GBDT产出特征组合路径
  - 组合特征和原始特征一起放进LR训练
3. 特征选择
  特征选择,就是从多个特征中,挑选出一些对结果预测最有用的特征。因为原始的特征中可能会有冗余和噪声。
  特征选择和降维有什么区别呢?前者只踢掉原本特征里和结果预测关系不大的, 后者做特征的计算组合构成新特征。
3.1 过滤型
   - 方法:? 评估单个特征和结果值之间的相关程度, 排序留下Top相关的特征部分。
   - 评价方式:Pearson相关系数, 互信息, 距离相关度。
   - 缺点:只评估了单个特征对结果的影响,没有考虑到特征之间的关联作用, 可能把有用的关联特征误踢掉。因此工业界使用比较少。
   - Python包:SelectKBest指定过滤个数、SelectPercentile指定过滤百分比。
3.2 包裹型
  - 方法:把特征选择看做一个特征子集搜索问题, 筛选各种特
征子集, 用模型评估效果。
  - 典型算法:“递归特征删除算法”。
  - 应用在逻辑回归的过程:用全量特征跑一个模型;根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化;逐步进行, 直至准确率/auc出现大的下滑停止。
  - python包:RFE
  
3.3 嵌入型
   - 方法:根据模型来分析特征的重要性,最常见的方式为用正则化方式来做特征选择。
   - 举例:最早在电商用LR做CTR预估, 在3-5亿维的系数特征上用L1正则化的LR模型。上一篇介绍了L1正则化有截断作用,剩余2-3千万的feature, 意味着其他的feature重要度不够。
   - python包:feature_selection.SelectFromModel选出权重不为0的特征。
More
机器学习公开课-特征处理与特征选择
4月机器学习算法班-特征工程
特征处理与选择实例分析

特征工程篇(二):前言

特征工程篇(二):1. 数据采集/清洗/采样

特征工程篇(二):2. 特征处理

特征工程篇(二):3. 特征选择

特征工程篇(二):More

特征工程篇(三):特征工程到底是什么?


修改
大概知道一些,但是不是很清楚领域内的知识是怎么帮助特征工程的呢?如果有例子就更好了。修改
举报添加评论 
分享 · 邀请回答
默认排序按时间排序
11 个回答
城东 一个懒惰的人,总是想设计更智能的程序来…
364 人赞同
转自我的博文:使用sklearn做单机特征工程目录1 特征工程是什么?2 数据预处理  2.1 无量纲化    2.1.1 标准化    2.1.2 区间缩放法    2.1.3 标准化与归一化的区别  2.2 对定量特征二值化  2.3 对定性特征哑编码  2.4 缺失值计算  2.5 数据变换3 特征选择  3.1 Filter    3.1.1 方差选择法    3.1.2 相关系数法    3.1.3 卡方检验    3.1.4 互信息法  3.2 Wrapper    3.2.1 递归特征消除法  3.3 Embedded    3.3.1 基于惩罚项的特征选择法    3.3.2 基于树模型的特征选择法4 降维  4.1 主成分分析法(PCA)  4.2 线性判别分析法(LDA)5 总结6 参考资料
1 特征工程是什么?  有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:
  特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。首次接触到sklearn,通常会被其丰富且方便的算法模型库吸引,但是这里介绍的特征处理库也十分强大!
  本文中使用sklearn中的IRIS(鸢尾花)数据集来对特征处理功能进行说明。IRIS数据集由Fisher在1936年整理,包含4个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。导入IRIS数据集的代码如下:
from sklearn.datasets import load_iris

#导入IRIS数据集
iris = load_iris()
#特征矩阵
iris.data
#目标向量
iris.target
2 数据预处理  通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:
不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。
定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
存在缺失值:缺失值需要补充。
信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。
  我们使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。
2.1 无量纲化  无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。
2.1.1 标准化  标准化需要计算特征的均值和标准差,公式表达为:
  使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:
from sklearn.preprocessing import StandardScaler

#标准化,返回值为标准化后的数据
StandardScaler().fit_transform(iris.data)
2.1.2 区间缩放法  区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:
  使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:
from sklearn.preprocessing import MinMaxScaler
#区间缩放,返回值为缩放到[0, 1]区间的数据
MinMaxScaler().fit_transform(iris.data)
2.1.3 标准化与归一化的区别  简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:
  使用preproccessing库的Normalizer类对数据进行归一化的代码如下:
from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据
Normalizer().fit_transform(iris.data)
2.2 对定量特征二值化  定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:
  使用preproccessing库的Binarizer类对数据进行二值化的代码如下:
from sklearn.preprocessing import Binarizer
#二值化,阈值设置为3,返回值为二值化后的数据
Binarizer(threshold=3).fit_transform(iris.data)
2.3 对定性特征哑编码  由于IRIS数据集的特征皆为定量特征,故使用其目标值进行哑编码(实际上是不需要的)。使用preproccessing库的OneHotEncoder类对数据进行哑编码的代码如下:
from sklearn.preprocessing import OneHotEncoder
#哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))
2.4 缺失值计算  由于IRIS数据集没有缺失值,故对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失。使用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:
from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer
#缺失值计算,返回值为计算缺失值后的数据
#参数missing_value为缺失值的表示形式,默认为NaN
#参数strategy为缺失值填充方式,默认为mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
2.5 数据变换  常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。4个特征,度为2的多项式转换公式如下:
  使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:
from sklearn.preprocessing import PolynomialFeatures
#多项式转换
#参数degree为度,默认值为2
PolynomialFeatures().fit_transform(iris.data)
  基于单变元函数的数据变换可以使用一个统一的方式完成,使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:
from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
#自定义转换函数为对数函数的数据变换
#第一个参数是单变元函数
FunctionTransformer(log1p).fit_transform(iris.data)
3 特征选择  当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
  根据特征选择的形式又可以将特征选择方法分为3种:
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
Embedded:集成法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
  我们使用sklearn中的feature_selection库来进行特征选择。
3.1 Filter3.1.1 方差选择法  使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:
from sklearn.feature_selection import VarianceThreshold
#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)
3.1.2 相关系数法  使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
3.1.3 卡方检验  经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
  不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
3.1.4 互信息法  经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:
  为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:
from sklearn.feature_selection import SelectKBest
from minepy import MINE

#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
m = MINE()
m.compute_score(x, y)
return (m.mic(), 0.5)
#选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
3.2 Wrapper3.2.1 递归特征消除法  递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
3.3 Embedded3.3.1 基于惩罚项的特征选择法  使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
  实际上,L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型:
from sklearn.linear_model import LogisticRegression
class LR(LogisticRegression):
def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0,
fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver="liblinear", max_iter=100,
multi_class="ovr", verbose=0, warm_start=False, n_jobs=1):
#权值相近的阈值
self.threshold = threshold
LogisticRegression.__init__(self, penalty="l1", dual=dual, tol=tol, C=C,
fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight=class_weight,
random_state=random_state, solver=solver, max_iter=max_iter,
multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)
#使用同样的参数创建L2逻辑回归
self.l2 = LogisticRegression(penalty="l2", dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)
def fit(self, X, y, sample_weight=None):
#训练L1逻辑回归
super(LR, self).fit(X, y, sample_weight=sample_weight)
self.coef_old_ = self.coef_.copy()
#训练L2逻辑回归
self.l2.fit(X, y, sample_weight=sample_weight)
cntOfRow, cntOfCol = self.coef_.shape
#权值系数矩阵的行数对应目标值的种类数目
for i in range(cntOfRow):
for j in range(cntOfCol):
coef = self.coef_[i][j]
#L1逻辑回归的权值系数不为0
if coef != 0:
idx = [j]
#对应在L2逻辑回归中的权值系数
coef1 = self.l2.coef_[i][j]
for k in range(cntOfCol):
coef2 = self.l2.coef_[i][k]
#在L2逻辑回归中,权值系数之差小于设定的阈值,且在L1中对应的权值为0
if abs(coef1-coef2) < self.threshold and j != k and self.coef_[i][k] == 0:
idx.append(k)
#计算这一类特征的权值系数均值
mean = coef / len(idx)
self.coef_[i][idx] = mean
return self
  使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:
from sklearn.feature_selection import SelectFromModel

#带L1和L2惩罚项的逻辑回归作为基模型的特征选择
#参数threshold为权值系数之差的阈值
SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)
3.3.2 基于树模型的特征选择法  树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
4 降维  当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
4.1 主成分分析法(PCA)  使用decomposition库的PCA类选择特征的代码如下:
from sklearn.decomposition import PCA
#主成分分析法,返回降维后的数据
#参数n_components为主成分数目
PCA(n_components=2).fit_transform(iris.data)
4.2 线性判别分析法(LDA)  使用lda库的LDA类选择特征的代码如下:
from sklearn.lda import LDA
#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform(iris.data, iris.target)
5 总结  再让我们回归一下本文开始的特征工程的思维导图,我们可以使用sklearn完成几乎所有特征处理的工作,而且不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。这些难道都是巧合吗?还是故意设计成这样?方法fit_transform中有fit这一单词,它和训练模型的fit方法有关联吗?接下来,我将在《使用sklearn优雅地进行数据挖掘》中阐述其中的奥妙!
6 参考资料
FAQ: What is dummy coding?
IRIS(鸢尾花)数据集
卡方检验
干货:结合Scikit-learn介绍几种常用的特征选择方法
机器学习中,有哪些特征选择的工程方法?
机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)
编辑于 2016-07-19 16 条评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
张戎数学话题优秀回答者 数据挖掘初学者
72 人赞同
特征工程是一个非常重要的课题,是机器学习中不可缺少的一部分,但是它几乎很少出现于机器学习书本里面的某一章。在机器学习方面的成功很大程度上在于如果使用特征工程。(I)特征工程可以解决什么样的问题?在机器学习中,经常是用一个预测模型(线性回归,逻辑回归,SVD等)和一堆原始数据来得到一些预测的结果,人们需要做的是从这堆原始数据中去提炼较优的结果,然后做到最优的预测。这个就包括两个方面,第一就是如何选择和使用各种模型,第二就是怎么样去使用这些原始的数据才能达到最优的效果。那么怎么样才能够获得最优的结果呢?贴上一句经典的话就是:Actually the sucess of all Machine Learning algorithms depends on how you present the data. ------ Mohammad Pezeshki直接翻译过来便是:事实上所有机器学习算法上面的成功都在于你怎么样去展示这些数据。由此可见特征工程在实际的机器学习中的重要性,从数据里面提取出来的特征好坏与否就会直接影响模型的效果。从某些层面上来说,所使用的特征越好,得到的效果就会越好。所需要的特征就是可以借此来描述已知数据的内在关系。总结一下就是:Better feature means flexibility. Better feature means simpler models. Better feature means better results.有的时候,可以使用一些不是最优的模型来训练数据,如果特征选择得好的话,依然可以得到一个不错的结果。很多机器学习的模型都能够从数据中选择出不错的结构,从而进行良好的预测。一个优秀的特征具有极强的灵活性,可以使用不那么复杂的,运算速度快,容易理解和维护的模型来得到不错的结果。(II)什么才是特征工程?Feature Engineering is the process of transforming raw data into features that better represent the underlying problem to the predictive models, resulting in improved model accuracy on unseen data. ------ Jason BrownleeFeature Engineering is manually designing what the input x"s should be. ------ Tomasz Malisiewicz从这个概念可以看出,特征工程其实是一个如何展示和表现数据的问题,在实际工作中需要把数据以一种“良好”的方式展示出来,使得能够使用各种各样的机器学习模型来得到更好的效果。如何从原始数据中去除不佳的数据,展示合适的数据就成为了特征工程的关键问题。(III)特征有用性的预估每次构造了一个特征,都需要从各个方面去证明该特征的有效性。一个特征是否重要主要在于该特征与要预测的东西是否是高度相关的,如果是高度相关,那么该特征就是十分重要的。比如常用的工具就是统计学里面的相关系数。(IV)特征的构造过程 在实际工作中首先肯定要确定具体的问题,然后就是数据的选择和准备过程,再就是模型的准备和计算工作,最后才是展示数据的预测结果。构造特征的一般步骤:[1]任务的确定:根据具体的业务确定需要解决的问题;[2]数据的选择:整合数据,收集数据;[3]预处理数据:设计数据展现的格式,清洗数据,选择合适的样本使得机器学习模型能够使用它。比方说一些年龄特征是空值或者负数或者大于200等,或者说某个页面的播放数据大于曝光数据,这些就是数据的不合理,需要在使用之前把这一批数据排除掉。[4]特征的构造:转化数据,使之成为有效的特征。常用的方法是标准化,归一化,特征的离散化等。(4.1)标准化(Standardization):比方说有一些数字的单位是千克,有一些数字的单位是克,这个时候需要统一单位。如果没有标准化,两个变量混在一起搞,那么肯定就会不合适。(4.2)归一化(Normalization):归一化是因为在特征会在不同的尺度下有不同的表现形式,归一化会使得各个特征能够同时以恰当的方式表现。比方说某个专辑的点击播放率一般不会超过0.2,但是专辑的播放次数可能会达到几千次,所以说为了能够在模型里面得到更合适结果,需要先把一些特征在尺度上进行归一化,然后进行模型训练。(4.3)特征的离散化(Discretization):离散化是指把特征进行必要的离散处理,比方说年龄特征是一个连续的特征,但是把年龄层分成5-18岁(中小学生),19-23岁(大学生),24-29岁(工作前几年),30-40岁(成家立业),40-60岁(中年人)从某些层面来说比连续的年龄数据(比如说某人年龄是20岁1月3日之类的)更容易理解不同年龄层人的特性。典型的离散化步骤:对特征做排序-> 选择合适的分割点-> 作出区间的分割 -> 作出区间分割-> 查看是否能够达到停止条件。[5]模型的使用:创造模型,选择合适的模型,用合适的模型来进行预测,用各种统计指标来判断该特征是否合适;[6]上线的效果:通过在线测试来看效果。数据的转换(Transforming Data)就是把数据从原始的数据状态转换成适合模型计算的状态,从某些层面上来说,“数据转换“和”特征构造“的过程几乎是一致的。(V)特征工程的迭代过程特征工程的迭代步骤:[1]选择特征:需要进行头脑风暴(brainstorm)。通过具体的问题分析,查看大量的数据,从数据中查看出可以提取出数据的关键;[2]设计特征:这个需要具体问题具体分析,可以自动进行特征提取工作,也可以进行手工进行特征的构造工作,甚至混合两种方法;[3]选择特征:使用不同的特征构造方法,来从多个层面来判断这个特征的选择是否合适;[4]计算模型:通过模型计算得到模型在该特征上所提升的准确率。[5]上线测试:通过在线测试的效果来判断特征是否有效。
发布于 2016-01-23 10 条评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 禁止转载
严林机器学习话题优秀回答者 做过些推荐系统的事情
42 人赞同
关于特征工程是什么这个问题,我强烈推荐读一篇文章:Discover Feature Engineering, How to Engineer Features and How to Get Good at It. 特征工程大概包括两个部分:特征提取和特征选择。关于特征选择可以参见这个问题:机器学习中,有哪些特征选择的工程方法? - 知乎用户的回答。一般来说,领域内的知识主要是应用在特征提取。举个例子的话,比如说基于内容的购物推荐,性别就是一个很重要的领域知识,男性和女性关注的物品差别就比较大,推荐也应该体现出这种差别,那么这个特征就是这个问题一个重要特征,应该重点从已知数据提取,甚至专门为它再构建一个机器学习问题。
发布于 2015-04-05 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
nova avon
8 人赞同
水里没有鱼的情况下,再好的渔具也没用,特征工程就是找有鱼的那片水域。
编辑于 2016-02-06 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
秋天的松鼠 Master@CMU, 热爱Machine Learning和美食
9 人赞同
正好为了手头的项目在看特征工程的东西,仅从机器学习的角度说说我的个人理解。对于机器学习来说,数据是算法的输入;要保证算法有好的表现,就要保证输入数据的质量。有时我们会遇到这样的情况:数据维数太高,甚至比数据点的个数还要多,这种情况下会对输入数据的质量造成以下影响:(1)维数冗余,有的数据只是噪声,完全可以去掉;(2)计算困难,维数的增加导致计算时间空间复杂度的增加;(3)容易过拟合,维数越高模型复杂度就可能越高。这种情况下我们就需要特征工程来把数据“瘦身”成维数较少,维数质量高的数据集,去掉冗余信息。通常来说常用的特征工程方法有特征提取和特征选择两种。特征提取主要通过PCA,CCA,ICA等方法从原来各维中总结出潜在的影响因子(latent features),就我的了解而言更注重数据变换,不太涉及领域内知识的运用(我的实践经验不多,如果其实是有的,还望指正);而特征选择中可能涉及的领域知识(domain language)会更多一些。特征选择是指直接从原有维数中选出有用的维来,一个常见的例子就是NLP中停用词(stop words)的使用。如果用一批文档的总词表(vocabulary)中的每一个单词作为一个维,去掉停用词就是去掉冗余维的一个体现。又比如之前做过fMRI脑成像的图像分类,领域内知识已知在某个实验里有效维的数据点会呈现一个特定的分布,我们就可以把完全不呈现这一分布的维剔掉。当然特征选择也有不使用领域内知识的方法,比如使用L1 regularization自动进行特征选择等。
发布于 2015-12-07 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
程序员一名 数据挖掘、精准推荐、量化交易
7 人赞同
算法再牛逼,其上限也是由特征工程决定的。
发布于 2015-12-07 1 条评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
Eric D Customer Insight / Data Analyst
1 人赞同
假如你会用机器学习算法,那么特征工程帮你选择最佳的学习材料,Data Engineer帮你整理好你需要的格式
发布于 2015-12-07 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
辛俊波 机器学习/数据挖掘/户外/摄影
11 人赞同
看过一句话:一个团队,可以没有算法组,不能没有特征工程组
发布于 2015-04-20 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
匿名用户
1 人赞同
我所理解的特征工程,应该是贯穿整个模型训练、预测以及后期应用的长期参考的工程,渗透在机器学习的整个过程。比如NBA星探需要从CBA少年队选球员作为预备球员,现在NBA预备球员中缺少中锋,星探在找球员的时候可能就会注重球员的身高、篮下持球进攻能力,如果想找组织后卫,可能就更在乎球员的场上视野、运球、助攻等组织能力。最后他们组织的球队可能就是比较强的,因为方方面面都会考虑到。最后他们训练好这个选人的标准,球探们可能就会去欧洲,菲律宾等联赛里,按照这个标准去找人。这就是我理解的特征工程到最后在进行不同的task的时候,特征工程就是一种经验,渗透在选模型、选参数、选特征表示等
编辑于 2016-04-15 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
匿名用户
1 人赞同
。。。。。 就是, 大多数情况下, 其实什么降噪什么分类的, 随便选一个不太垃圾的就行, 基本上指标上来全靠特征,说穿了就是人肉做一次分类, 让机器学着舒服点。 个别公司的员工又来评论下面秀了,完全不知道他们公司是不是ppt驱动的, 真心给跪, 一点干货都没有, 我也不和没有干货的人撕逼的,同学, 回去写ppt吧, 欢迎举报当然, 我在技术垃圾、产品也垃圾的百度, 您可以认为大公司不这么做。
编辑于 2016-02-06 17 条评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利
拉克丝无敌闪光炮
最简单的例子就是,如果给你10000列的数据,你先把他变100列,再进行其他运算
发布于 2016-09-18 添加评论 感谢 
分享 收藏 · 没有帮助 · 举报 · 作者保留权利

特征工程篇(三):修改

本文来源:https://www.shanpow.com/xx/326753/

《特征工程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

相关阅读
  • 优秀作文300字【六篇】 优秀作文300字【六篇】
  • 关于优秀作文开头结尾【六篇】 关于优秀作文开头结尾【六篇】
  • 优秀作文800字(合集4篇) 优秀作文800字(合集4篇)
  • 500字优秀作文范文汇总四篇 500字优秀作文范文汇总四篇
  • 一件烦心事四年级优秀作文精选四篇 一件烦心事四年级优秀作文精选四篇
  • 奋斗是青春最亮丽的底色优秀作文(合集三篇) 奋斗是青春最亮丽的底色优秀作文(合集三篇)
  • 扫黄打非征文优秀作文集合4篇 扫黄打非征文优秀作文集合4篇
  • 家乡的风俗500字优秀作文(合集四篇) 家乡的风俗500字优秀作文(合集四篇)
为您推荐