特征选择是识别数据集中最重要和信息丰富的特征的过程。它是机器学习建模流程中最重要的步骤之一,因为它对模型性能和预测能力有着重大影响。
进行特征选择的好处:
1. 提高模型性能并减少复杂性
2. 减少训练时间
3. 降低因无信息和冗余特征导致的过拟合风险
4. 简化部署流程和实时数据流水线,这是一个常常被低估的优势。
尽管特征选择有许多好处,但在实际项目中,由于紧迫的时间限制和对其对性能影响的低估,可能会忽视特征选择。此外,特征选择方法众多,不知道如何选择哪种方法可能会忽略这一关键步骤。
解决与时间相关的挑战并利用特征选择对机器学习模型产生积极影响的潜在解决方案是实施可重用的、部分或完全自动化的代码。
使用AutoFeatSelect自动特征选择
AutoFeatSelect是一个设计用于自动化和加速机器学习项目中特征选择过程的Python库。该库自动化了各种步骤,如计算相关性、消除高度相关的特征以及应用多种特征选择方法,并呈现所有的结果。
该库提供了灵活性,用户可以使用几行代码分别或集体进行相关性分析和应用特征选择方法。
通过这样做,AutoFeatSelect在节省时间和资源的同时提高模型性能。该库自动化简化了以下特征选择方法的实施:
1. 对连续和分类特征进行相关性分析
2. 使用LightGBM、XGBoost和随机森林进行特征重要性分析
3. LassoCV系数
4. 排列重要性
5. 带交叉验证的递归特征消除
6. Boruta方法
如何使用:应用' autofeatselect '到一个真实的数据集:
在处理实际数据集之前,只需使用pip安装软件包:
pip install autofeatselect
让我们在Porto Seguro的安全驾驶员预测数据集上工作,并一步一步地实现所有特征。该软件包为特征选择提供了两种不同的选择:分别应用方法或使用完全自动化的方法。
导入库
import pandas as pd
import numpy as np
from autofeatselect import CorrelationCalculator, FeatureSelector, AutoFeatureSelect
简单数据准备
#Preparing data
df = pd.read_csv("train.csv")
df.drop('id', axis=1, inplace=True)
#Setting numeric & categorical features for further analysis
response = 'target'
cat_feats = [c for c in df.columns if '_cat' in c]
bin_feats = [c for c in df.columns if '_bin' in c]
cat_feats = cat_feats + bin_feats
num_feats = [c for c in df.columns if c not in cat_feats+[response]]
df[num_feats] = df[num_feats].astype('float')
df[cat_feats] = df[cat_feats].astype('object')
df.replace(-1, np.nan, inplace=True)
#Training & Test Split
X_train, X_test, y_train, y_test = train_test_split(df[num_feats+cat_feats],
df[response],
test_size=0.2,
random_state=42)
方法一:分步应用相关性分析和特征选择方法
由于相关特征可能对特征重要性和选择结果产生负面影响(尽管基于树的集成模型的预测性能不受相关性影响),因此需要首先删除高度相关的特征。可以使用CorrelationCalculator类的numeric_correlations和categorical_correlations方法轻松检测到这些相关特征。
#Static features will not be removed even if they are correlated with other features.
static_features = ['ps_ind_01', 'ps_ind_03','ps_ind_14']
#Detect correlated features
corr_df_num, num_remove_list = CorrelationCalculator.numeric_correlations(X_train,
features=num_feats,
static_features=static_features,
threshold=0.9)
corr_df_cat, cat_remove_list = CorrelationCalculator.categorical_correlations(X_train,
features=cat_feats,
static_features=None,
threshold=0.9)
#Remove correlated features
num_feats = [c for c in num_feats if c not in num_remove_list]
cat_feats = [c for c in cat_feats if c not in cat_remove_list]
在从初始特征集中删除相关特征后,我们可以应用特征选择方法。让我们使用FeatureSelector类计算LightGBM特征重要性评分。
#Create Feature Selector Object
feat_selector = FeatureSelector(modeling_type='classification',
X_train=X_train, y_train=y_train,
X_test=X_test, y_test=y_test,
numeric_columns=num_feats,
categorical_columns=cat_feats,
seed=24)
#Note: Hyperparameters and objective function of LightGBM can be changed.
lgbm_importance_df = feat_selector.lgbm_importance(hyperparam_dict=None,
objective=None,
return_plot=True)
得到的特征重要性图:
我们可以分别调用各个选择方法来应用更多的选择方法。在使用LightGBM之后,可以应用递归特征消除方法。
#RFECV Feature Rankings with LightGBM as the estimator
#Note: Both yperparameters of LightGBM and RFECV can be changed.
rfecv_importance_df = feat_selector.rfecv_importance(lgbm_hyperparams=None,
rfecv_hyperparams=None,
return_plot=False)
方法二:全自动方法
通过AutoFeatSelect的功能,可以将整个过程从逐个删除相关特征和应用特征选择方法的方式显著自动化,提供了更高效、更全面的特征选择处理方式。
#Create AutoFeatureSelect class
feat_selector = AutoFeatureSelect(modeling_type='classification',
X_train=X_train,
y_train=y_train,
X_test=X_test,
y_test=y_test,
numeric_columns=num_feats,
categorical_columns=cat_feats,
seed=24)
#Detect Correlated Features
corr_features = feat_selector.calculate_correlated_features(static_features=None,
num_threshold=0.9,
cat_threshold=0.9)
#Drop Correlated Features
feat_selector.drop_correlated_features()
#Determine Selection Methods to Apply
#Options: 'lgbm', 'xgb', 'rf','perimp', 'rfecv', 'boruta', 'lassocv'
#Note: Hyperparameters of all methods can be changed
selection_methods = ['lgbm', 'xgb', 'rf','perimp', 'rfecv', 'boruta']
final_importance_df = feat_selector.apply_feature_selection(selection_methods=selection_methods,
lgbm_hyperparams=None,
xgb_hyperparams=None,
rf_hyperparams=None,
lassocv_hyperparams=None,
perimp_hyperparams=None,
rfecv_hyperparams=None,
boruta_hyperparams=None)
#Print Results
final_importance_df.head()
只需调用4个函数并编写几行代码,就可以应用多个特性选择方法。结果数据框将包含所有结果,如下所示:
在获得这些结果后,可以通过使用一个或多个方法的结果来选择最终的特征子集。此外,通过使用多个方法的前N个特征的组合集或交集,可以获得更好的特征集。
结论
特征选择是机器学习建模中最重要的步骤之一,但由于各种原因,它可能被低估或忽视。为了避免这种情况,并确保更高效的特征选择,可以使用自动化或半自动化的解决方案。autofeatselect包使得只需几行代码就可以应用多种方法,并使我们能够更高效地处理实际数据科学项目。