计算机系统应用教程网站

网站首页 > 技术文章 正文

一款小众但实用的自动化特征选择工具:AutoFeatSelect

btikc 2024-10-11 11:21:45 技术文章 3 ℃ 0 评论

特征选择是机器学习建模过程中至关重要的步骤,直接决定了模型效果的上限。优秀的特征组合甚至比选择合适的算法更为重要。合理的特征选择不仅能够提升模型的性能,还具备以下优势:

  • 提高模型性能并降低复杂性:有效减少维度,避免维数爆炸问题。
  • 减少训练时间:减少不必要的特征会让模型训练速度更快。
  • 降低过拟合风险:去除无信息或冗余特征有助于模型泛化能力的提升。
  • 简化部署流程和实时数据处理:更精简的模型可让数据管道更加高效,这是一个常常被忽视的优势。

在实际工作中,特征选择通常是一个耗时且复杂的过程,需要结合多种技术手段进行筛选。而对于有经验的开发者来说,自动化特征选择工具能够大幅提升效率。

AutoFeatSelect 介绍

为了简化特征选择流程,本次介绍一款小众但实用的自动化特征选择工具——AutoFeatSelect

它是一个 Python 库,专为自动化和加速特征选择过程而设计,尤其适合处理复杂的特征工程任务。

主要特点:

  • 自动化特征选择:支持多种方法进行自动特征选择,包括 LightGBM 重要性、XGBoost 重要性、RFECV(递归特征消除)等。
  • 特征重要性分析:能够分别计算并可视化不同模型算法下的特征重要性得分和排名。
  • 相关性分析:执行特征间的相关性分析,自动识别并删除高度相关的特征,减少冗余。

主要功能和特性

AutoFeatSelect 提供了广泛的功能,旨在为特征选择过程提供全方位支持,包括:

  • 数值型和分类型特征的相关性分析。
  • 基于 LightGBM、XGBoost 和随机森林的特征重要性分析。
  • LassoCV 系数分析。
  • permutation(排列)重要性分析。
  • 通过交叉验证进行递归特征消除(RFECV)。
  • 使用 Boruta 算法进行特征筛选。

AutoFeatSelect 不仅集成了常见的特征选择方法,还能够自动执行繁琐的筛选步骤,如相关性计算、冗余特征删除等,极大简化了特征工程的流程。

安装方式

可以通过以下命令快速安装 AutoFeatSelect:

pip install autofeatselect

模拟案例:房价预测

在这个模拟案例中,我们将生成一个房价预测的数据集,并基于这些数据演示如何进行特征选择。我们将使用AutoFeatSelect库来简化特征选择过程,同时展示如何通过不同模型计算特征重要性。

步骤 1:生成模拟数据

首先,使用numpypandas生成与房价预测相关的模拟数据。假设数据集包含一些与房价相关的特征,例如房屋面积、卧室数量、地段评分等。

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# 设置随机种子以保证结果可重复
np.random.seed(42)

# 模拟数据集大小
n_samples = 1000

# 创建特征
data = {
    'house_id': np.arange(n_samples),
    'square_footage': np.random.normal(250, 50, n_samples),  # 房屋面积(平方米)
    'num_bedrooms': np.random.randint(1, 6, n_samples),  # 卧室数量
    'num_bathrooms': np.random.randint(1, 4, n_samples),  # 卫生间数量
    'location_quality': np.random.choice(['low', 'medium', 'high'], n_samples),  # 地段评分
    'year_built': np.random.randint(2000, 2024, n_samples),  # 建造年份
    'monthly_income': np.random.normal(50000, 3000, n_samples),  # 家庭月收入
    'house_price': np.random.normal(300, 100, n_samples)  # 房价(万元)
}

# 将数据转换为DataFrame
df = pd.DataFrame(data)

# 检查数据
print(df.head())

# 将特征划分为数值型和分类型特征
response = 'house_price'  # 目标变量,房价
cat_feats = ['location_quality']
num_feats = [c for c in df.columns if c not in cat_feats + ['house_id', response]]

# 切分训练集和测试集
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)

print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")

在这里,我们创建了一个模拟房价预测的数据集,其中包含以下特征:

  • square_footage:房屋面积
  • num_bedrooms:卧室数量
  • num_bathrooms:卫生间数量
  • location_quality:地段评分
  • year_built:建造年份
  • monthly_income:家庭月收入
  • house_price:目标变量,房价

输出:

步骤 2:相关性分析

接下来,我们可以使用AutoFeatSelect中的CorrelationCalculator来分析数值特征之间的相关性,删除相关性过高的特征。

from autofeatselect import CorrelationCalculator

# 计算数值型特征的相关性
corr_df_num, num_remove_list = CorrelationCalculator.numeric_correlations(X_train,
                                                                          features=num_feats,
                                                                          static_features=None,
                                                                          threshold=0.9)

# 输出相关性较高的特征
print(f"需删除的数值特征: {num_remove_list}")

此步骤会根据设置的阈值(0.9)计算特征间的相关性,并删除那些高度相关的特征,以避免冗余信息影响模型表现。

步骤 3:特征重要性评估

我们接下来使用LightGBM模型来评估每个特征的重要性,并输出排名。AutoFeatSelect库可以简化这一过程。

from autofeatselect import FeatureSelector

# 创建特征选择器
feat_selector = FeatureSelector(modeling_type='regression',
                                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)

# 计算LightGBM的特征重要性
lgbm_importance_df = feat_selector.lgbm_importance(hyperparam_dict=None,
                                                   objective='regression',
                                                   return_plot=True)

# 输出重要性排名
print(lgbm_importance_df.head())

输出结果将显示房价预测中最重要的特征,例如:

            feature    importance
0    square_footage  9.368573e+06
1    monthly_income  6.884146e+06
2        year_built  3.036107e+06
3      num_bedrooms  1.506692e+06
4  location_quality  1.448739e+06

在这个结果中,square_footage(房屋面积)是最重要的特征,monthly_income(地段评分)紧随其后,year_built(卧室数量)也具有较高的重要性。

步骤 4:递归特征消除(RFE)

为了进一步优化特征集,我们可以使用递归特征消除(RFE),通过每次移除最不重要的特征,找到最佳的特征组合。

# 使用递归特征消除进行特征选择
rfecv_importance_df = feat_selector.rfecv_importance(lgbm_hyperparams=None,
                                                     rfecv_hyperparams=None,
                                                     return_plot=True)

# 输出RFE选择的重要性排名
print(rfecv_importance_df.head())

通过RFE,模型将自动确定最优特征集,帮助我们进一步减少无用特征。

            feature  importance
0    square_footage           1
1    monthly_income           2
2        year_built           3
3      num_bedrooms           4
4  location_quality           5

步骤 5:全自动特征选择

如果希望整个特征选择过程全自动化,可以使用AutoFeatSelect库中的全自动特征选择方法。

from autofeatselect import AutoFeatureSelect

# 创建AutoFeatureSelect对象
feat_selector = AutoFeatureSelect(modeling_type='regression',
                                  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)

# 执行全自动特征选择
final_importance_df = feat_selector.apply_feature_selection(selection_methods=['lgbm', 'xgb', 'rf', 'rfecv'],
                                                            lgbm_hyperparams=None,
                                                            xgb_hyperparams=None,
                                                            rf_hyperparams=None,
                                                            rfecv_hyperparams=None)

# 输出最终的重要性排名
print(final_importance_df.head())

输出:

简要说明:

  • square_footage(建筑面积)在所有算法中都被认为是最重要的特征,在所有模型中得分最高。
  • monthly_income(月收入)也是所有模型中排名靠前的特征,具有很强的预测力。
  • year_built(建造年份)和num_bedrooms(卧室数量)重要性相对较低,但仍然对预测有影响。
  • location_quality(位置质量)在XGBoost模型中的得分较低,但在随机森林模型中的得分较高,说明不同模型对该特征的评价不同。

总体来说,这些特征在不同模型中的表现稍有不同,但建筑面积和月收入始终是关键的预测特征。

总结

通过这个模拟的房价预测案例,我们使用了AutoFeatSelect库对特征进行了分析和筛选。

最终的结果会帮助我们确定哪些特征对房价预测最为重要,例如房屋面积、地段评分、卧室数量等。

这个过程展示了如何简化特征选择,确保模型的预测准确性并减少不必要的特征。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表