一款好用的机器学习特征工程工具

爿臣戈王耑/ 八月 17, 2018/ 机器学习/ 0 comments

发现一款好用的机器学习中特殊选择工具。

项目地址:github开源项目:https://github.com/WillKoehrsen/feature-selector

0  功能概括

FeatureSelection可以0脑力的帮忙选出以下5种特征
  1. Missing Values  具有高缺失值半分比的特征
  2. Single Unique Values   具有单个唯一值的特征
  3. Collinear Features 共线性(高度相关的)特征 
  4. Zero Importance Features  在基于树的模型中重要度为零的特征
  5. Low Importance Features 重要度较低的特征 
这里用广告的特征进行尝试工具。
首先需要安装依赖的包:
安装依赖的包
python==3.6+
lightgbm==2.1.1
matplotlib==2.1.2
seaborn==0.8.1
numpy==1.14.5
pandas==0.23.1
scikitlearn==0.19.1

1 加载环境和数据

加载依赖的包
加载依赖的包
import lightgbm as lgb
from feature_selector import FeatureSelector
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
plt.rc(‘font’,family=‘Microsoft YaHei’)
 
加载数据,这里我们采用kaggle上泰坦尼克号的数据
加载数据
df = pd.read_csv(‘train.csv’, header = 0, error_bad_lines=False)
 
数据总共有100000数据,145特征,其中label表示Y值。
 
=====画重点

2 寻找缺失值的特征

要创建一个 FeatureSelector 类的实例,我们需要传入一个结构化数据集,其中观察在行中,特征在列中。我们可以使用一些仅操作特征的方法,但基于重要度的方法也需要训练标签。因为这是一个监督分类任务,所以我们将使用一组特征和一组标签。
创建实例
labels = df[‘label’]
data_df = df.drop(columns = [‘label’,‘user_tag’,‘eventid’,‘tel’,‘channel’,])
fs = FeatureSelector(data = data_df, labels = labels)
 
查找缺失值大约阈值的特征
# 设置缺失值的阈值为0.6 若缺失值超过60%的,则被找到
fs.identify_missing(missing_threshold = 0.6)
fs.missing_stats.head(20)
如下图结果,发现有1个特征缺失值超过60,并显示打印。
画缺失柱形图,从图中科院看出大约15个特征缺失值达到0.9以上,125左右的特征缺失值在0.0-0.1之间

3 共线性特征

identify_collinear 方法能基于指定的相关系数值查找共线性特征
#fs.identify_collinear(correlation_threshold = 0.9)
# 真实情况下不可能设置线性相关阈值为0.2,这里为了数据美观而设置的
fs.identify_collinear(correlation_threshold = 0.2)
表示有4个特征共线性超过了0.2
画热力图显示着几个特征情况

4 零重要度特征

        identify_zero_importance 函数能根据梯度提升机(GBM)学习模型查找重要度为零的特征。
使用基于树的机器学习模型(比如 boosting ensemble)求取特征重要度。这个重要度的绝对值没有相对值重要,我们可以将相对值用于确定对一个任务而言最相关的特征。我们还可以通过移除零重要度特征来在特征选择中使用特征重要度。在基于树的模型中,零重要度的特征不会被用于分割任何节点,所以我们可以移除它们而不影响模型表现。
FeatureSelector 能使用来自 LightGBM 库的梯度提升机来得到特征重要度。为了降低方差,所得到的特征重要度是在 GBM 的 10 轮训练上的平均。另外,该模型还使用早停(early stopping)进行训练(也可关闭该选项),以防止在训练数据上过拟合。
 
零重要特征
# 参数task可以为  classification 或者 regression
# 参数eval_metric可以为 auc l1 l2
fs.identify_zero_importance(task = ‘classification’,
 eval_metric = ‘auc’,
 n_iterations = 10,
 early_stopping = True)
zero_importance_features = fs.ops[‘zero_importance’]
zero_importance_features
 
打印这些重要度为0的特征,其中可以发现把类别型的特征具体一个类别都可以打印出来
上面第一个图给出了 plot_n 最重要的特征(重要度进行了归一化,总和为 1)。第二个图是对应特征数量的累积重要度。蓝色竖线标出了累积重要度为 90% 的阈值。
对于基于重要度的方法,有两点需要记住:
  • 训练梯度提升机是随机的,这意味着模型每次运行后,特征重要度都会改变。
这应该不会有太大的影响(最重要的特征不会突然就变成最不重要的),但这会改变某些特征的排序,也会影响识别出的零重要度特征的数量。如果特征重要度每次都改变,请不要感到惊讶!
  • 要训练机器学习模型,特征首先要经过 one-hot 编码。这意味着某些被识别为零重要度的特征可能是在建模过程中加入的 one-hot 编码特征
当我们到达特征移除阶段时,还有一个选项可移除任何被添加进来的 one-hot 编码的特征。但是,如果我们要在特征选择之后做机器学习,我们还是必须要 one-hot 编码这些特征。

5 低重要度的特征

identify_low_importance 函数能找到重要度最低的特征,这些特征无助于指定的总重要性。
# 下面的调用能找到最不重要的特征,即使没有这些特征也能达到 90% 的重要度
fs.identify_low_importance(cumulative_importance = 0.9)
打印一下,

6 单个唯一值特征

找出任何有单个唯一值的列。仅有单个唯一值的特征不能用于机器学习,因为这个特征的方差为 0。
identify_single_unique可以完成这个目的
fs.identify_single_unique()

7 移除特征

检测完上述几种训练数据时不需要的特征后,这个可以移除他们
# 移除上述的不适合训练的特征,并返回一个新的dataframe
train_removed = fs.remove(methods = ‘all’)
这里,methods参数可以是“all” 或者一个list
If methods == ‘all’, any methods that have identified features will be used
Otherwise, only the specified methods will be used. Can be one of [‘missing’, ‘single_unique’, ‘collinear’, ‘zero_importance’, ‘low_importance’]

 

如果不设置“keep_one_hot”参数,默认是True,则返回的dataframe是onehot后的数据

8 一次性运行所有方法(懒人至上)

懒人的最高最高境界~~~配置一次,然后找出所有的缺失值、相关性、0重要度、低重要特征、单一值
fs.identify_all(selection_params = {‘missing_threshold’0.5‘correlation_threshold’0.7,
                                    ‘task’‘regression’‘eval_metric’‘l2’,
                                     ‘cumulative_importance’0.9})
 
设置完后,可以打印一下ops字典,这里存放的各个特征,打印字典对应的keys就可以打印出该特征

 

发表 评论

电子邮件地址不会被公开。 必填项已用*标注

你可以使用 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*