如何进行特征工程,以及特征工程的一些理论

特征工程思维导图
正如一句业界经典的话所说,“Garbage in, garbage out”,对于一个机器学习问题,数据和特征决定了结果的上限,而模型、算法的选择和优化决定了模型的下限。

1、什么是特征工程以及其重要性

1.1 特征工程

特征工程,顾名思义,是对原始数据进行一系列工程输出,将其提炼为特征,作为输入供算法和模型使用。

维基百科:Feature engineering is the process of using domain knowledge of the data to create features that make machine learning algorithms work. ”

本质上,特征工程是一个表示和展现数据的过程。

实际工作中,特征工程旨在去除数据中的杂志和冗余,设计更高效的特征以刻画求解的问题与模型之间的关系。

1.2 特征工程的重要性

1、特征越好,灵活性越强
只要特征选得好,即使是一般的模型(或算法)也能获得很好的性能,因为大多数模型(或算法)在好的数据特征下表现的性能都还不错。好特征的灵活性在于它允许你选择不复杂的模型,同时运行速度也更快,也更容易理解和维护。
2、特征越好,构建的模型越简单
有了好的特征,即便你的参数不是最优的,你的模型性能也能仍然会表现的很nice,所以你就不需要花太多的时间去寻找最有参数,这大大的降低了模型的复杂度,使模型趋于简单。
3、特征越好,模型的性能越出色
显然,这一点是毫无争议的,我们进行特征工程的最终目的就是提升模型的性能。

2 特征工程的子问题

在我的理解里,将特征工程划分以下四个子问题,
1、特征获取:这其中包含特征构建和提取。
2、特征处理:包括异常值处理,缺失值处理,数据变换、类别特征处理,非结构化数据处理等。
3、特征选择:从特征集合中挑选一组具有统计意义的特征子集,本质是降维。
4、降维:如果特征选择之后,由于特征矩阵过大,导致计算量大,训练时间长的问题,还可以在特征选择的基础上进行降维。

2.1 特征获取

首先我们需要基于业务的理解,尽可能找出对目标具有影响力的所有特征。
这需要我们花大量的时间去研究真实的数据样本,思考问题的潜在形式和数据结构,人工地从原始数据中构建新的特征。一般情况我们可以使用混合属性或者组合属性去创建新的特征,或者是分解原有的特征来创建新的特征。

2.2 特征处理

特征的处理包含很多内容;

2.2.1 标准化、归一化、中心化

标准化和归一化这两个词经常混在一起用,有时候两个指的是同一个,有时候则不然。
常见的标准化方法有:
z-score标准化,最常见的标准化方法,基本上所有的线性模型在拟合的时候都会做z-score标准化。具体的方法是求出样本特征x的均值mean和标准差std,然后用(x-mean)/std来代替原特征。这样特征就变成了均值为0,方差为1了。在sklearn中,我们可以用StandardScaler来做z-score标准化。

max-min标准化:也叫离差标准化;,预处理后使特征值映射到[0,1]之间。具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果我们希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。在sklearn中,我们可以用MinMaxScaler来做max-min标准化;这种方法的问题就是如果测试集或者预测数据里的特征有小于min,或者大于max的数据,会导致max和min发生变化,需要重新计算。所以实际算法中, 除非你对特征的取值区间有需求,否则max-min标准化没有 z-score标准化好用。

L1/L2范数标准化:如果我们只是为了统一量纲,那么通过L2范数整体标准化也是可以的,具体方法是求出每个样本特征向量x的L2范数||x ||2,然后用x /||x ||2代替原样本特征即可。当然L1范数标准化也是可以的,即用x/||x ||1代替原样本特征。通常情况下,范数标准化首选L2范数标准化。在sklearn中,我们可以用Normalizer来做L1/L2范数标准化。

中心化就是将x替换成x-mean,在pca降维的时候需要用到,目的是为让特征的均值为0,而方差不变,偏于计算,又不影响pca依赖方差来降维。

2.2.2 异常样本处理

实际项目上拿到的数据往往有很多异常数据,不进行处理和可能对我们后面的数据分析模型有很大的偏差。而异常样本的处理通常需要对数据的拥有专业知识,没专业知识通常筛选出异常样本的方法是:
聚类:通过聚类将样本分成多个簇,如果一个簇中的样本个数很少,且这个簇的中心距离其他簇的中心很远,那么这个簇里面的样本就很有可能是异常样本。

异常点检测:主要使用iForest或者one class SVM,使用异常点检测的机器学习算法来过滤所有的异常点。one class SVM 与SVM类似,就是根据样本数据训练出一个最小的超球面(大于三维特征),在二维特征中是一个曲线,将数据全部包起来,超球面之外的点就是异常点。

2.2.3 不平衡数据集

我们在实际项目中经常碰到数据集中每一类的样本数量不平衡的情况,如果不解决不平衡的情况,训练出来的模型就会样本数量较少的类的样本泛化能力很差。
常用的解决方法有:采样法和权重法
采样法又有过采样和欠采样之分;
权重法特别简单;我们可以对训练集里的每个类别加一个权重class weight。如果该类别的样本数多,那么它的权重就低,反之则权重就高。如果更细致点,我们还可以对每个样本加权重sample weight,思路和类别权重也是一样,即样本数多的类别样本权重低,反之样本权重高。sklearn中,绝大多数分类算法都有class weight和 sample weight可以使用。

采样法常用的也有两种思路,一种是对类别样本数多的样本做欠采样, 比如训练集里A类别样本占90%,B类别样本占10%。那么我们可以对A类的样本子采样,直到子采样得到的A类样本数和B类别现有样本一致为止,这样我们就只用子采样得到的A类样本数和B类现有样本一起做训练集拟合模型。第二种思路是对类别样本数少的样本做过采样, 还是上面的例子,我们对B类别的样本做过采样,直到过采样得到的B类别样本数加上B类别原来样本一起和A类样本数一致,最后再去拟合模型。smote算法是过采样的代表算法;

2.2.4 缺失值处理

首先我们会看是该特征是连续值还是离散值。如果是连续值,那么一般有两种选择,一是选择所有有该特征值的样本,然后取平均值,来填充缺失值,另一种是取中位数来填充缺失值。如果是离散值,则一般会选择所有有该特征值的样本中最频繁出现的类别值,来填充缺失值。在sklearn中,可以使用preprocessing.Imputer来选择这三种不同的处理逻辑做预处理。

2.2.5 特殊的特征处理

有些特征的默认取值比较特殊,一般需要做了处理后才能用于算法。比如日期时间,比如显示20180519,这样的值一般没办法直接使用。那么一般需要如何变换呢?

    对于时间原始特征,处理方法有很多,这里只举例几种有代表性的方法。 第一种是使用连续的时间差值法,即计算出所有样本的时间到某一个未来时间之间的数值差距,这样这个差距是UTC的时间差,从而将时间特征转化为连续值。第二种方法是根据时间所在的年,月,日,星期几,小时数,将一个时间特征转化为若干个离散特征,这种方法在分析具有明显时间趋势的问题比较好用。第三种是权重法,即根据时间的新旧得到一个权重值。比如对于商品,三个月前购买的设置一个较低的权重,最近三天购买的设置一个中等的权重,在三个月内但是三天前的设置一个较大的权重。当然,还有其他的设置权重的方法,这个要根据要解决的问题来灵活确定。

   对地理特征,比如“广州市天河区XX街道XX号”,这样的特征我们应该如何使用呢?处理成离散值和连续值都是可以的。如果是处理成离散值,则需要转化为多个离散特征,比如城市名特征,区县特征,街道特征等。但是如果我们需要判断用户分布区域,则一般处理成连续值会比较好,这时可以将地址处理成经度和纬度的连续特征。

2.2.6 离散特征的连续化处理

有很多机器学习算法只能处理连续值特征,不能处理离散值特征,比如线性回归,逻辑回归等。那么想使用逻辑回归,线性回归时这些值只能丢弃吗?当然不是。我们可以将离散特征连续化处理。

最常见的离散特征连续化的处理方法是独热编码one-hot encoding。处理方法其实比较简单,比如某特征的取值是高,中和低,那么我们就可以创建三个取值为0或者1的特征,将高编码为1,0,0这样三个特征,中编码为0,1,0这样三个特征,低编码为0,0,1这样三个特征。也就是说,之前的一个特征被我们转化为了三个特征。sklearn的OneHotEncoder可以帮我们做这个处理。

第二个方法是特征嵌入embedding。这个一般用于深度学习中。比如对于用户的ID这个特征,如果要使用独热编码,则维度会爆炸,如果使用特征嵌入就维度低很多了。对于每个要嵌入的特征,我们会有一个特征嵌入矩阵,这个矩阵的行很大,对应我们该特征的数目。比如用户ID,如果有100万个,那么嵌入的特征矩阵的行就是100万。但是列一般比较小,比如可以取20。这样每个用户ID就转化为了一个20维的特征向量。进而参与深度学习模型。在tensorflow中,我们可以先随机初始化一个特征嵌入矩阵,对于每个用户,可以在tf.nn.embedding_lookup找到该用户的特征嵌入向量。特征嵌入矩阵会在反向传播的迭代中优化。

此外,在自然语言处理中,我们也可以用word2vec将词转化为词向量,进而可以进行一些连续值的后继处理。

2.2.7 离散特征的离散化处理

离散特征有时间也不能直接使用,需要先进行转化。比如最常见的,如果特征的取值是高,中和低,那么就算你需要的是离散值,也是没法直接使用的。

对于原始的离散值特征,最常用的方法也是独热编码,方法在第三节已经讲到。

第二种方法是虚拟编码dummy coding,它和独热编码类似,但是它的特点是,如果我们的特征有N个取值,它只需要N-1个新的0,1特征来代替,而独热编码会用N个新特征代替。比如一个特征的取值是高,中和低,那么我们只需要两位编码,比如只编码中和低,如果是1,0则是中,0,1则是低。0,0则是高了。目前虚拟编码使用的没有独热编码广,因此一般有需要的话还是使用独热编码比较好。

此外,有时候我们可以对特征进行研究后做一个更好的处理。比如,我们研究商品的销量对应的特征。里面有一个原始特征是季节春夏秋冬。我们可以将其转化为淡季和旺季这样的二值特征,方便建模。当然有时候转化为三值特征或者四值特征也是可以的。

对于分类问题的特征输出,我们一般需要用sklearn的LabelEncoder将其转化为0,1,2,…这样的类别标签值。

2.2.8 连续特征的离散化处理

对于连续特征,有时候我们也可以将其做离散化处理。这样特征变得高维稀疏,方便一些算法的处理。

对常用的方法是根据阈值进行分组,比如我们根据连续值特征的分位数,将该特征分为高,中和低三个特征。将分位数从0-0.3的设置为高,0.3-0.7的设置为中,0.7-1的设置为高。

当然还有高级一些的方法。比如使用GBDT。在LR+GBDT的经典模型中,就是使用GDBT来先将连续值转化为离散值。那么如何转化呢?比如我们用训练集的所有连续值和标签输出来训练GBDT,最后得到的GBDT模型有两颗决策树,第一颗决策树有三个叶子节点,第二颗决策树有4个叶子节点。如果某一个样本在第一颗决策树会落在第二个叶子节点,在第二颗决策树落在第4颗叶子节点,那么它的编码就是0,1,0,0,0,0,1,一共七个离散特征,其中会有两个取值为1的位置,分别对应每颗决策树中样本落点的位置。在sklearn中,我们可以用GradientBoostingClassifier的 apply方法很方便的得到样本离散化后的特征,然后使用独热编码即可。

2.3 特征选择

2.3.1 特征的来源

特征一般有两个来源:一个是业务问题已经整理好的,需要我们针对具体的问题寻找需要的特征;另一种是根据业务特征去寻找高级数据特征。

2.3.2 选择合适的特征

我们首先看当业务已经整理好各种特征数据时,我们如何去找出适合我们问题需要的特征,此时特征数可能成百上千,哪些才是我们需要的呢?

第一步是找到该领域懂业务的专家,让他们给一些建议。比如我们需要解决一个药品疗效的分类问题,那么先找到领域专家,向他们咨询哪些因素(特征)会对该药品的疗效产生影响,较大影响的和较小影响的都要。这些特征就是我们的特征的第一候选集。

这个特征集合有时候也可能很大,在尝试降维之前,我们有必要用特征工程的方法去选择出较重要的特征结合,这些方法不会用到领域知识,而仅仅是统计学的方法。

最简单的方法就是方差筛选。方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。sklearn中的VarianceThreshold类可以很方便的完成这个工作。

特征选择方法有很多,一般分为三类:第一类过滤法比较简单,它按照特征的发散性或者相关性指标对各个特征进行评分,设定评分阈值或者待选择阈值的个数,选择合适特征。上面我们提到的方差筛选就是过滤法的一种。第二类是包装法,根据目标函数,通常是预测效果评分,每次选择部分特征,或者排除部分特征。第三类嵌入法则稍微复杂一点,它先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。类似于过滤法,但是它是通过机器学习训练来确定特征的优劣,而不是直接从特征的一些统计学指标来确定特征的优劣。下面我们分别来看看3类方法。

2.3.3 过滤法

  上面我们已经讲到了使用特征方差来过滤选择特征的过程。除了特征的方差这第一种方法,还有其他一些统计学指标可以使用。

   第二个可以使用的是相关系数。这个主要用于输出连续值的监督学习算法中。我们分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。

第三个可以使用的是假设检验,比如卡方检验。卡方检验可以检验某个特征分布和输出值分布之间的相关性。个人觉得它比比粗暴的方差法好用。在sklearn中,可以使用chi2这个类来做卡方检验得到所有特征的卡方值与显著性水平P临界值,我们可以给定卡方值阈值, 选择卡方值较大的部分特征。

除了卡方检验,我们还可以使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F检验的函数f_classif和f_regression,分别在分类和回归特征选择时使用。

第四个是互信息,即从信息熵的角度分析各个特征和输出值之间的关系评分。在决策树算法中我们讲到过互信息(信息增益)。互信息值越大,说明该特征和输出值之间的相关性越大,越需要保留。在sklearn中,可以使用mutual_info_classif(分类)和mutual_info_regression(回归)来计算各个输入特征和输出值之间的互信息。

以上就是过滤法的主要方法,个人经验是,在没有什么思路的 时候,可以优先使用卡方检验和互信息来做特征选择

2.3.4 包装法

选一个目标函数来一步步筛选特征。
最常用的包装法是递归消除特征法(recursive feature elimination,以下简称RFE)。递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。在sklearn中,可以使用RFE函数来选择特征。线性回归中常用到的逐步回归也是包装法。

2.3.5 嵌入法

最常用的就是L1正则化,L2正则化;正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。常用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。

此外也可以使用决策树、随机森林或者GBDT。那么是不是所有的机器学习方法都可以作为嵌入法的基学习器呢?也不是,一般来说,可以得到特征系数coef或者可以得到特征重要度(feature importances)的算法才可以做为嵌入法的基学习器。

2.3.6 寻找高级特征

  在我们拿到已有的特征后,我们还可以根据需要寻找到更多的高级特征。比如有车的路程特征和时间间隔特征,我们就可以得到车的平均速度这个二级特征。根据车的速度特征,我们就可以得到车的加速度这个三级特征,根据车的加速度特征,我们就可以得到车的加加速度这个四级特征。。。也就是说,高级特征可以一直寻找下去。

在Kaggle之类的算法竞赛中,高分团队主要使用的方法除了集成学习算法,剩下的主要就是在高级特征上面做文章。所以寻找高级特征是模型优化的必要步骤之一。当然,在第一次建立模型的时候,我们可以先不寻找高级特征,得到以后基准模型后,再寻找高级特征进行优化。

寻找高级特征最常用的方法有:

若干项特征加和: 我们假设你希望根据每日销售额得到一周销售额的特征。你可以将最近的7天的销售额相加得到。
  若干项特征之差: 假设你已经拥有每周销售额以及每月销售额两项特征,可以求一周前一月内的销售额。
  若干项特征乘积: 假设你有商品价格和商品销量的特征,那么就可以得到销售额的特征。
  若干项特征除商: 假设你有每个用户的销售额和购买的商品件数,那么就是得到该用户平均每件商品的销售额。

当然,寻找高级特征的方法远不止于此,它需要你根据你的业务和模型需要而得,而不是随便的两两组合形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。个人经验是,聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《特征工程入门与实践pdf》是一本介绍特征工程的教程书籍,旨在帮助读者深入了解特征工程的概念、原理和实践方法。 特征工程机器学习数据分析领域非常重要的一环,它涉及到特征选择、特征提取、特征创造和特征预处理等过程,对于提高模型的性能和准确度至关重要。 《特征工程入门与实践pdf》首先介绍了特征工程的基本概念,讲解了特征的种类和特征表达的重要性。接着,书详细介绍了常用的特征工程方法和技术,包括主成分分析(PCA)、线性判别分析(LDA)、特征选择方法(例如递归特征消除和互信息法)等。 此外,书还提供了大量的实际案例和示例,帮助读者理解特征工程的实际运用。通过这些案例,读者可以学习如何进行数据预处理、特征选择和特征创造,以及如何将特征工程应用于不同的机器学习模型。 总的来说,《特征工程入门与实践pdf》是一本非常实用的教材,适合想要学习和实践特征工程的读者。通过阅读本书,读者可以全面了解特征工程的基本知识,掌握常用的特征工程方法,并能够将其应用于实际问题,从而提高机器学习模型的性能和准确度。 ### 回答2: 《特征工程入门与实践pdf》是一本介绍特征工程的入门指南。特征工程是指通过数据预处理和特征选择等技术,从原始数据提取有效的特征,以支持机器学习模型的训练和预测。 该书主要分为三个部分:特征设计、特征提取和特征选择。在特征设计部分,书详细介绍了特征的定义、类型和重要性。读者可以学习如何根据问题的需求和数据的特点,设计合适的特征。 在特征提取部分,书介绍了各种常用的特征提取方法,如数值型特征处理、文本特征处理和图像特征处理等。读者可以学习如何将原始数据转化为机器学习算法可以处理的特征表示。 在特征选择部分,书详细介绍了常用的特征选择方法,如过滤式特征选择、包装式特征选择和嵌入式特征选择等。读者可以学习如何选择最具代表性和预测能力的特征子集,以减少特征空间的维度和计算复杂度。 此外,该书还提供了大量的实际案例和示例,帮助读者理解和应用特征工程技术。读者可以通过实践来巩固所学知识,并将其应用于自己的问题。 总的来说,《特征工程入门与实践pdf》通过系统地介绍特征工程的基本理论和实践方法,为读者提供了一本很好的入门指南。无论是初学者还是有一定基础的人员,都可以通过阅读该书来提升自己在特征工程方面的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值