什么是特性选择?
特征选择是数据预处理和特征工程中的一个关键步骤。它的主要目标是从初始的特征集合中挑选出对预测任务最有用的特征,从而简化模型,减少过拟合,提高模型的泛化能力。特征选择的主要方法可以分为三类:
过滤法(Filter method):通过统计指标如方差、相关性等来评估每个特征的重要性,然后选择得分最高的特征。这种方法简单快捷,但可能忽略特征之间的交互作用。
包裹法(Wrapper method):通过训练模型并评估其性能来选择特征。常见的有前向选择、后向消除和递归特征消除等方法。虽然这种方法考虑了特征之间的交互作用,但计算成本较高。
嵌入法(Embedded method):在模型训练过程中自动进行特征选择,例如LASSO回归中的L1正则化。这种方法在特征选择和模型训练间找到了平衡,具有较高的效率和效果。
什么是Boruta算法?
Boruta算法是一种基于随机森林的全局特征选择方法。它由Miron B. Kursa和Witold R. Rudnicki在2010年提出。该算法的核心思想是通过与随机生成的伪特征(shadow features)进行比较,来评估原始特征的重要性。具体来说,Boruta算法通过以下步骤来实现特征筛选:
生成伪特征:首先,将数据中的每个特征进行随机排列,生成与原始特征数量相同的伪特征。这些伪特征不包含任何有用信息,用于作为基准来评估原始特征的重要性。
构建随机森林模型:将原始特征和伪特征一起输入到随机森林模型中,计算每个特征的重要性。随机森林是一种基于决策树的集成学习方法,通过构建多个决策树来提高模型的稳定性和预测性能。
比较重要性:将原始特征的重要性与伪特征中的最高重要性进行比较。如果一个原始特征的重要性显著高于最高的伪特征重要性,则认为该特征是重要的;如果显著低于,则认为该特征是不重要的。
迭代过程:反复进行上述过程,直到所有特征都被明确分类为重要或不重要,或者达到预设的迭代次数。最终结果是一个包含所有重要特征的集合。
Boruta算法的优点
鲁棒性:Boruta算法通过随机森林模型进行特征重要性评估,具有较高的鲁棒性和稳定性。它能够处理高维数据,并且对噪声数据不敏感。
自动化:相比于传统的特征选择方法,Boruta算法能够自动化地完成特征筛选过程,无需人工干预,大大提高了效率。
全局视角:Boruta算法考虑了所有特征的交互作用和全局影响,避免了局部最优问题,能够更全面地识别出关键特征。
可解释性:通过与伪特征进行比较,Boruta算法的筛选过程直观明了,便于解释和理解。用户可以清晰地看到哪些特征被选中,哪些被淘汰,以及每个特征的重要性。
案例演示
安装依赖
!pip install Boruta
模型构建
rf_1 = RandomForestRegressor(n_jobs=-1, oob_score=True)
feat_selector = BorutaPy(rf_1, n_estimators='auto', max_iter=100, random_state=42)
feat_selector.fit(X.values, y)
精度评价
mse_selected = mean_squared_error(y_test, y_pred_selected)
rmse_selected = mean_squared_error(y_test, y_pred_selected, squared=False)
mae_selected = mean_absolute_error(y_test, y_pred_selected)
r2_selected = r2_score(y_test, y_pred_selected)
print(f"Mean Squared Error with selected features: {mse_selected}")
print(f"Root Mean Squared Error with selected features: {rmse_selected}")
print(f"Mean Absolute Error with selected features: {mae_selected}")
print(f"R^2 with selected features: {r2_selected}")
print("---------------------------------------------------")
rf_all = RandomForestRegressor(n_jobs=-1, max_depth=5, random_state=42)
rf_all.fit(X_train, y_train)
y_pred_all = rf_all.predict(X_test)
mse_all = mean_squared_error(y_test, y_pred_all)
rmse_all = mean_squared_error(y_test, y_pred_all, squared=False)
mae_all = mean_absolute_error(y_test, y_pred_all)
r2_all = r2_score(y_test, y_pred_all)
print(f"Mean Squared Error with all features: {mse_all}")
print(f"Root Mean Squared Error with all features: {rmse_all}")
print(f"Mean Absolute Error with all features: {mae_all}")
print(f"R^2 with all features: {r2_all}")
可以看到,使用Boruta选择的特征进行建模,模型在所有评估指标上均优于使用所有特征的模型。
公众号后台回复【240801】,即可获取完整的代码及示例数据!
喜欢也行,不喜欢也行;如果觉得有用处的话,还请点点右下角的赞/在看,记得关注我哟!