作者:杰少
五大100%奏效的特征筛选策略
简 介
在一些问题中,我们拿到的数据特征列是几千甚至上万的,这个时候如果我们直接使用模型训练,会非常耗时间,如果我们知道有些特征100%对于后期的模型训练不会带来帮助,并且在输入模型训练之前就将其删除。
今天我们学习五个简单有效的特征筛选操作,这五个操作在竞赛中都可以直接使用,是100%有效的特征筛选策略,因为它们相对简单,所以我们就放在一起介绍了。
五大特征筛选策略
1. 全部为空值的特征列
如果特征列全部是缺失值,那么该列特征不会包含任何信息,所以可以直接删除。
2. 仅有一个值的特征
如果特征只包含唯一一个值的话,那么该列特征可以直接删除。
3. 相关性达到100%的特征
如果两个数值特征的pearson系数达到了1,那么可以直接删除其中一个。
4. 一一对应的无序类别特征
如果两个无序的类别特征是一一对应的,那么可以直接删除其中一个。
5. 梯度提升树模型给出重要性为0的特征
将所有的特征输入到梯度提升树模型进行训练,将梯度提升树模型返回的特征重要性为0的特征直接删除。
代 码
构建数据集
import pandas as pd
import numpy as np
df = pd.DataFrame()
df['f1'] = [1] * 100
df['f2'] = list(range(100))
df['f3'] = df['f2'].values * 10 + 1
df['f4'] = ['A'] * 30 + ['B'] * 40 + ['C'] * 30
df['f5'] = ['X'] * 30 + ['Y'] * 40 + ['Z'] * 30
df['f6'] = None
df['f7'] = np.random.rand(100)
df['f8'] = [1,0]*50
df['label'] = [0,1]*50
1. 特征列全部缺失的情况
null_col = df.columns[df.isnull().sum() == df.shape[0]]
null_col
Index(['f6'], dtype='object')
df = df[list(set(df.columns) - set(null_col))]
df.head()
2. 删除仅有一个值的特征
oneval_col = df.nunique().index[df.nunique() == 1]
df = df[list(set(df.columns) - set(oneval_col))]
df.head()
3. 删除相关性达到100%的特征
df.corr() == 1
label | f8 | f2 | f7 | f3 | |
---|---|---|---|---|---|
label | True | False | False | False | False |
f8 | False | True | False | False | False |
f2 | False | False | True | False | True |
f7 | False | False | False | True | False |
f3 | False | False | True | False | True |
'''
特征f2和f3相关性达到了1
'''
df = df[list(set(df.columns) - set(['f3']))]
df.head()
4. 寻找一一对应的无序类别特征
df.groupby('f4')['f5'].nunique()
f4
A 1
B 1
C 1
Name: f5, dtype: int64
df.groupby('f5')['f4'].nunique()
f5
X 1
Y 1
Z 1
Name: f4, dtype: int64
'''
特征f4和f5两个无序类别特征是一一对应的
'''
df = df[list(set(df.columns) - set(['f5']))]
df.head()
5. 删除梯度提升树模型给出重要性为0的特征
import lightgbm as lgb
y = df['label']
dic = {'A':1, 'B':2, 'C':3}
df['f4'] = df['f4'].map(dic).values
fea_cols = [col for col in df.columns if col not in ['label']]
X = df[fea_cols]
model = lgb.LGBMClassifier(max_depth=5, n_estimators=100, learning_rate=0.005, )
model.fit(X,y,verbose=10)
importance_zero_col = np.array(model.feature_name_)[model.feature_importances_ == 0]
importance_zero_col
适用问题
上面物种特征筛选策略99.9%都是通用的,所有的数据问题都可以直接使用,算是一种通用的策略。
参考文献
LightGBM Document
5 Feature Selection Method from Scikit-Learn you should know
往期精彩回顾
适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码: