简介:
特征工程包括特征构建和特征挑选,个人对特征构建的兴趣要大一些,因为在实际项目当中我们往往会发现创造有用的特征比苦苦改进算法的回报率会高很多. 这篇博客想作为构造多项式特征的一个笔记,构建多项式特征是常见的构建新特征的方法之一. 在统计模型当中被广泛用于探索复合变量对y的影响,在机器学习项目当中并不像统计模型那样频繁使用,但我们依然可以用来探索一些我们认为可能会有帮助的变量.
定义:
多项式特征可以理解为对现有特征的乘积,比如现在有特征A,特征B,特征C,那就可以得到特征A的平方(A^2),A*B,A*C,B^2,B*C以及C^2. 新生成的这些变量即原有变量的有机组合,换句话说,当两个变量各自与y的关系并不强时候,把它们结合成为一个新的变量可能更会容易体现出它们与y的关系.
在
实现代码:
Sklearn提供了强大的功能 PolynomialFeatures,可以实现将几个变量互相交互到指定的程度,一般我们规定到 3 度,更高的程度更可能会导致过拟合.
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import PolynomialFeatures,Imputer
# 此处省略了pandas读入数据,切分训练集train和测试集test
# 为构造多项式特征创建新数据框
poly_train = train[['var_1','var_2','var_3','var_4']]
poly_test = test[['var_1','var_2','var_3','var_4']]
# 数据当中的缺失值填充为中位数
imputer = Imputer(strategy = 'median')
poly_train = imputer.fit_transform(poly_train)
poly_test = imputer.transform(poly_test)
# 构造多项式特征
poly_transformer = PolynomialFeatures(degree = 3)
poly_transformer.fit(poly_train)
# 用训练出的方法转化训练集和测试集
poly_train = poly_transformer.transform(poly_train)
poly_test = poly_transformer.transform(poly_test)
# 查看转化后训练集的形状
print('Polynomial Features shape: ', poly_train.shape)
# 为新构造的特征加上名字,以下n = poly_train.shape的列数
feature_name = poly_transformer.get_feature_names(input_features = ['var_1','var_2','var_3','var_4'])[:n]
# 新建一个数据框存放这些特征
poly_features = pd.DataFrame(poly_train,
columns = poly_transformer .get_feature_names(['var_1','var_2','var_3','var_4']))
到目前为止特征构造已经完成了。接下来可以关注新构造的特征与目标 y 的相关性,观察如果相关性都合理的话,就可以把它们放到机器学习模型当中,去看看它们是否对提升模型效果有帮助 ~
# 在数据框中添加 y
poly_features['Target'] = y_train
poly_corrs = poly_features.corr()['Target'].sort_values()
# 观察相关性
print(poly_corrs.head(10))
print(poly_corrs.tail(5))
# 将测试集的数据放入新数据框当中
poly_test = pd.DataFrame(poly_test, columns = poly_transformer.get_feature_names(['var_1','var_2','var_3','var_4']))
# 引入数据当中的id,将多个数据框拼到一起
poly_features['id'] = train['id']
train_poly = train.merge(poly_features, on = 'id', how = 'left')
poly_test['id'] = test['id']
test_poly = test.merge(poly_test, on = 'id', how = 'left')
train_poly, test_poly = train_poly.align(test_poly, join = 'inner', axis = 1)
# 查看最终含多项式特征的训练集和测试集
print('Training data with polynomial features shape: ', train_poly.shape)
print('Testing data with polynomial features shape: ', test_poly.shape)