文章目录
相关阅读:
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:赛题理解篇(一)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:数据探索篇(二)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:特征工程篇(三)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:模型训练篇(四)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:模型验证篇(五)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:特征优化篇(六)
- 【机器学习竞赛+笔记干货】工业蒸汽量预测:模型融合篇(七)
比赛地址:工业蒸汽量预测_学习赛_天池大赛
6 特征优化
6.1 特征优化的方法
6.1.1 合成特征
从一个或多个输入特征衍生而来的特征。
通过标准化或缩放单独创建的特征不属于合成特征。
合成特征包括:
- 将一个特征与其本身或其他特征相乘(称为特征组合)
- 两个特征相处
- 对连续特征进行分桶(分箱),以分为多个区间分箱
6.1.2 特征的简单变换
1. 数值特征的变换和组合
- 单独特征列乘以一个常数或者加、减一个常熟,对生成新的、有用的特征毫无用处,只能作为对已有特征的处理。
- 任何针对单独特征列的单独变换(如对数),都不适用于决策树类算法。对于决策树, X X X、 X 3 X^3 X3、 X 3 X^3 X3之间没有差异, ∣ X ∣ \vert{X}\vert ∣X∣、 X 2 X^2 X2、 X 4 X^4 X4之间也没有差异,除非有舍入误差。
- 特征的线性组合(linear combination)仅适用于决策树以及基于决策树的集成学习算法,因为树模型不擅长捕获不同特征之间的相关性。而SVM、线性回归、神经网络等模型自身可以线性组合。
- 常用的数值特征的变换和组合:
(1)多项式特征(polynomial feature)
(2)比例特征(ratio feature): X 1 / X 2 X_1/X_2 X1/X2
(3)绝对值(absolute value)
(4) m a x ( X 1 , X 2 ) max(X_1,X_2) max(X1,X2)、 m i n ( X 1 , X 2 ) min(X_1,X_2) min(X1,X2)、 X 1 o r X 2 X_1 or X_2 X1orX2
2. 类别特征与数值特征的组合
用N1和N2表示数值特征,用C1和C2表示类别特征(C2可以说离散化了的N1),利用Pandas的groupby操作可以创造:
(1)中位数:
m
e
d
i
a
n
(
N
1
)
_
b
y
(
C
1
)
median(N1)\_by(C1)
median(N1)_by(C1)
(2)算术平均数:
m
e
a
n
(
N
1
)
_
b
y
(
C
1
)
mean(N1)\_by(C1)
mean(N1)_by(C1)
(3)众数:
m
o
d
e
(
N
1
)
_
b
y
(
C
1
)
mode(N1)\_by(C1)
mode(N1)_by(C1)
(4)最大值:
m
a
x
(
N
1
)
_
b
y
(
C
1
)
max(N1)\_by(C1)
max(N1)_by(C1)
(5)最小值:
m
i
n
(
N
1
)
_
b
y
(
C
1
)
min(N1)\_by(C1)
min(N1)_by(C1)
(6)标准差:
s
t
d
(
N
1
)
_
b
y
(
C
1
)
std(N1)\_by(C1)
std(N1)_by(C1)
(7)方差:
v
a
r
(
N
1
)
_
b
y
(
C
1
)
var(N1)\_by(C1)
var(N1)_by(C1)
(8)频数:
f
r
e
q
(
C
2
)
_
b
y
(
C
1
)
freq(C2)\_by(C1)
freq(C2)_by(C1)
说明:
f
r
e
q
(
C
1
)
freq(C1)
freq(C1)不需要进行groupby操作也有意义。
还可以将这种方法和线性组合等基础特征工程方法结合(仅用于决策树):
(1)
N
1
−
m
e
d
i
a
n
(
N
1
)
_
b
y
(
C
1
)
N1-median(N1)\_by(C1)
N1−median(N1)_by(C1)
(2)
N
1
−
m
e
a
n
(
N
1
)
_
b
y
(
C
1
)
N1-mean(N1)\_by(C1)
N1−mean(N1)_by(C1)
6.1.3 用决策树创造新的特征
在决策树系列算法中,由于每一个样本都会被映射到决策树的一片叶子上,因此我们可以把样本经过每一棵决策树映射后的index(自然数)或one-hot-vector(哑编码得到的稀疏矢量)作为一项新的特征加入模型中。
可采用sklearn和xgboost中的apply()方法和decision_path()方法。
6.1.4 特征组合
将单独的特征进行组合(相乘或求笛卡尔积)而形成的合成特征,其有助于表示非线性关系。
1. 对非线性规律进行编码
由于通过采用随机梯度下降法可以有效地训练线性模型,因此在使用拓展的线性模型时,辅以特征组合一直都是训练大规模数据集的有效方法。
不同种类的特征组合,例如:
(1)
[
A
×
B
]
[A\times{B}]
[A×B]:将两个特征的值相乘
(1)
[
A
×
B
×
C
×
D
×
E
]
[A\times{B}\times{C}\times{D}\times{E}]
[A×B×C×D×E]:将五个特征的值相乘
(1)
[
A
×
A
]
[A\times{A}]
[A×A]:对单个特征的值求平方形成的特征组合
2. 组合独热矢量
我们将独热特征矢量的特征组合视为逻辑连接。
对大规模数据集使用特征组合是学习高度复杂模型的一种有效策略。
3. 使用分桶特征列训练模型
分桶特征:以一定方式将连续型数值划分到不同的桶(箱)中,可以理解为是对连续型特征的一种离散化处理方式。
要为分桶特征定义特征列,则可以使用bucketized_column(而非numeric_column),该列将数字列作为输入并使用boundaries参数中指定的分桶边界,将其转换为分桶特征。
6.2 赛题特征优化
6.2.1 导入数据
6.2.2 特侦构造方法
epsilon=1e-5
func_dict={
'add':lambda x,y:x+y,
'mins':lambda x,y:x-y,
'div':lambda x,y:x/(y+epsilon),
'multi':lambda x,y:x*y,
}
6.2.3 特征构造函数
def auto_feature_make(train_data,test_data,func_dict,col_list):
train_data,test_data=train_data.copy(),test_data.copy()
for col_i in col_list:
for func_name,func in func_dict.items():
func_features=func(data[col_i],data[col_j])
col_func_features='-'.join([col_i,func_name,col_j])
data[col_func_features]=func_features
return train_data,test_data
6.2.4 特征降维处理
train_data2,test_data2=auto_features_make(train_data,test_data,func_dict,col_list=test_data,columns)
from sklearn.decomposition import PCA
pca=PCA(n_components=500)
train_data2_pca=pca.fit_transform(train_data2.iloc[:,0:-1])
test_data2_pca=pca.fit_transform(test_data2)
train_data2_pca=pd.DataFrame(train_data2_pca)
test_data2_pca=pd.DataFrame(test_data2_pca)
train_data2_pca['target']=train_data2['target']
X_train2=train_data2[test_data2.columns].values
y_train=train_data2['target']