1. 特征工程
特征工程本质是一项工程活动,它目的是最大限度地从原始数据中提取并加工特征以供模型或者算法使用。在传统机器学习领域流传着这样一句话: “数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”,从而可见特征工程的重要性。其实对于结构化数据建模,即使用深度学习模型,特征工程也是比模型本身要重要的。
什么是好的特征?
好的特征应是对任务有用的特征,应该具有以下表格中的特质:
- 对当前任务“有用”的特征。 例如:“app版本”这个特征对于预测用户是否付费的任务就很有用。
- 好的category特征的枚举值应在数据集中出现多次。某个特征值出现次数太少的话,模型对该特征值就几乎学习不到什么知识。
- 最好具有清晰明确的含义,最好能见文识意。
- 特征的值不应该超出语义范围或者业务知识范围。例如:“季节”特征不应该出现除了春夏秋冬外的其他季节。
- 与目标变量相关性高的特征(包括正相关和负相关),这样的特征是“ 强特征“。
2. Feature-engine
Feature-engine 是一个开源特征工程Python库,保留Scikit-learn功能,支持使用 fit( )函数 和 transform()函数从数据中学习,然后进行特征转换,简化了端到端特征工程管道的实现。使用Feature-engine 可以使模型开发和部署更加高效和可重用。
Feature-engine库的特点:
- 包含最详尽的特征工程转换集合。
- 可以转换数据帧中的一组特定变量。
- 返回数据帧,因此适用于数据探索和模型部署。
- 兼容Scikit-learn的pipline、网格和随机搜索以及交叉验证。
- 能够自动识别数值、分类和日期时间变量。
- 如果无法进行特征转换,Feature-engine会发出提示,例如:如果对负变量应用对数或除以0。 <a name="PDbxm"></a>
3. 如何安装
Feature-engine是Python 3的一个包,可以在Python 3.8或更高版本中运行,安装非常方便。
使用pip安装:
代码语言:javascript复制$ pip install feature-engine
使用Anaconda安装:
代码语言:javascript复制$ conda install -c conda-forge feature_engine
使用git命令进行clone安装:
代码语言:javascript复制git clone https://github.com/feature-engine/feature_engine.git
4. 使用示例
数据插补
缺失数据插补是指用从变量的可用值推导出的统计值替换存在的缺失值。下面是一个使用数据中的中位数插补缺失值的案例。
代码语言:javascript复制median_imputer = MeanMedianImputer(
imputation_method='median',
variables=[‘A2’, ‘A3’, ‘A8’, ‘A11’, ‘A15’]
)
# 在训练数据上进行fit
median_imputer.fit(X_train)
# 分别对训练数据和测试数据进行转换
X_train = median_imputer.transform(X_train)
X_test = median_imputer.transform(X_test)
分类编码器 分类编码器可以将包含字符串作为值的变量转换为数值变量。下面是一个使用案例,feature_engine从训练集中学习字符串到数值的映射,并将它们存储在属性encoder_dict_中。
代码语言:javascript复制# 初始化CountFrequencyEncoder
encoder = ce.CountFrequencyEncoder(
encoding_method='frequency',
variables=['cabin', 'pclass', 'embarked']
)
# 在训练数据上进行fit
encoder.fit(X_train)
# 分别对训练数据和测试数据进行转换
train_t = encoder.transform(X_train)
test_t = encoder.transform(X_test)
# 打印映射字典
print(encoder.encoder_dict_)
离散化 离散化可以连续变量的值排序为离散的数值,也称为箱或桶。下面是一个案例展示如何使用决策树执行离散化。
代码语言:javascript复制# 初始化DecisionTreeDiscretiser
disc = dsc.DecisionTreeDiscretiser(
cv=3,
scoring='neg_mean_squared_error',
variables=['LotArea', 'GrLivArea'],
regression=True
)
# 在训练数据上进行fit
disc.fit(X_train, y_train)
# 分别对训练数据和测试数据进行转换
train_t = disc.transform(X_train)
test_t = disc.transform(X_test)
数学变换 数学变换是指通过应用任何数学函数对原始变量进行变换,通常是为了尝试获得高斯分布。下面案例展示了如何使用Feature-engine实现Box-Cox变换。
代码语言:javascript复制# 初始化BoxCoxTransformer
tf = vt.BoxCoxTransformer(
variables = ['LotArea', 'GrLivArea']
)
# 在训练数据上进行fit
tf.fit(X_train)
# 分别对训练数据和测试数据进行转换
train_t = tf.transform(X_train)
test_t = tf.transform(X_test)
离群值处理 离群值,也称逸出值,是指在数据中有一个或几个数值与其他数值相比差异较大。下面展示了一个离群值的处理案例,超出确定的分布边界的值会被裁剪到边界。
代码语言:javascript复制# 初始化Winsorizer
capper = outr.Winsorizer(
distribution='gaussian',
tail='right',
fold=3,
variables=['age', 'fare']
)
# 在训练数据上进行fit
capper.fit(X_train)
# 分别对训练数据和测试数据进行转换
train_t = capper.transform(X_train)
test_t = capper.transform(X_test)
使用Scikit-learn管道 在前面的部分中,我们展示了如何单独实现每种技术。在构建机器学习模型时,我们通常会对变量进行各种变换。我们可以将所有的特征转换器放置在Scikit-learn管道中,避免耗时繁琐的手动转换。
<a name="vmPxf"></a>
5. 完整功能
缺失数据处理方法
- MeanMedianImputer
- RandomSampleImputer
- EndTailImputer
- AddMissingIndicator
- CategoricalImputer
- ArbitraryNumberImputer
- DropMissingData
分类编码方法
- OneHotEncoder
- OrdinalEncoder
- CountFrequencyEncoder
- MeanEncoder
- WoEEncoder
- PRatioEncoder
- RareLabelEncoder
- DecisionTreeEncoder
- StringSimilarityEncoder
数值离散化方法
- EqualFrequencyDiscretiser
- EqualWidthDiscretiser
- DecisionTreeDiscretiser
- ArbitraryDiscreriser
异常值处理方法
- Winsorizer
- ArbitraryOutlierCapper
- OutlierTrimmer
变量转换方法
- LogTransformer
- LogCpTransformer
- ReciprocalTransformer
- ArcsinTransformer
- PowerTransformer
- BoxCoxTransformer
- YeoJohnsonTransformer
特征创建方法
- MathFeatures
- RelativeFeatures
- CyclicalFeatures
特征选择方法
- DropFeatures
- DropConstantFeatures
- DropDuplicateFeatures
- DropCorrelatedFeatures
- SmartCorrelationSelection
- ShuffleFeaturesSelector
- SelectBySingleFeaturePerformance
- SelectByTargetMeanPerformance
- RecursiveFeatureElimination
- RecursiveFeatureAddition
- DropHighPSIFeatures
- SelectByInformationValue
日期特征处理方法
- DatetimeFeatures
时间序列方法
- LagFeatures
- WindowFeatures
- ExpandingWindowFeatures
Preprocessing
- MatchCategories
- MatchVariables
Wrappers:
- SklearnTransformerWrapper
参考:
[1] Data-centric AI之特征工程(第一讲)
[2] Feature-engine: A new open source Python package for feature engineering
[3] Feature Engine
「核桃量化」分享AI知识,助力量化投资。致力于将机器学习更好的应用于量化投资领域。