机器学习中关于随机森林和XGBoost算法的特征选择 (一)


前言

近年来机器学习在数学建模竞赛和大数据竞赛中的应用越来越广泛,本文是基于2023年mothor cup 大数据竞赛B题第一问中特征选择,参考历年优秀论文数学建模清风老师的内容,结合自己的实际想法而作。


一、历年论文对特征选择的处理(选取两篇)

1.具体问题

依据附件1“估价训练数据”所提供的训练用二手车交易样本数据及题目文本涉及的其他相关资料,基于机器学习及统计学理论知识,联系结合各特征变量,训练并测试模型,以选择二手车交易的最优估价方法并预测附件2“估计验证数据”的二手车零售交易价格,最后将预测结果保存在附件3“估价模型结果”文件中。

2.优秀论文

论文1:针对问题一,第一步(数据清洗):本文运用统计指标、K近邻算法(KNN)等填充方法,逐个对附件1、附件2进行缺失值、异常值处理。第二步(特征工程):本文对部分类别特征数据进行标签编码和独热编码,然后进行特征构造并删除重复信息的字段,同时对部分数值特征进行分箱处理。第三步(可视化):利用pandas-profiling工具生成研究报告,并通过绘制分布图、热力图、三维柱状图、三维散点图等,对特征变量进行统计解释。第四步(模型准备):本文依据题干信息及统计学理论,建立并采用评测标准、调整决定系数𝑹𝟐、平均相对误差、5%误差准确率这四项指标作为本文的模型评估标准。第五步(模型建立):本文先建立神经网络模型评判数据集预测情况,然后利用XGBoost算法、随机森林、SFS序列前向选择筛选得到34个特征。
在这里插入图片描述
通过联合比较XGBoost算法中特征重要性分数大于0.3%的变量与随机森林回归模型重要性评分大于0.03的变量,取其交集得到二者共同遴选出的特征变量,再将之与步骤三中特征前向选择的结果取并集,并绘制关键词标签云,最终筛选得到34个特征变量。
去有风的地方 A Beautiful Smile 失眠 眼泪落下之前
论文二·:摘要:针对问题一,主要需要确定影响成交价格的因素并建立合适的预测模型。本文建立了基于Stacking 技术XGBoost、LightGBM 和CatBoost 融合模型来进行估价,并运用贝叶斯优化进行模型超参数调优。首先,我们对数据进行异常值剔除、正态转换和缺省值填补的预处理,构造出便于统计分析的特征,选取与成交价格有密切关系的28 个特征并做检验。
正文:首先对构造后得到的连续特征进行相关性分析:计算变量间的Pearson 系数,正值表示正相关,负值表示负相关,绝对值越大表示线性相关程度越高。然后利用XGBoost 算法获取特征重要性,依据模型在验证集上的效果对特征按照重要性程度从低到高进行排序。
两篇论文解决的都是相同的问题,很明显论文1的陈述更加全面准确,论文2稍显逊色。二者都运用了XGBoost对特征的重要性排序,论文1中的独热编码和标签词云也是非常精彩的应用,接下来介绍XGBoost.

二、XGBoost算法的应用

目前机器学习中应用最多的是python,各个平台对机器学习的介绍大多数都是Python,下面的代码是jyputer notebook中的,相较于Python的编辑环境,notebook比较类似,可能更简便,可以从winpython或者anaconda运行。
代码如下(示例):

# plot feature importance using built-in function
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('qt4agg')
#指定默认字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']='sans-serif'
#解决负号'-'显示为方块的问题
matplotlib.rcParams['axes.unicode_minus'] = False
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
plt.savefig('Water-pause-times.png', dpi=500, bbox_inches='tight') # 解决图片不清晰,不完整的问题
plt.show()

from numpy import loadtxt
import pandas as pd
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot

dataset = pd.read_excel('jupyter 试.xlsx')
dataset.head()
y=dataset.iloc[:,0:1]#取13行,前两列,取前不去后,从0开始
X=dataset.iloc[:,1:26]
model = XGBClassifier()
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

model.fit(X, y)
# plot feature importance
plot_importance(model)
pyplot.show()
pyplot.figure(figsize=(20,18))

此代码也是多方查阅,并非原创,如有侵权还望见谅。

三、随机森林的特征选择

利用随机森林得到指标的重要性
(因为这个过程中具有随机性,所以每次运行的结果可能有细微区别,我们以某一次的结果为主就好了)
trainingData = data1;
inputTable = trainingData;
predictorNames = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};
predictors = inputTable(:, predictorNames);
response = inputTable.VarName5;
isCategoricalPredictor = [false, false, false, false];

% Train a classifier
% This code specifies all the classifier options and trains the classifier.
template = templateTree(...
    'MaxNumSplits', 143);
classificationEnsemble = fitcensemble(...
    predictors, ...
    response, ...
    'Method', 'Bag', ...
    'NumLearningCycles', 30, ...
    'Learners', template, ...
    'ClassNames', categorical({'变色鸢尾'; '山鸢尾'; '维吉尼亚鸢尾'}));


importance =oobPermutedPredictorImportance(classificationEnsemble);
 % 可以将重要性归一化到[0 1]区间内  % https://ww2.mathworks.cn/matlabcentral/answers/783611-need-predictor-importance-in-random-forest-expressed-as-a-percentage#answer_671247
importance(importance<0) = 0;
importance = importance./sum(importance)

此代码完全借鉴于清风老师随机森林的特征选择,具体课程是机器学习进阶中的21讲和22讲,真心推荐清风老师的课程,性价比很高,很实用。

四、自己对特征选择的处理

第一步(数据预处理):对附件1与附件2的数据集进行预处理,利用统计学手段处理原始数据集中的缺失值。第二步(变量划分)对语音业务和上网业务的影响因素划分为分类变量和数值变量,并将分类变量转化为独热编码。第三步(统计学分析):对分类变量和数值变量分别进行方差分析和相关性分析,以其是否通过显著性检验和假设性检验来筛选主要因素。第四步(特征排序):利用Jyputer notebook中的XGBoost算法进行特征排序,最后结合二者的交集确定主要因素。
由于时间关系和能力问题,对于论文1中相对完美的特征选择并没有完全实现,采取方差分析和相关系数与XGBoost算法结合的粗略计算筛选,相较于论文2有进步但还是差强人意。

五、遇到的问题和建议

问题1:独热编码问题,查阅资料可以利用Python 中的pandas库实现,或者在Excel中的if函数。
问题2:XGBoost在MATLAB中实现难度较大,需要下载工具箱,并且下载地址在外网,经常打不开,网上的资源也是面包多上的付费资源,价格也挺昂贵,还是用开源的Python比较好。但是变量太多会出现画图重叠的问题,每次使用部分变量不知道会不会有影响。


总结

希望以上内容能对涉及有关内容的友友们有所帮助,同时也希望基础不太好或者初学者更多地接触Python,当然也推荐购买数学建模清风老师的课程,涉及到SPSS、STATA、MATLAB、EXCEL、画图软件等等。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小沈不会泛函

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值