机器学习-数据预处理&特征工程
数据预处理:
- 数据的无量钢化可以是线性的, 叶可以是非线性的, 线性的无量钢化包括中心化处理和缩放处理
- 中心化: 本质是让所有的记录减去一个固定值, 即让数据样本平移到某个位置, 缩放的本质是通过除以一个固定在某个范围中, 取对数也是一种缩放处理
- 归一化: 当数据(x)按照最小化后, 在按极差(最大值-最小值)缩放, 数据移动了最小个单位, 并且会被收敛到[0.1]之间, 而这个过程,就叫做归一化, 归一化的数据服从正态分布
- x* = [x - min(x)] / [max(x) - min(x)]
- 标准化: 当数据(x)按均值(μ)中心化后, 在按标准差(σ)缩放, 数据就会服从均值为0, 方差为1的正态分布(即标准正太分布, 而这个过程, 就叫做数据标准化)
- x* = (x-μ) / σ
无量钢化 | 功能 | 中心化 | 缩放 | 详解 |
StandardScaler | 标准化 | 均值 | 方差 | 通过减掉均值并将数据缩放到单位方差来标准化特征, 标准化完毕后的特征服从正态分布 即方差为1, 均值为0 |
MinMaxScaler | 归一化 | 最小值 | 极差 | 通过最大值最小值将每个特征缩放到给定范围, 默认[0,1] |
MaxAbsScaler | 缩放 | N/A | 最大值 |
通过让每一个特征里的数据, 除以该特征中绝对值最大的数值的绝对值, 将数据压缩到[-1,1]之间, 这种做法并没有 中心化数据, 因此不会破坏数据的稀疏性, 数据的稀疏性是指, 数据中包含0的比例, 0越多, 数据越稀疏 |
RobusScaler | 无量钢化 | 中位数 | 四分位数范围 |
使用可以处理异常值, 对异常值不敏感的统计量来缩放数据 这个缩放器删除中位数并根据百分位数范围缩放数据,IQR是第一分位数(25%), 和第三分位数(75%)之间的范围, 数据集的标准化是通过去除均值, 缩放到单位方差来完成, 但是异常值通常会对样本的均值和方差造成负面影响, 当异常值很多,噪声很大时, 用中位数和四分位数范围通常会产生更好的效果 |
Normalizer | 无量钢化 |
N/A |
sklearn中未明确, 依范数原理 L1: 样本向量的长度/样本中每个元素绝对值的和 L2: 样本向量的长度/样本中每个元素的欧式距离 |
将样本独立缩放到单位范数,每个至少带一个非0值的样本都会被地理缩放,使得整个样本(整个向量)的长度都为L1范数, 或L2范数,这个类可以处理 秘籍数组(numpy arrays)或scipy中的稀疏矩阵(scipy.sparse), 如果你希望避免复制转换过程中的负担,请使用CSR格式的矩阵,将输入的矩阵缩放 到单位范数时文本分类和聚类中常见的操作,例如,两个L2正则化后的TF-IDF向量的点积是向量余弦相似度, 并且是信息检索社区常用的向量空间模型的 基本相似性度量, 使用参数Norm来确定正则化的范数方向,可以选择L1, L2, max三种选项,默认L2范数, 这个评估器接口, 什么也不做, 但在管道中使用依然很有用 |
Power Transformer |
无线性 无量钢化 |
N/A | N/A |
应用特征功率变换使数据更接近正态分布, 功率变换是一系列单调变换, 用于使数据更像高斯,着对于建模与异方差性或其他需要正态性的情况,相关问题非常有用, 要求输入的数据严格为正, power_transform()通过最大似然估计来稳定方差和并确定最小化偏度的最佳参数, 默认情况下,标准化应用于转化后的数据 |
Quantile Transform |
无线性 无量钢化 |
N/A | N/A | 使用百分位数转换特征, 通过缩小边缘异常值和非异常值之间的距离来提供特征的非线性变换, 可以使用参数, ouput_distribution='normal',来将数据映射到标准正太分布上 |
KernelCenterer | 中心化 | 均值 | N/A |
将矩阵中心化, 设K(x,z)是由phi(x)Λphi(z)定义的核, 其中phi是将x映射到希尔伯特空间的函数, KernelCenterer在不明确计算phi(x)的情况下,让数据中心化均值为0, 它相当于使用sklearn.preprocessing.StandardScaler(with_std=False)来将phi(x)中心化 |
编码与哑变量
- 为了让数据适应算法和库, 我们必须将数据进行编码. 即, 将文字型数据转换为数值型
- preprocessing.LabelEncoder: 标签专用, 能够将分类转换未分类数值
- preprocessing.OrdinalEncoder: 特征专用, 能够将分类特征转换为数值
- preprocessing.OneHotEncoder: 独热编码, 创建哑变量
- 三种取值S,C,Q是相互独立的, 彼此之间完全没有联系, 表达的是S≠C≠Q的概念, 这是名义变量
- 三种取值不完全独立的, 在性质上可以由高中>初中>小学这种联系的, 学历由高低, 但是学历之间是不可以进行计算, 不能说小学+某个值=初中, 这种是有序变量
- 各个取值之间由联系,且是可以相互计算出来的,比如:120kg - 45kg = 75kg,分类之间可以通过数学计算相互转换的, 这是有距变量
数据类型 | 数据名称 | 数学含义 | 描述 | 举例 | 可用操作 |
离散, 定性 | 名义 | =.≠ | 名义变量就是不同的名字, 是用来告诉我们, 这两个数据是否形同的 | 邮编, 性别, 眼睛的颜色, 职工号 | 众数, 信息熵, 情形分析表或列联表,相关性分析, 卡方检验 |
离散, 定性 | 有序 | <,> |
有序变量未数据相对大小提供信息, 告诉我们数据的顺序, 但数据之间大小的 间隔不是具有固定意义的, 因此有序变量不能加减 |
材料的硬度, 学历 |
中位数, 分位数, 非参数相关分析(等级相关), 测量系统分析, 符号检验 |
连续, 定量 | 有距 | +, - | 有距变量之间的间隔是由固定意义的, 可以加减, 比如: 一单位量纲 | 日期, 以摄氏度或华氏度为量纲的温度 | 均值, 标准差, 皮尔逊相关系数, t和f检验 |
连续, 定量 | 比率 | *,/ | 比变量之间的间隔和比例本身都是具有意义的, 既可以加减又可以乘除 | 以开尔文未量纲的温度, 货币数量, 计数, 年龄, 质量,长度,电流 | 几何平均, 调和平均, 百分数, 变化量 |
二值化于分段:
- 根据阈值将数据二值化(将特征设置未0或1),用于处理连续型变量, 大于阈值的值映射未1, 而小于或等于阈值的值映射为0, 默认阈值为0时, 特征中所有的正值都映射到1, 二值化是对文本计数数据的常见操作, 分析人员可以决定仅考虑某种现象使得存在与否, 它可以用考虑布尔随机变量的估计器的预处理步骤(例如: 使用贝叶斯设置中的伯努利分布建模)
- preprocessing.KBinsDiscretizer: 这是将连续型变量划分为分类变量的类, 能够将连续型变量排序后按顺序分项后编码
参数 | 含义&输入 |
n_bins | 每个特征中分箱的个数, 默认是5, 一次会被运用到所有导入的特征 |
encode |
编码的方式, 默认是"onehot" "onehot": 做哑变量, 之后返回一个稀疏矩阵, 每一列是一个特征中的一个类别, 含有该类别的样本表示为1, 不含的表示为0 "ordinal": 每个特征的每个箱都被编码为一个整数, 返回每一列是一个特征, 每个特征下含有不同整数编码的箱的矩阵 "onehot-dense": 做哑变量, 之后返回一个密集数组 |
stratrgy |
用来定义箱宽的方式, 默认"quantile" "uniform": 表示等宽分箱, 即每个特征中的每个箱的最大值之间的差为(特征.max() - 特征.min()) / (n_bins) "quantile": 表示等位分箱, 即每个特征中每个箱内的样本数量都相同 "kmeans": 表示聚类分箱, 每个箱中的值到最近一维k均值聚类的簇心的距离都相同 |
特征选择feature_selection: 当我们数据预处理完后, 就要开始特征工程
特征提取(feature_extraction) | 特征创造(feature_creation) | 特征选择(feature_selection) |
从文字, 图片,声音等其他非结构化数据中 提取信息作为特征, 比如: 从淘宝宝贝名称中提取产品类别 ,产品颜色, 是否是网红产品等等 |
把现有特征进行组合, 或互相计算, 得到新的特征 比如: 我们由一列特征是速度, 一列特征是距离, 我们就可以通过让两列 相除, 创造出心的特征, 通过距离所花的时间 |
从所有的特征中, 选择出有意义, 对模型由帮助的特征, 以避免必须将所有特征都导入模型取训练 |
Filter过滤法:
- 过滤方法通常用作预处理步骤, 特征选择完全独立于任何机器学习算法, 他是根据各种统计检验中的分数以及相关性的各项指标来选择特征
- 方差过滤: 通过特征本身的方差来筛选特征的类, 比如, 一个特征的方差很小, 就表示样本在这个特征基本没有差异, 可能特征中的大多数值都一样, 甚至整个特征的取值都相同,那这个特征对于样本区分没什么用, 所以无论接下来的特征工程要做什么, 都要有限消除方差为0的特征
- 当特征是二分类时, 特征的取值就是伯努利随机变量, 这些变量的方差可以计算为:
- var[x] = p(1-p)
- 其中x是特征矩阵, p是二分类特征中所占的概率
- 方差过滤对模型的影响:
- 过滤法的主要目的是: 在维持算法表现的前提下, 帮助算法们降低计算成本
- 传统决策树需要遍历所有特征, 计算不纯度后进行分枝没而随机森林却是随机选择特征进行计算和分枝, 因此随机森林的运算更快, 过滤法对随机森林无用, 对决策树却有用
阈值很小 被过滤掉的特征比较少 |
阈值比较大 被过滤掉的特征有很多 |
|
模型表现 | 不会有太大影响 |
可能变更好, 代表被过滤掉的特征大部分是噪音, 也可能变糟, 代表被过滤掉的特征中很多都是有效特征 |
运行时间 |
可能那个降低模型的运行时间, 基于方差很小的特征有多少 当方差很小的特征不多时, 对模型没有太大影响 |
一点过能够降低模型运行的时间,算法在遍历特征的计算越复杂, 运行时间下降得越多 |
*过滤法对随机森林无效(效果不明显), 对树模型有效(效果显著)?
- 从算法原理上来说, 传统决策树需要遍历所有特征, 计算不纯度后进行分枝, 而随机森林却是随机选择特征进行计算和分枝, 因此随机森林得运算更快, 过滤法对随机森林无用, 对决策树有用
- 在sklearn中, 随机森林中得没颗树比单独得一颗决策树简单得多, 高维数据下得随机森林得计算比决策树快的多
阈值很小 被过滤掉得特征比较少 |
阈值比较大 被过滤掉得特征有很多 |
|
模型表现 | 不会有太大影响 |
可能变更好, 代表被过滤掉得特征大部分是噪音 也可能变糟糕, 代表被过滤掉得特征中很多都是有效特征 |
运行时间 |
可能降低模型得运行时间, 基于方差很小得特征有多少 当方差很小得特征不多时, 对模型没有太大影响 |
一定能够降低模型得运行时间, 算法在遍历特征时,计算越复杂 运行时间下降得越多 |
相关性过滤:
- 卡方检验: 卡方过滤时专门针对离散型标签得相关过滤, 卡方检验类, 计算每个非负特征和标签之间得卡方统计量, 并依照卡方统计量由高到低为特征排名, 再结合feature_selection.SelectKBest这个可以输入"评分标准"来选出前k个分数最高得特征得类, 这样可以区分开与分类标签无关得特征
- 卡方检验得本质时推测两组数据之间得差异, 其检验得原假设时"两组数据时相互独立得", 卡方检验返回卡方值和p值两个统计量, 其中卡方值很难界定有效范围, 而p值, 我们一般使用0.01和0.05作为显著性水平, 即p值判断边界(其中0.01,0.05是卡方计算而来得U和Uα/2比较, t和tα/2比较)
P值 | <=0.05或0.01 | >0.05或0.01 |
数据差异 | 差异不是自然形成的 | 这些差异时很自然得样本误差 |
相关性 | 两组数据时相关的 | 两组数据时相互独立得 |
原假设 | 拒绝原假设,接受备择假设 | 接受原假设 |
- F检验: 有称ANOVA, 方差齐性检验,是用来捕捉每个特征与标签之间的线性关系得过滤方法, 它即可以做回归, 也可以做分类, 因此包含feature_selection.f_classif(F检验)和feature_selection.f_regression(F检验回归)两个类, 其中F检验分类用于标签时离散型变量得数据, 而F检验回归用于标签连续型变量得数据
- F检验在数据服从正态分布时效果会非常稳定, 因此如果使用F检验过滤, 我们会将数据转换成服从正态分布得方式
- F检验得本质是寻找两组数据之间得线性关系, 其原假设时"数据不存在显著得线性关系".它返回F值和P值两个统计量, 和卡方一样, 希望选取P值小于0.05或0.01的特征, 这些特征与标签是显著相关得, 而p值大于0.05或0.01得特征则被我们认为时和标签没有显著线性关系得特征, 应该被剔除
- 互信息法:互信息法时迎来捕捉每个特征与标签之间得任意关系(包括线性关系和非线性关系)得过滤方法,和F检验相似, 它即可以做回归也可以做分类, (feature_selection.mutual_info_classif互信息分类和feature_selection.mutual_info_regression互信息回归). 这两个类得用法和参数都和F检验一模一样, 不过互信息法比F检验更强大, F检验只能后找出线性关系, 而互信息法可以找出任意关系
- 互信息法不返回p值或F值类似得统计量, 它返回"每个特征与目标之间得互信息量得估计", 这个估计量在[0,1]之间取值, 为0则表示两个变量独立, 为1则表示两个变量完全相关
类 | 说明 | 超参数得选择 |
VarianceThreshold | 方差过滤, 颗输入方差阈值, 返回方差大于阈值得新特征矩阵 |
看具体数据究竟时含有更多噪声还是更多有效特征 一般就使用画曲线或取中位数泡模型来帮助确认 |
SelectKBest | 用来选取K个统计量结果最佳得特征, 生成符合统计量要求得新特征矩阵 | 看配合使用得统计量 |
chi2 | 卡方检验, 专用于分类算法, 捕捉线性相关性 | 追求p小于显著性水平得特征 |
f_Classif | F检验分类, 只能捕捉线性相关要求数据服从正态分布 | 追求p小于显著性水平得特征 |
f_regression | F检验回归, 只能捕捉线性相关性, 要求数据服从正态分布 | 追求p小于显著性水平得特征 |
mutual_info_classif | 互信息分类, 可以捕捉任何相关性, 不能用于稀疏矩阵 | 追求互信息估计大于0得特征 |
mutual_info_regression | 互信息回归, 可以捕捉任何星官行不能用于稀疏矩阵 | 追求互信息估计大于0得特征 |
Embedded嵌入法
- feature_selection.SelectFormModel
- feature_selection.SelectFormModel手机哦一个元变换器, 可以与任何拟合后具有cofe_, feature_importances_属性或参数中可惩罚项得评估器一起使用
参数 | 说明 |
estimator | 使用得模型评估器, 只要是带着feature_importances_或者coef_属性, 或带有L1和L2惩罚项得模型都可以使用 |
threshold | 特征重要性得阈值, 重要性低于这个阈值得特征都将被删除 |
prefit |
默认时False,判断时否将实例化后得模型直接传递给构造函数.如果时True, 则必须直接调用fit和transform,不能使用 fit_transform, 并且SelectFormModel不能与cross_val_score, GridSearchCV和克隆估计器得类似使用程序一起使用 |
norm_order |
k可输入非零整数, 正无穷, 负无穷, 默认值为1, 在评估器得coef_属性高于一维得情况下, 用于过滤低于阈值得系数得向量 得范数得阶数 |
max_feature |
在阈值设定下, 要选择得最大特征数, 要禁用阈值并仅根据max_feature选择, 请设置threshold=-np.inf |
wrapper包装法:
- 包装法也是一个特征选择和算法训练同时进行得方法, 与嵌入法类似, 它时依赖算法自身得选择, 比如coef_或feature_importances_lai xuanze , 但不同的是, 包装法在初始特征集上训练评估器, 并且通过coef_和importances_属性获得每个特征, 包装法要使用特征子集进行多次训练, 因此它所需要得计算成本时最高的
- 包装法的特点:它比嵌入法缓慢, 所以不实用太大型得数据,相比之下, 包装法是最能保证模型效果得特征选择方法
特征选择总结:
- 过滤法更快, 但很粗糙, 包装法和嵌入法更精准, 比较适合具体到算法去调整, 但计算量大, 运行时间长, 当数据量很大得时候, 优先使用方差过滤和互信息法调整, 再上其他特征选择方法, 使用逻辑回归时, 优先使用嵌入法, 使用支持向量机时, 优先使用包装法.