相关阅读:
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:赛题理解篇(一)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:数据探索篇(二)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:特征工程篇(三)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:模型训练篇(四)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:模型验证篇(五)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:特征优化篇(六)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:模型融合篇(七)
比赛地址:工业蒸汽量预测_学习赛_天池大赛
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′=Sx−X
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′=Max−Minx=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]2x
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,x1∗x2,x1∗x3,x1∗x4,x22,x2∗x3,x2∗x4,x32,x3∗x4,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(A−E)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)=x∈y∑y∈x∑p(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)