- 方差筛选
- 皮尔逊相关系数筛选
- lasso筛选
- 树模型重要性
- shap重要性
- 递归特征消除REF
面对高维特征,为了减少算力浪费和冗余特征的干扰,通常都会进行特征降维处理。如基因数据、微生物数据、传感器数据等,特征较多
特征降维一般有2种策略:
1. 特征筛选:从n个特征中筛选出m个特征,比如方差筛选,剔除方差过小的特征;利用皮尔逊相关系数筛选;lasso筛选(lasso自带的系数可以理解为重要性)、利用树模型自带的重要性、shap重要性等筛选;特征递归方法
2. 特征组合:从n个特征中组合出m个特征,如pca等
今天主要学习特征筛选:
方差筛选(简单有效)
它的核心逻辑是:特征的方差反映了数据的变化程度,方差很小的特征几乎没有变化,对模型的预测帮助不大。比如,一个特征的值在所有样本中几乎都一样(方差接近0),那么它对区分不同类别或预测结果几乎没有贡献。因此,方差筛选会设定一个方差阈值,剔除方差低于这个阈值的特征,保留那些变化较大的特征,从而减少特征数量,提高模型效率。
这种方法特别适合处理高维数据,能快速去掉不重要的特征,但它不考虑特征与目标变量之间的关系,可能会误删一些低方差但有意义的特征。
# 打印标题,表明这是方差筛选的部分
print("--- 方差筛选 (Variance Threshold) --- ")
# 导入需要的工具库
from sklearn.feature_selection import VarianceThreshold # 方差筛选工具,用于剔除方差小的特征
import time # 用于记录代码运行时间,方便比较效率
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 创建方差筛选器,设置方差阈值为0.01
# 阈值是指方差的最小值,低于这个值的特征会被删除(可以根据数据情况调整阈值)
selector = VarianceThreshold(threshold=0.01)
# 对训练数据进行方差筛选,fit_transform会计算每个特征的方差并剔除不满足阈值的特征
# X_train是原始训练数据,X_train_var是筛选后的训练数据
X_train_var = selector.fit_transform(X_train)
# 对测试数据应用同样的筛选规则,transform会直接用训练数据的筛选结果处理测试数据
# X_test是原始测试数据,X_test_var是筛选后的测试数据
X_test_var = selector.transform(X_test)
# 获取被保留下来的特征名称
# selector.get_support()返回一个布尔值列表,表示哪些特征被保留
# X_train.columns是特征的名称,结合布尔值列表可以提取保留特征的名字
selected_features_var = X_train.columns[selector.get_support()].tolist()
# 打印筛选后保留的特征数量和具体特征名称,方便查看结果
print(f"方差筛选后保留的特征数量: {len(selected_features_var)}")
print(f"保留的特征: {selected_features_var}")
# 创建一个逻辑回归模型,用于在筛选后的数据上进行训练和预测
# 保持与基准模型一致,使用相同的参数设置
lr_model_var = LogisticRegression(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_var是筛选后的特征数据,y_train是对应的目标标签
lr_model_var.fit(X_train_var, y_train)
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_var是筛选后的测试特征数据,lr_pred_var是预测结果
lr_pred_var = lr_model_var.predict(X_test_var)
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在


2112

被折叠的 条评论
为什么被折叠?



