【机器学习】特征工程快速入门

重点:特征预处理、特征提取、特征选择和特征降维
特征预处理:数据清洗、归一化、标准化
特征提取:特征离散化、哑编码、独热编码、词袋法、TF-IDF
特征选择:过滤、包装、嵌入选择法
特征降维:PCA、LDA
特征工程.png

特征工程概述

  • 所有一切为了让模型效果变的更好的数据处理方式都可以认为属于特征工程这个范畴中的一个操作;
  • 至于需求做不做这个特征工程,需要我们在开发过程中不但的进行尝试。
  • 常规的特征工程需要处理的内容:
    • 异常数据的处理 删除、填充
    • 数据不平衡处理
    • 文本处理:词袋法、TF-IDF
    • 多项式扩展、哑编码、标准化、归一化、区间缩放法、PCA、特征选择…
    • 将均值、方差、协方差等信息作为特征属性,对特征属性进行对数转换、指数转换…
    • 结合业务衍生出一些新的特征属性…

特征工程介绍

为什么需要特征工程(Feature Engineering)

  • 机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. ‘Applied machine learning’ is basically feature engineering. ”

处理特征是困难的,耗时的,需要专业知识。'将它应用机器学习’是特征工程的基础。

  • 业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

什么是特征工程

  • 特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
  • 意义:会直接影响机器学习的效果

特征工程步骤

特征预处理

特征预处理包括数据清洗、归一化和标准化。

数据清洗

数据清洗(data learning)是数据预处理的一个步骤,指的是对原始数据进行处理和筛选,以去除无用、重复、错误、缺失或不一致的数据,从而获得干净、可靠、一致的数据集。
数据清洗是数据分析和机器学习的重要步骤,因为原始数据往往存在许多问题,如缺失值、重复值、异常值、不一致的格式等等,这些问题会影响到后续分析和建模的准确性和可靠性。因此,在对数据进行分析和建模之前,需要对原始数据进行清洗,以确保数据的质量和准确性。在实际的工作中,数据清洗通常占开发过程的30%-50%左右的时间。

数据清洗步骤
预处理

在数据预处理过程主要考虑两个方面,如下:

  • 选择数据处理工具:关系型数据库或者Python
  • 查看数据的元数据以及数据特征:一是查看元数据,包括字段解释、数据来源等一切可以描述数据的信息;另外是抽取一部分数据,通过人工查看的方式,对数据本身做一个比较直观的了解,并且初步发现一些问题,为之后的数据处理做准备。
格式内容错误数据清洗

一般情况下,数据是由用户/访客产生的,也就有很大的可能性存在格式和内容上不一致的情况,所以在进行模型构建之前需要先进行数据的格式内容清洗操作。格式内容问题主要有以下几类:

  • 时间、日期、数值、半全角等显示格式不一致:直接将数据转换为一类格式即可,该问题一般出现在多个数据源整合的情况下。
  • 内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况下,需要以半自动校验加半人工方式来找出问题,并去除不需要的字符。
  • 内容与该字段应有的内容不符:比如姓名写成了性别、身份证号写成手机号等问题。
逻辑错误清洗

主要是通过简单的逻辑推理发现数据中的问题数据,防止分析结
果走偏,主要包含以下几个步骤:

  • 数据去重
  • 去除/替换不合理的值
  • 去除/重构不可靠的字段值(修改矛盾的内容)
去除不需要的数据

一般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应用到模型构建过程的,也不是说将所有的字段属性都放到构建模型中,最终模型的效果就一定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有时候可以考虑将不要的字段进行删除操作。在进行该过程的时候,要注意备份原始数据。

关联性验证

如果数据有多个来源,那么有必要进行关联性验证,该过程常应用到多数据源合并的过程中,通过验证数据之间的关联性来选择比较正确的特征属性,比如:汽车的线下购买信息和电话客服问卷信息,两者之间可以通过姓名和手机号进行关联操作,匹配两者之间的车辆信息是否是同一辆,如果不是,那么就需要进行数据调整。

数据清洗案例:数据缺省值填充
  • python科学计算库
  • from sklearn.impute import SimpleImputer
    • 均值填充 statistic=‘mean’
    • 中值填充 statistic=‘median’
    • 众数填充 statistic=‘most_fraquent’

归一化和标准化

  • 为什么我们要进行归一化/标准化?

特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标效果,使得一些算法无法学习到其他的特征
我们需要用到一些方法进行去量纲化,是的不同规格的数据转换到统一规格

归一化
  • 通过对原始数据进行变换把数据映射到(默认为[0,1])之间

X ′ = x − m i n m a x − m i n X ′ ′ = X ′ ⋅ ( m x − m l ) + m l X' = \frac{x-min}{max-min} \quad\quad X''=X'\cdot(mx-ml)+ml X=maxminxminX′′=X(mxml)+ml
image.png

  • 思考:如果数据中异常点较多,会有什么影响?

image.png
注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景

标准化

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
X ′ = x − m e a n σ X'=\frac{x-mean}{σ} X=σxmean

思考:能解决归一化存在的问题吗? 可以

• 回到刚才异常点的地方,我们再来看看标准化
image.png

对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

• 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

特征提取

• 将任意数据(如文本或图像)转换为可用于机器学习的数字特征
• 字典特征提取(特征离散化)
• 文本特征提取
• 图像特征提取【一般图片本身就是个数组数据】

字典特征提取(特征离散化)

  • 对字典数据进行特征值化

DictVectorizer是scikit-learn库中的一个类,用于将字典形式的特征数据转换为数值特征向量。它通常用于处理具有非数值特征的数据,例如分类任务中的文本数据或类别数据。
使用DictVectorizer可以将字典形式的特征数据转换为稀疏或密集的数值特征向量表示。它将每个特征的不同取值映射到一个唯一的整数索引,并根据特征的取值将其转换为二进制特征表示,其中1表示特征存在,0表示特征缺失。

image.png

One-Hot(独热编码)

image.png

文本特征提取

  • 中文jieba分词处理
    • pip3 install jieba
    • jieba是一个中文分词工具,用于将中文文本切分成词语。它是基于Python的开源库,具有简单易用、高效准确的特点
  • 词袋法
  • TF-IDF
词袋法

词袋法(Bag-of-Words)是一种常用的文本特征提取方法,主要用于文本分类、情感分析、信息检索等自然语言处理任务。其基本思想是将文本中的单词或词组作为特征,构建一个词汇表,并统计每个文本中词汇表中词语的出现次数或出现的概率,然后将这些统计信息作为特征向量表示文本。

需要注意的是,词袋法忽略了词语的顺序和语法结构,只关注词语的出现与否,因此无法捕捉到词语之间的语义关系。在处理较长的文本时,词袋法还可能面临维度灾难的问题,需要采取一些降维方法来处理。

词袋法用处

词袋法的用处:

  1. 文本分类:通过将文本转化为词袋模型,可以将文本表示为向量形式,从而应用各种机器学习算法进行文本分类任务。
  2. 情感分析:通过统计文本中正面和负面情感词的出现次数,可以判断文本的情感倾向。
  3. 信息检索:通过构建文本的词袋模型,可以将用户输入的查询语句与文本库中的文本进行匹配,从而实现信息检索。
词袋法用法:
  1. 构建词汇表:首先需要构建一个词汇表,将文本中出现的所有单词或词组加入到词汇表中。
  2. 统计词频:对于每个文本,统计词汇表中每个词语的出现次数或出现的概率,得到一个特征向量。
  3. 特征向量表示:将每个文本表示为一个特征向量,其中每个维度表示词汇表中的一个词语在文本中的出现次数或概率。
  4. 应用机器学习算法:将特征向量作为输入,应用各种机器学习算法进行文本分类、情感分析等任务。

在处理文本数据时,TfidfVectorizer和CountVectorizer都是常用的文本特征提取方法,而TfidfTransformer则通常用于对已有的词频矩阵进行TF-IDF转换。它们都可以讲文本转换为数值向量。

词袋法与TF-IDF的联系与区别

词袋法(Bag-of-Words,简称BoW)是一种将文本特征表示为词频向量的方法。在词袋法中,文本被看作是一个无序的词集合,每个文本可以表示为一个固定长度的向量,向量中的每个元素表示一个词在文本中出现的次数。
TF-IDF(Term Frequency-Inverse Document Frequency)则是一种用于衡量词语在文本集合中的重要性的方法。在TF-IDF中,每个词的重要性由它在当前文档中的频率(Term Frequency,简称TF)以及它在整个文本集合中出现的文档频率的倒数(Inverse Document Frequency,简称IDF)共同决定。因此,TF-IDF可以用来计算每个词在文本中的重要性,并将文本表示为一个向量,其中每个元素表示一个词的TF-IDF值。
可以将词袋法看作是TF-IDF方法中只考虑了词频而没有考虑逆文档频率的一种特殊情况。在实际应用中,TF-IDF通常比词袋法更有效,因为它能够在保留每个词在文本中重要性的同时,对常见词语的权重进行抑制,减少它们对文本特征的影响。

特征降维

  • 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
  • 正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大
  • 降维的两种方式
    • 特征选择
    • 主成分分析(可以理解一种特征提取的方式)

特征选择

  • 数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。

image.png
特征选择的方法主要有以下三种:

  • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,从而选择特征;常用方法包括方差选择法、相关系数法、卡方检验、互信息法等。
  • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征或者排除若干特征;常用方法主要是递归特征消除法。
  • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权重系数,根据系数从大到小选择特征;常用方法主要是基于惩罚项的特征选择法。
特征选择-方差选择法
  • 方差选择法:一种基于方差的特征选择方法,其主要思想是选取方差大于某个阈值的特征。具体地,我们可以计算每个特征的方差,然后选取方差大于某个阈值的特征。该方法适用于二分类问题,对于多分类问题需要进行修改。

image.png

特征选择-相关系数法
  • 相关系数法:先计算各个特征属性对于目标值的相关系数以及阈值K,然后获取K个相关系数最大的特征属性。(备注:根据目标属性y的类别选择不同的方式)

image.png

特征选择-卡方检验
  • 卡方检验:检查定性自变量对定性因变量的相关性。 χ 2 = ∑ ( A − E ) 2 E \chi^2=\sum{\frac{(A-E)^2}{E}} χ2=E(AE)2

image.png

特征选择-递归特征消除法
  • 递归特征消除法:使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。

image.png

特征选择 嵌入法-基于惩罚项的特征选择法
  • 使用基于惩罚项的基模型,进行特征选择操作。

image.png

特征降维

当特征选择完成后,可以直接可以进行训练模型了,但是可能由于特征矩阵过大,导致计算量比较大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了基于L1的惩罚模型外,还有主成分析法(PCA)和线性判别分析法(LDA),这两种方法的本质都是将原始数据映射到维度更低的样本空间中;但是采用的方式不同,PCA是为了让映射后的样本具有更大的发散性,PCA是无监督的学习算法,LDA是为了让映射后的样本有最好的分类性能,LDA是有监督学习算法。

PCA(主成分分析)

主成分分析(PCA):将高维的特征向量合并成低维度的特征属性,是一种无监督的降维方法。
image.png
在PCA降维中,数据从原来的坐标系转换为新的坐标系,新坐标系的选择由数据本身的特征决定。第一个坐标轴选择原始数据中方差最大的方向(从统计角度讲,这个方向是最重要的方向)。第二个坐标轴的方向选择和第一个坐标轴垂直或者正交(通过计算协方差);第三个坐标轴选择和第一个、第二个坐标轴都垂直或者正交的方向;该过程一直重复,直到新坐标系的维度和原始坐标系维度数目一致的时候结束计算。而这些方向所表示的数据特征就被称为"主成分"。
image.png

image.png
特征选择是直接从原来的n个特征中选出K个出来。这K个还是原来的特征。
PCA降维,就是经过坐标轴的旋转,把数据投影到新的坐标空间,新的数据必须是方差最大化的。经过PCA降维之后,数据中不会再有重复的列了。可以直接选择前K个。而特征选择还要用到过滤、包装或嵌入来选出K个特征。

比如说有一个X(mxn)[m行数据n个特征]的矩阵。从直观上来讲,PCA就是对X进行矩阵变换

PCA的是一种丢失原始数据信息最少的无监督线性降维方式。
什么时候用PCA呢?

一个是数据存在共线性,需要对数据进行共线性的消除,这方面与SVD很像。
但他最重要的功能是降低数据维度,提升计算效率。

PCA原理

PCA(Principal Component Analysis)是常用的线性降维方法,一种无监督的降维算法。算法目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,并且期望在所投影的维度上数据的方差最大(最大方差理论),以此使用较少的数据维度,同时保留较多的原数据点的特性。
通俗来讲的话,如果将所有点映射到一起,那么维度一定降低下去了,但是同时也会将几乎所有的信息(包括点点之间的距离等)都丢失了,而如果映射之后的数据具有比较大的方差,那么可以认为数据点则会比较分散,这样的话,就可以保留更多的信息。从而我们可以看到PCA是一种丢失原始数据信息最少的无监督线性降维方式。

SVD(奇异值分解)

SVD(奇异值分解)是一种矩阵分解的方法,广泛应用于数据降维、特征提取、推荐系统等领域。请灵活地使用SVD来解决各种数据分析和建模问题。
SVD(奇异值分解)和PCA(主成分分析)之间有密切的关系。PCA可以被看作是SVD的一种特殊情况。
具体来说,PCA是一种用于降维的数据分析方法,它通过线性变换将原始数据投影到一个新的低维空间中。而SVD是一种矩阵分解的方法,它将一个矩阵分解为三个矩阵的乘积:U、S和V^T,其中U和V是正交矩阵,S是一个对角矩阵。
在PCA中,我们可以使用SVD来进行计算。具体来说,假设我们有一个数据矩阵X,其中每一行表示一个样本,每一列表示一个特征。我们可以对X进行SVD分解,得到U、S和V^T。然后,我们可以选择保留前k个奇异值和对应的左奇异向量,将其作为新的特征空间。这相当于对原始数据进行了降维,并且保留了最重要的特征。
因此,可以说PCA是SVD的一种特殊情况,它利用了SVD分解的结果来进行降维。

SVD的用处:

  1. 数据降维:SVD可以将高维数据降低到低维空间,保留数据的主要信息。这在处理高维数据和减少计算复杂度时非常有用。
  2. 特征提取:SVD可以提取数据中的重要特征,从而减少数据的冗余信息。这对于特征工程和模型训练非常有帮助。
  3. 推荐系统:SVD可以用于基于协同过滤的推荐系统中,通过对用户-物品评分矩阵进行分解,得到用户和物品的隐向量表示,从而进行个性化推荐。
  4. 图像压缩:SVD可以将图像矩阵分解为低秩的近似矩阵,从而实现图像的压缩和存储。
  5. 数据恢复:SVD可以对损坏或缺失的数据进行恢复,通过填补缺失值或修复损坏数据,得到完整的数据集。

SVD的使用步骤一般包括以下几个步骤:

  1. 对数据进行预处理,如去均值化或归一化等。
  2. 对数据矩阵进行SVD分解,得到奇异值(奇异值是特征值的平方根)、左奇异向量和右奇异向量。
  3. 根据需要选择保留的奇异值和对应的奇异向量,进行数据降维或特征提取。
  4. 根据降维后的数据进行后续的分析、建模或应用。

需要注意的是,SVD的计算复杂度较高,对于大规模数据集可能会面临计算资源和时间的挑战。因此,在实际应用中,可以使用近似的SVD方法或其他更高效的矩阵分解方法来处理大规模数据。

代码示例

这段代码首先创建了一个数据矩阵data,然后使用np.linalg.svd函数对数据矩阵进行SVD分解,得到奇异值s、左奇异向量U和右奇异向量VT。接着,可以选择保留的奇异值和对应的奇异向量,这里选择保留前2个奇异值和对应的奇异向量。最后,通过将保留的奇异值和奇异向量相乘,得到重构后的矩阵data_reconstructed。

import numpy as np

# 创建一个数据矩阵
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 对数据矩阵进行SVD分解
U, s, VT = np.linalg.svd(data)

# 打印奇异值数组、左奇异向量矩阵和右奇异向量矩阵
print('奇异值:', s)
print('左奇异值:', U)
print('右奇异值:', VT)

# 选择保留的奇异值和对应的奇异向量
k = 2
s_k = s[:k]
U_k = U[:, :k]
VT_k = VT[:k, :]

# 重构原始矩阵

data_reconstructed = U_k.dot(np.diag(s_k)).dot(VT_k)

# 打印重构后的矩阵
print('重构后的矩阵:', data_reconstructed, sep='\n')

SVD分解的内部计算过程比较复杂,涉及到矩阵的特征值和特征向量计算、奇异值的计算等。
下面是SVD分解的详细计算过程:

  1. 给定一个m x n的矩阵A,计算A的转置矩阵A^T。
  2. 计算A和AT的乘积AAT,得到一个m x m的对称矩阵。
  3. 对对称矩阵AA^T进行特征值分解,得到特征值和对应的特征向量。将特征值按照从大到小的顺序排列,特征向量也按照相同的顺序排列在一个m x m的矩阵U中。
  4. 计算AT和A的乘积ATA,得到一个n x n的对称矩阵。
  5. 对对称矩阵A^TA进行特征值分解,得到特征值和对应的特征向量。将特征值按照从大到小的顺序排列,特征向量也按照相同的顺序排列在一个n x n的矩阵V中。
  6. 计算A的奇异值,奇异值是特征值的平方根,按照从大到小的顺序排列在一个长度为min(m, n)的向量s中。
  7. 根据奇异值和特征向量,可以得到矩阵U和V的前k列,其中k是希望保留的奇异值的数量。
  8. 重构原始矩阵A,通过将矩阵U的前k列、对角矩阵diag(s)和矩阵V的前k行相乘,得到一个近似的A的重构矩阵A’。
LDA(线性判别分析)

LDA(Linear Discriminant Analysis,线性判别分析)是一种有监督学习算法。
LDA的原理是,将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况,相同类别的点,将会在投影后的空间中更接近。用一句话概括就是:“投影后类内方差最小,类间方差最大”。
image.png
image.png
image.png

PCA和LDA的异同

PCA(Principal Component Analysis)和LDA(Linear Discriminant Analysis)是两种常用的降维技术,它们有一些相似之处,但也存在一些显著的差异。
相同点:

  1. 降维目的:PCA和LDA都旨在将高维数据映射到低维空间,以便更好地表示数据的结构和特征。

不同点:

  1. 目标:PCA是一种无监督学习方法,它通过最大化数据的方差来选择新的特征空间,以保留尽可能多的信息。而LDA是一种有监督学习方法,它旨在选择能够最好地区分不同类别的特征,以提高分类性能。
  2. 数据标签使用:PCA不考虑数据的标签信息,只关注数据的整体结构。而LDA利用数据的标签信息,通过最大化类间距离和最小化类内距离的方式选择特征。
  3. 维度选择:PCA通过保留方差最大的特征来选择降维后的维度。而LDA则通过计算类间散布矩阵和类内散布矩阵,从而选择最能区分不同类别的特征。
  4. 数据分布假设:PCA对数据分布没有假设,适用于线性和非线性数据。而LDA假设数据服从高斯分布,并且类别之间的协方差相等。
  5. 适用场景:PCA适用于无监督学习任务,如特征提取、数据可视化等。而LDA适用于有监督学习任务,如分类、模式识别等。

总结来说,PCA和LDA都是常用的降维技术,但其目标、使用的数据标签信息、维度选择方法、数据分布假设和适用场景等方面存在差异。选择使用哪种方法应根据具体的任务需求和数据特点来决定。
image.png

总结

在实际的机器学习项目中,特征选择/降维是必须进行的,因为在数据中存在以下几个方面的问题:

  • 数据的多重共线性:特征属性之间存在着相互关联关系。多重共线性会导致解的空间不稳定,从而导致模型的泛化能力弱;
  • 高纬空间样本具有稀疏性,导致模型比较难找到数据特征;
  • 过多的变量会妨碍模型查找规律;
  • 仅仅考虑单个变量对于目标属性的影响可能忽略变量之间的潜在关系。

通过降维的目的是:

  • 减少特征属性的个数
  • 确保特征属性之间是相互独立的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值