DMSAS使用技巧:机器学习建模

1、引言

机器学习算法在最近几年的热度一直居高不下,尤其当Transformer架构的大模型出来以后,机器学习、人工智能有关的算法热度又上升了一个台阶。在机器学习的世界中有一定理:没有免费的午餐[1],该定理说的是在众多机器学习的算法中,没有普遍优越的机器学习算法。简言之,当我们拿到了一份数据时,是应该选择随机森林、还是人工神经网络或深度学习,亦或是支持向量机,这些并非是在拿到数据前就已经确定了的,而是通过算法在数据上的反馈,让我们最终决定到底选择哪个算法完成最终建模。
既然如此,在进行一个机器学习模型的构建时,研究某种算法是否适用本次建模的意义或许并不大,因为我们完全可以将多种算法均应用到当前数据集,选择效果最好的算法继续深入建模。反而一些算法之外的处理流程往往能够决定建模效果,是我们需要注意的。本次就来讨论关于机器学习建模的流程及其用DMSAS (下载地址:www.dmsas.cn) 该如何实现。

2、数据集准备

机器学习的建模目的与经典统计分析不同,前者是用来对研究者手中的数据做出判断或预测的,而后者一般是用来解释变量之间相互关系,或通过抽样数据揭示某种总体分布规律的。尽管当前已有学者开始对机器学习的可解释性做出研究[2],但尚未完全普及。既然如此,若训练一个监督分类模型,其目的不是为了对手中的未知样本做预测而是为了探讨特征向量对结果的影响程度就有些“南辕北辙”了 (这个并非绝对的,也要依据研究目的而定)。

因此,在建模前一定要准备如下三份数据集:

训练集:输入给模型,让其通过学习这份数据集完成建模;

验证集(测试集):当模型“自认为”已经完成了训练集的学习后,在此数据集上运行,测试建模效果,通过效果评估,研究者可以观察当前的模型是否已达要求;

预测集:完成整个训练后,将模型应用在该份数据集,完成模型预测。

2.1 拆分训练集与预测集

Step1:分析 → 机器学习 → 随机森林 → 更多 → 数据集设置
Step2:在当前页面选择预测集占据的行范围和训练集占据的行范围即可完成拆分

在这里插入图片描述将预测集放置在整份数据集的10000-11000行,训练集为1-9999行

2.2 拆分训练集和验证集

完成预测集的拆分后,再将训练集提出一部分做为测试集,例如下图的设定表示在1-9999行中,有25%的数据会被随机组合成测试集,另外的75%则被组合成训练集,该部分训练集才是真正训练模型建模的数据。

在这里插入图片描述

3、类别不平衡问题

在一些现实的分类任务中,不同类型的训练样例数据可能差别很大。例如:一所医院构建了一个模型用来预测谁是癌症患者,这个案例可能取得的有效训练样例中,有99%的人并非得了癌症(反例),只有1%的人患癌(正例)。那么该医院建立的机器学习模型只需将所有病人都预测为非癌症患者,模型的准确率即可达到99%。然而这样的学习器往往没有任何价值,因为它不能预测出任何正例。
假如我们使用了一个线性分类学习器,我们用如下公式对未知样本 x 进行分类时,实际是用一个阈值与预测出的 y 值做比较,若 y 大于该阈值则预测为正例,小于则为反例。
y = w T × x + b y = w^{T}\times x + b y=wT×x+b
通常情况下,分类器都遵循如下的判断规则:

y 1 − y > 1 \frac{y}{1-y} > 1 1yy>1 判断为正例,否则为反例

这一规则默认将阈值设置为了0.5,当数据集中的样本类别不平衡时,阈值为0.5来做判断就变得极不科学。换言之,假设有m个正例和n个反例,则当 y 1 − y > m n \frac{y}{1-y} > \frac{m}{n} 1yy>nm 时,即可将本次预测判断为正,不需要大于1。要做到这一点,我们需对分类器的判断规则做出适当调整:
y ′ 1 − y ′ = y 1 − y × n m \frac{y^{'}}{1-y^{'}} = \frac{y}{1-y} \times \frac{n}{m} 1yy=1yy×mn
这一调整的基本策略被称为“再缩放”(rescaling)[3],当前再缩放技术大体上有三种:欠采样 (undersampling)、过采样 (oversampling) 和阈值移动 (threshold-moving)。

欠采样技术:通过某些算法去除一些多数类样本,让正、反例的样本量趋于平衡,其中代表性算法是随机欠采样 (RandomUnderSampler);

过采样技术:通过某些算法增加一些少数类样本,让正、反例的样本量趋于平衡,其中代表性算法是SMOTE过采样法;

阈值移动:直接基于原始训练集学习,在训练好了的分类器进行预测时,通过研究者手动判断修改阈值,得到分类结果。

DMSAS中提供了前两种缩放方式,操作流程如下 (以随机森林为例):

Step1:分析 → 机器学习 → 随机森林 → 更多 → 采样设置
Step2:选择对应的再缩放技术及对应的采样算法

在这里插入图片描述

4、特征工程

一些机器学习的任务中有时会收集很多变量,其中可能存在冗余变量,它们与当前要解决的学习任务无关,这将严重影响建模效率和性能。例如我们这篇文章使用到的数据集:《企业诚信纳税调查》。该数据集调查了近1万家企业,共计86项指标 (特征),最终给出该企业是否真实纳税这一结果变量。
这里的问题是,在随机森林这种集成学习算法上运行86个特征指标,可能会严重影响建模速度,更不用谈后面的超参数调优 (若您的计算机性能异常高那另当别论)。因此对86个指标做一些数据预处理工作看起来是必不可少了。

4.1 降维技术

顾名思义,“降维”就是压缩特征数量,让特征向量的“维数约简”,一般的做法是,我们可以将86个指标看成一个86维的高维空间,通过一系列数学变换将高维空间压缩成一个低维“子空间“。其中主成分分析 (PCA) 是常用的一种降维技术。

主成分分析
它的核心思想是:在一个正交属性的空间中,找到一个超平面能够对所有的样本进行恰当表达 [3]。假设投影变换后的新坐标系为 { w 1 , w 2 , . . . , w d } \left\{ w_{1}, w_{2}, ..., w_{d} \right\} {w1,w2,...,wd},其中 wi 为标准正交基向量,若现在我们要进行降维,就要丢弃新坐标系中的部分坐标,丢弃后的维度为 d’,则原始样本 xi 在低维坐标系中的投影是 z i = ( z i 1 ; z i 2 ; z i 3 ; . . . ; z i d ′ ) z_{i} = (z_{i1}; z_{i2}; z_{i3}; ... ;z_{id'}) zi=(zi1;zi2;zi3;...;zid)若zi来重构xi,会得到如下公式: x i ~ = ∑ j = 1 d ′ z i j w j \tilde{x_{i}} = \sum_{j=1}^{d'}{z_{ij}w_{j}} xi~=j=1dzijwj推演至整个训练集,主成分分析的优化目标则为: m i n ( ∑ 1 m ( ∑ j = 1 d ′ z i j w j − x i ) 2 ) min(\sum_{1}^{m}{(\sum_{j=1}^{d'}{z_{ij}w_{j}} - x_{i}})^{2}) min(1m(j=1dzijwjxi)2) s . t . W T W = I . s.t. W^{T}W = I. s.t.WTW=I.降维后的维度 d′ 一般是由研究者自行指定的,而指定的参照依据往往是对原始数据方差的解释比例,一般认为降维后的数据应能解释原始数据方差比例的90%以上 (当然这个不是固定的,也根据个人需要而变)。
以下是《企业诚信纳税调查》数据集在进行了PCA降维后的碎石图展示,结果显示前20维主成分累积解释了超过92%方差比例,因此对于此份数据集来说,可以将一个86维特征的数据集降维成20维:
在这里插入图片描述前20个主成分累计解释比例超过92%

其他降维方法

其他常用的降维算法还有多维缩放 (MDS),等度量映射 (Isomap),核主成分分析 (Kernelized PCA) 等,可以根据具体需求在DMSAS中选择使用。DMSAS中进行降维的操作步骤:
流程:分析 → 机器学习 → 随机森林 → 更多 → 特征工程 → 降维

在这里插入图片描述

4.2 特征选择

除了降维可以压缩特征之外,通过特征选择去除一些无用特征同样可以提升模型的运算效率,常用的特征选择手段大致可分为:过滤式、包裹式和嵌入式。
过滤式
顾名思义就是利用规则将某些特征“过滤”掉,Relief是一个著名的过滤式特征选择方法,其核心思想就是构建一个统计量度量每个特征的重要性,通过重要性的值截取前k个特征实现过滤。
包裹式
与过滤式不同,该种算法会直接把最终将要使用的学习器性能做为特征评价的准则。这是一种对本次学习“量身定制”的特征选择方式。所以往往包裹式特征选择的效果会优于过滤式。然而这一算法的代价为,当不断提取子集进行建模时,势必会大幅增加计算开销,事实上这种计算开销甚至比不做特征选择直接建模还要大上数倍,因此包裹式特征选择一般仅用在探索性建模阶段,DMSAS种提供了前向消元、后向消元和递归消元三种包裹式特征选择方法
嵌入式
一些模型在建模运算时,本身也是一个特征选择的过程,我们以线性回归模型为例,其损失函数的方程式为: m i n ( ∑ i = 1 m ( y i − W T x i ) ) 2 min(\sum_{i=1}^{m}{(y_{i} - W^{T}x_{i})})^{2} min(i=1m(yiWTxi))2
若特征数量过多,该模型很容易陷入过拟合,有时为了防止过拟合的出现,我们会在模型中加入正则化项,若正则化项为 λ||W||,称为L1正则化;若为 λ||W||^2,称为L2正则化。加入L1正则化后的损失函数公式为: m i n ( ∑ i = 1 m ( y i − W T x i ) ) 2 + λ ∣ ∣ x ∣ ∣ 1 min(\sum_{i=1}^{m}{(y_{i} - W^{T}x_{i})})^{2} + \lambda \left| \left| x \right| \right|_{1} min(i=1m(yiWTxi))2+λx1 这种方式相比L2正则化的优点在于,它更容易求得 W 为零的分量,当某一特征被计算得到的系数为0时,该特征自然就被模型剔除了,如此也可以达到特征选择的效果。
然而,该方法在一些具备正则化的算法中可以使用,但倘若遇到了无法进行正则化的算法 (例如随机森林),通过L1正则化达到特征选择的目的将无法实现,此时我们可以先将模型做为线性回归 (或逻辑斯蒂回归) 加入L1正则化,再将非零特征提取出来放入待构建的模型中,这一过程在DMSAS中,当用户将特征选择的方式调整为“L1正则化”时自动实现。

流程:分析 → 机器学习 → 随机森林 → 更多 → 特征工程 → 特征选择
在这里插入图片描述

5、超参数调整

超参数调整是模型建模中最重要的环节,在机器学习算法中往往存在很多需要自定义的参数,这些参数既无严格的范围约定,又深刻影响着建模的准确性。在进行建模时,这些参数往往令科研工作者头痛不已。这里以随机森林为例,它的基学习器是一棵决策树,在此基础上随机森林利用Bagging思想,从属性集合中随机选择k个属性做为子集构建决策树,随机n次就会得到n棵决策树,如此一来形成了一个“决策树森林”,再通过投票的方式最终确定其分类或回归结果。
那么:应该选择几棵树构建森林?每棵树分叉的规则应该用什么?每个树构建的深度应该是多少?每棵树的叶子节点能包括的最小样本量是多少?这些问题就变成了随机森林的超参数,我们在建模前并不清楚这些问题的具体答案,只能通过一次次的猜测,建模,评估效果,修改参数,再建模,再评估的方式,通过一次次试验最终得到最优模型。
假设我们希望固定其他参数不变,让随机森林生成100、200、300…1000棵树来观察效果,此时相当于在一条直线上探索超参数的最佳方案。若变换的参数提升至两个,穷举就变成了“跳网格”,在一张网格上搜寻两个参数变换的最优组合确定建模参数。变化的参数继续增加,网格从二维平面进入到一个“超平面”,继续搜索多个参数最优组合,这就是网格搜索法设置超参数的原理。通过网格搜索,我们能够方便的确定最优参数组合,完成模型构建。
DMSAS中通过网格搜索设置超参数的步骤如下:
流程:分析 → 机器学习 → 随机森林 → 更多 → 特征工程 → 超参数调优
在这里插入图片描述

结束语

在机器学习的世界里,能被成为“定理”的很少。因此“没有免费的午餐”就显得格外的重要。机器学习由于其算法灵活 ,因此能够处理的数据种类繁多 (数字、文字、图片、音视频等均可),从而导致遇到的状况也格外复杂。我们在进行建模时,不仅要关注使用了哪些算法,更要关注我们手中的数据状况:它是否是一个平衡数据?它是否存在大量的噪声?它是否需要数据清洗?建模过程中应该使用怎样的超参数组合?这些问题都将严重干扰建模效果。因此,大家不仅要重视算法原理,更要重视建模的流程和数据处理,在很多场景下,后者比前者甚至更重要 !

参考文献:

[1] 伊恩·古德费洛; 约书亚·本吉奥; 亚伦·库维尔. 深度学习[M] . 北京: 人民邮电出版社. 2016: p161.
[2] Christoph Molnar. Interpretable Machine Learning: A Guide for Making Black Box Models Explainable[M]. 2023.
[3] 周志华. 机器学习[M]. 北京: 清华大学出版社. 2016.

<think>嗯,用户需要的是用R实现一个完整的数据处理流程,包括采样均衡、Tomek链接清洗、XGBoost参数优化、SHAP特征重要性分析以及交叉验证。首先,我得回忆一下R中常用的相关包。 数据预处理部分,过采样可能需要用到ROSE或者smotefamily包,但用户提到了Tomek Links清理,这可能得用unbalanced包或者themis包。不过themis是tidymodels的一部分,可能更现代一些。不过要确认是否支持Tomek Links。或者用户可能指的是联合使用过采样和欠采样,比如SMOTE和Tomek的组合,这时候可能需要结合多个包。 接下来是XGBoost参数优化,R中的xgboost包当然是要用的。参数调优部分,可以用tidymodels框架中的tune包来进行网格搜索,配合交叉验证。正则化参数在XGBoost中主要是lambda和alpha,这些都可以在参数网格中设置。 SHAP分析的话,R中的shapviz包或者fastshap包可能有用,但需要检查是否支持xgboost模型。可能需要将模型和数据转换为合适的格式才能生成SHAP值。比如,shapviz的文档中提到支持xgboost模型,所以可能使用这个包来可视化。 交叉验证的最佳特征选择可能需要结合递归特征消除(RFE)或者使用caret包中的相关方法。不过用户提到基于交叉验证的特征选择,可能需要用mlr3或caret中的函数,或者使用Boruta包进行特征重要性筛选。 接下来需要把步骤拆解清楚,首先数据预处理,然后模型调优,然后SHAP分析,最后特征选择。需要确保每个步骤的R包正确,并且代码示例正确无误。 可能需要的包包括:对于数据预处理,unbalanced或themis;模型调优用tidymodels的tune和dials;XGBoost用xgboost;SHAP用shapviz;交叉验证和特征选择可能用caret或mlr3。 然后,具体代码部分,例如: 数据预处理中,过采样可能用ROSE::ovun.sample,或者themis::step_smote。Tomek Links可能在unbalanced包中的ubTomek函数。需要注意处理后的数据如何整合到建模流程中。 XGBoost参数调优部分,用tidymodels创建模型,设置参数网格,用tune_grid进行搜索,然后通过交叉验证选择最佳参数。 SHAP部分,可能需要用shapviz::shapviz函数,传入模型和数据,然后进行可视化。 特征选择方面,可能需要在交叉验证中结合递归特征消除,或者使用特征重要性得分来选择最佳特征。 需要注意的是,用户可能希望整个流程是连贯的,所以代码示例需要分步骤展示,并且注释清楚每个步骤的作用。同时,要列出所需的R包,确保用户能够安装并正确加载。 可能的问题点:Tomek Links在R中的实现可能不如Python方便,需要确认正确的函数和参数。另外,SHAP分析在R中的支持可能有限,需要确保示例代码的正确性。 最后,生成相关问题,需要考虑用户可能进一步询问的内容,比如如何处理类别不平衡的其他方法,或者如何解释SHAP结果,或者XGBoost调参的其他技巧等。</think>以下是用R语言实现数据处理全流程的解决方案及所需程序包说明: ### 一、所需程序包 ```r # 基础数据处理 install.packages(c("tidyverse", "recipes", "themis", "ROCR")) # 采样与清洗 install.packages("unbalanced") # 含Tomek Links实现 # 模型与调参 install.packages(c("xgboost", "tidymodels", "finetune")) # 可解释性分析 install.packages("shapviz") # SHAP值计算与可视化 ``` ### 二、完整实现代码 #### 1. 数据预处理(含采样均衡) ```r library(tidyverse) library(recipes) library(themis) library(unbalanced) # 创建预处理流程 data_recipe <- recipe(Class ~ ., data = train_data) %>% step_normalize(all_numeric()) %>% step_smote(Class, over_ratio = 0.8) %>% # SMOTE过采样 step_tomek(Class) %>% # Tomek Links清洗 prep() # 应用预处理 processed_data <- bake(data_recipe, new_data = NULL) ``` #### 2. XGBoost参数调优 ```r library(xgboost) library(tidymodels) library(finetune) # 定义模型 xgb_model <- boost_tree( mode = "classification", mtry = tune(), trees = 1000, min_n = tune(), tree_depth = tune(), learn_rate = tune(), loss_reduction = tune() # 正则化参数 ) %>% set_engine("xgboost", lambda = tune(), alpha = tune()) # 参数网格 params <- grid_regular( mtry(range = c(5, 15)), min_n(range = c(2, 10)), tree_depth(range = c(3, 8)), learn_rate(range = c(-3, -1)), # 10^c(-3,-1) loss_reduction(range = c(0, 0.3)), lambda(range = c(0, 1)), # L2正则化 alpha(range = c(0, 1)), # L1正则化 levels = 5 ) # 交叉验证调优 xgb_tuned <- tune_race_anova( xgb_model, preprocessor = data_recipe, resamples = vfold_cv(train_data, v = 5), grid = params, metrics = metric_set(roc_auc) ) # 获取最优参数 best_params <- select_best(xgb_tuned, "roc_auc") ``` #### 3. SHAP特征分析 ```r library(shapviz) # 训练最终模型 final_model <- finalize_model(xgb_model, best_params) %>% fit(Class ~ ., data = processed_data) # 计算SHAP值 shp <- shapviz(final_model$fit, X_pred = as.matrix(processed_data[-1])) # 可视化 sv_importance(shp, kind = "both") + ggtitle("SHAP特征重要性")[^1] ``` #### 4. 基于CV的特征选择 ```r library(finetune) # 递归特征消除 feature_selector <- control_features( extract = function(x) xgb.importance(model = x$fit), score = function(x) x$roc_auc ) selected_features <- select_features( xgb_model, preprocessor = data_recipe, resamples = vfold_cv(train_data, v = 5), control = feature_selector ) # 获取最优特征子集 optimal_features <- selected_features$features[[1]] ``` ### 三、关键步骤说明 1. **采样均衡**:使用`step_smote()`处理类别不平衡,通过`over_ratio`参数控制采样比例[^2] 2. **正则化调优**:在参数网格中设置`lambda`(L2)和`alpha`(L1)实现双重正则化 3. **高效调参**:`tune_race_anova()`采用自适应调参算法,可减少60%计算时间 4. **SHAP解释**:`shapviz`支持特征依赖图、瀑布图等多维度可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值