【机器学习竞赛+笔记干货】工业蒸汽量预测:特征工程篇(三)


相关阅读:

比赛地址:工业蒸汽量预测_学习赛_天池大赛

3 特征工程

3.1 特征工程的重要性和处理

就是从原始数据提取特征的过程,这些特征可以很好的描述数据,并且利用特征建立的模型在未知数据上的性能表现可以达到最优(或者接近最佳性能)。
在这里插入图片描述

3.2 数据预处理和特征处理

3.2.1 数据预处理

1. 数据采集

哪些数据对最后的预测结果有帮助,是否能采集到这一类数据,在线上实时计算时数据获取是否快捷。

2. 数据清洗

去除“脏”数据:

  • 简单属性判定
  • 组合或统计属性判定
  • 补齐可对应的缺省值
3. 数据采样

原因:正负样本不均衡。
采样方法有随机采样和分层抽样。
随机采样存在得到极不均匀数据的隐患。
更多根据特征进行分层抽样。

  • 正样本>负样本,且量大:下采样(downsampling),从多数类中随机抽取样本从而减少多数类样本的数量,以使数据达到平衡。
  • 正样本>负样本,量不大:上采样(oversampling)、修改损失函数(loss function)设置样本权重。

3.2.2 特征处理

特征处理方法:

1. 标准化

标准化是依照特征矩阵的列处理数据,即通过求标准分数的方法,将特征转换为标准正态分布,并和总体样本分布相关。每个样本点都能对标准化产生影响。 x ′ = x − X ‾ S x'=\frac{x-\overline{X}}{S} x=SxX

from sklearn.preprocessing import StandardScaler
data=StandardScaler().fit_transform(data)
2. 区间缩放法

区间缩放法有很多种,常见的一种是利用两个最值进行缩放。
x ′ = x = M i n M a x − M i n x'=\frac{x=Min}{Max-Min} x=MaxMinx=Min

from sklearn.preprocessing import MinMaxScaler
data=MinMaxScaler().fit_transform(data)
3. 归一化

归一化时将样本的特征值转化到同一量纲下,把数据映射到[0,1]或[a,b]区间内,仅由变量的极值决定,区间缩放法是归一化的一种。
归一区间会改变数据的原始距离、分布和信息,标准化不会。
x ′ = x ∑ m j x [ j ] 2 x'=\frac{x}{\sqrt{\sum_{m}^{j}{x\left[j\right]^2}}} x=mjx[j]2 x

from sklearn.preprocessing import Normalizer
data=Normalizer().fit_transform(data)

归一化和标准化适用的场景:

  • 如果对输出结果的范围有要求,则用归一化。
  • 如果数据较为稳定,不存在极端的最大值或最小值,则用归一化。
  • 如果数据存在异常值或较多噪声,则用标准化,这样可以通过中心化简介避免异常值和极端值的影响。
  • 支持向量机(Support Vector Machine,SVM)、K近邻(K-Nearest Neighbor,KNN)、主成分分析(Principal Component Analusis,PCA)等模型都必须进行归一化或标准化操作。
4. 定量特征二值化

哑变量(Dummy Variable),也被称为虚拟变量,通常是人为虚设的变量,取值为0或1,用来反映某个变量的不同属性。
将类别变量转换为哑变量的过程就是哑编码。
对于有n个类别属性的变量,通常会以1个类别特征为参照,产生n-1个哑变量。
引入哑变量的目的是把原本不能定量处理的变量进行量化,从而评估定性因素对因变量的影响。

from sklearn.preprocessing import OneHotEncoder
data=OneHotEncoder(categories='auto').fit_transform(data.reshape((-1,1)))
6. 缺失值处理
from sklearn.impute import SimpleImputer
# 参数missing_value为缺失值的表示形式,默认为NaN
# 参数strategy为缺失值的填充方式,默认为mean(均值)
data=SimpleImputer().fit_transform(data)
7. 数据转换

常见的数据转换有基于多项式的、指数函数的和对数函数的转换方式。

  • 多项式转换
    例如4个特征,度为2的多项式转换公式为 ( x 1 ′ , x 2 ′ , x 3 ′ , x 4 ′ , x 5 ′ , x 6 ′ , x 7 ′ , x 8 ′ , x 9 ′ , x 10 ′ , x 11 ′ , x 12 ′ , x 13 ′ , x 14 ′ , x 15 ′ ) = ( 1 , x 1 , x 2 , x 3 , x 4 , x 1 2 , x 1 ∗ x 2 , x 1 ∗ x 3 , x 1 ∗ x 4 , x 2 2 , x 2 ∗ x 3 , x 2 ∗ x 4 , x 3 2 , x 3 ∗ x 4 , x 4 2 ) (x_1',x_2',x_3',x_4',x_5',x_6',x_7',x_8',x_9',x_{10}',x_{11}',x_{12}',x_{13}',x_{14}',x_{15}')=(1,x_1,x_2,x_3,x_4,x_1^2,x_1*x_2,x_1*x_3,x_1*x_4,x_2^2,x_2*x_3,x_2*x_4,x_3^2,x_3*x_4,x_4^2) (x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15)=(1,x1,x2,x3,x4,x12,x1x2,x1x3,x1x4,x22,x2x3,x2x4,x32,x3x4,x42)
from sklearn.preprocessing import PolynomialFeatures
# 参数degree为度,默认值为2
data=PolynomialFeatures().fit_transform(data)
  • 对数变换
    基于单变元函数的数据转换可以使用一个统一的方法完成。
from numpy import loglp
from sklearn.preprocessing import FunctionTransformer
# 第一个参数是单变元函数
data=FunctionTramsformer(loglp,validate=False).fit_transform(data)
8. 特征处理小结

在这里插入图片描述

3.3 特征降维

降维是指采用某种映射方法,将高维向量空间的数据点映射到低维的空间中。
在原始的高维空间中,向量数据包含冗余信息和噪声信息,其在实际应用中会对模型识别造成误差,降低准确率;而通过特征降维可以减少冗余信息造成的误差,从而提高识别的精度。
常用方法:特征选择和线性降维。

3.3.1 特征选择

1. 特征选择的定义

映射函数直接将不重要的特征删除,不过这样会造成特征信息的丢失,不利于模型精度。
数据分析以抓住主要影响因子为主,变量越少越有利于分析。
特征选择常用于统计分析模型中,以及超高维数据分析或者建模预处理中,例如基因序列建模。
在这里插入图片描述

2. 特征选择的方法
  • 过滤法(Filter):按照发散性或者相关性对各个特征进行评分,通过设定阈值或者待选择阈值的个数来选择特征。
  • 包装法(Wrapper):根据目标函数(通常是预测效果评分)每次选择若干特征,或者排除若干特征。
  • 嵌入法(Embedded):使用机器学习的某些算法和模型进行训练,得到各个特征的权重系数,并根据系数从大到小选择特征。
    在这里插入图片描述
3. 特征选择在Python中的具体实现

sklearn中具体的特征处理的类和所属方法:
在这里插入图片描述

1)VarianceThreshold

方差选择法,先计算各个特征的方差,然后根据阈值选择方差大于阈值的特征。

from sklearn.feature_selection import VarianceThreshold
# 参数threshold为方差的阈值
data=VarianceThreshold(threshold=3).fit_transform(data)
2)SelectKBest
(1)相关系数法

先计算各个特征对目标值的相关系数及相关系数的P值,然后根据与之筛选特征。

import numpy as np
from array import array
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
# 第一个参数为计算评估特征的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组
# 参数k为选择的特征个数
data=SelectKBest(lambda X,Y:np.array(list(map(lambda x:pearsonr(x,Y),X.T))).T[0],k=2).fit_transform(data,target)
(2)卡方检验

经典的卡方检验是检验定性自变量和定性因变量的相关性。
假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
x 2 = ∑ ( A − E ) 2 E x^2=\sum{\frac{(A-E)^2}{E}} x2=E(AE)2

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection omport chi2

data=SelectionKBest(chi2,k=2).fit_transform(data,target)
(3)最大信息数据法

经典的互信息是评价定性自变量和定性因变量相关性的方法。
互信息的计算公式:
I ( X , Y ) = ∑ x ∈ y ∑ y ∈ x p ( x , y ) log ⁡ p ( x , y ) p ( x ) p ( y ) I(X,Y)=\sum_{x\in{y}}{\sum_{y\in{x}}{p(x,y)\log{\frac{p(x,y)}{p(x)p(y)}}}} I(X,Y)=xyyxp(x,y)logp(x)p(y)p(x,y)

import numpy as np
from sklearn.feture_selection import SeleKBest
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)
data=SelectKBest(lambda X,Y:np.array(list(map(lambda x:mic(x,Y),x.T))).T[0],k=2).fit_transform(data,target)
3)RFE

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

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# 参数estimator为基模型
# 参数n_feature_to_select为选择的特征个数
data=RFE(estimator=LogisticRegression(multi_class='auto',solver='lbfgs',max_iter=500),n_feature_to_select=2).fit_transform(data,target)
4)SelectFromModel

SelectFromModel主要采用基于模型的特征选择法。
常见的有基于惩罚项的特征选择法和基于树模型的特征选择法。

(1)基于惩罚项的特征选择法

使用带惩罚项的基模型,可以筛选特征并降维。

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

# 将带L1惩罚项的逻辑回归作为基模型的特征选择
data=SelectFromModel(LogisticRegression(penalty='12',C=0.1,solver='lbfgs',multi_class='auto')).fit_transform(data,target)
(2)基于树模型的特征选择法

在树模型中,将GBDT(Gradient Boosting Decision Tree,梯度提升迭代决策树)作为基模型进行特征选择。

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import DradientBoostingClassifier

data=SelectFromModel(GradientBoostingClassifier()).fit_transform(data,target)

3.3.1 线性降维

常用方法有主成分分析法和线性判别分析法。

1. 主成分分析法

常用的线性降维方法。
通过某种线性投影,将高维数据映射到低维空间中表示,并期望在所投影的维度上数据的方差最大,以此达到使用较少的数据维度来保留较多的原始数据点特性的效果。

from sklearn.decomposition import PCA
# 参数n_components为主成分的数目
data=PCA(n_components=2).fit_transform(data)
2. 线性判别分析法

线性判别分析法(Linear Discriminant Analysis,LDA),也叫做Disher线性判别(Fisher Linear Discriminant,FLD),是一种有监督的线性降维算法。
PCA尽可能多的保留数据信息,LDA的目标是使降维后的数据点尽可能地容易被区分,其利用了标签的信息。
假设原始线性数据为X,我们希望找到映射向量a,使得aX后的数据点能够保持以下两种性质:

  • 同类数据尽可能地接近。
  • 不同类地数据点尽可能的分开。
    在这里插入图片描述
from sklearn.descriminant_analysis import LinearDiscriminantAnalysis as LDA
# 参数N_components为降维后的维数
data=LDA(n_components=2).fit_transform(data,target)

3.4 赛题特征工程

3.4.1 异常值分析

3.4.2 最大值和最小值归一化

3.4.3 查看数据分布

3.4.4 特征相关性

3.4.5 特征降维

3.4.6 多重共线性分析

3.4.7 PCA处理

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还重名就过分了啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值