推广

【Lesson1】R 机器学习流程及案例实现

iseeyu3年前 (2024-02-21)推广143

image.png

将Data分成Train与Test两部分。主要花费的精力是在Train数据集上,因为需要找到一个合适的模型来拟合Train数据,对模型参数进行不断调整,达到该数据的最优。同时还需要考虑resampling,至于为什么要resample,其实就是:针对本数据模型的 可以达到0.99,但是只适用于本数据,不能外推,所以the goal is not to “predict” the data you have in hand, but to develop a model that will predict new datasets.。
有时候,变量较多,或者变量会存在相关系,那么就会涉及到变量的处理,Pre-processing(这也是一个相当麻烦的过程)。

1.数据拆分Train与Test数据集
2.Train数据集模型选择与调参
3.模型预测Test数据集

在上述模型调整好以后,嗯,那我们可以对Test数据进行预测了。看下模型预测效果。这里预测的效果优越是需要根据预测变量类型来选择不同的评估指标,主要分为分类与回归两种。然后绘制相应的RMSE曲线或者ROC曲线,来展示模型的预测性能。

当然了,在医学上机器学习应用远不止于此,还需探究变量间的关联性,称之为explanation ML,在后面篇幅会介绍。。

案例操作

下面以caret举例,Caret包的优点:主要使用train函数,集中多个模型。其中函数中定义了模型与调节参数,所以只要替换模型与参数,即可调用不同模型。因此省去了因运行不同模型而学习不同的packages。另外对于预测变量不管是分类变量还是连续性变量,Caret都可以构建。
本次操作利用pdp包里面的pima数据集进行演示。该数据收集了
392例女性糖尿病患者的临床指标,包括年龄,血糖,胰岛素及血压等指标。主要是通过临床指标预测患者是否患糖尿病。

1. 数据拆分

将pima数据进行预处理,丢弃NA,glucose转成分类变量(glucose > 149==”High”)。然后利用createDataPartition()将数据分成train(80%)与test (20%)两个部分。

library(tidyverse)
library(caret)
library(pdp)
### get data
data(pima)
df=pima %>% na.omit() %>% as.tbl() %>% 
  mutate(glucose=as.factor(ifelse(glucose>143,"High","Low")))
### splitdata
set.seed(13)
samp = createDataPartition(df$diabetes, p = 0.8, list = FALSE)
train = df[samp,]
test = df[-samp,]

2. 模型构建

这里使用train()函数,因变量为diabetes,自变量默认选择全部,需要提前使用trainControl()设置resampling方法,里面涉及"boot", "cv", "LOOCV", "LGOCV"等一系列方法,这里我们设置为5-fold cross validation–method = "cv", number = 5。
因为diabetes是二分类变量,我们采用gbm算法,然后用AUC来评估训练模型的优越性。

myControl = trainControl(method = "cv", 
                         classProbs=T,
                         number = 5,
                         summaryFunction=prSummary,
                         verboseIter = FALSE)
set.seed(12)
model_gbm = train(diabetes ~ ., 
                  data = train,
                  method = "gbm",
                  trControl = myControl,
                  verbose = F,
                  #tuneGrid = gbm.grid,
                  metric = "ROC")

需要提示的是,这里为了减少运行时间,并没有进行tuning 参数调节。gbm模型主要涉及三个参数,可以把参数放入gird,然后一个一个测试,得出每个参数对应调节下的AUC值,根据最大的AUC,选择对应的模型参数。当然如果不设置grid,train会自动选择最适参数。

gbm.grid <- expand.grid(interaction.depth = c(1,2,8),
                         n.trees = c(50, 100, 150, 200, 250, 300),
                         shrinkage = 0.1,
                         n.minobsinnode = 20)
 head(gbm.grid)
 
 model_gbm = train(diabetes ~ ., 
                  data = train,
                  method = "gbm",
                  trControl = myControl,
                  verbose = F,
                  tuneGrid = gbm.grid,
                  metric = "ROC")

接下来,我们看下model_gbm,这里面储存了我们所要的信息。gbm最合适参数

image.png

3. 模型预测

### Predict
pred = predict(model_gbm,newdata=test)
confusionMatrix(pred,test$diabetes)
Confusion Matrix and Statistics

          Reference
Prediction neg pos
       neg  47   9
       pos   5  17
                                          
               Accuracy : 0.8205          
                 95% CI : (0.7172, 0.8983)
    No Information Rate : 0.6667          
    P-Value [Acc > NIR] : 0.001942        
                                          
                  Kappa : 0.58            
                                          
 Mcnemar's Test P-Value : 0.422678        
                                          
            Sensitivity : 0.9038          
            Specificity : 0.6538          
         Pos Pred Value : 0.8393          
         Neg Pred Value : 0.7727          
             Prevalence : 0.6667          
         Detection Rate : 0.6026          
   Detection Prevalence : 0.7179          
      Balanced Accuracy : 0.7788          
                                          
       'Positive' Class : neg      

4. 变量重要性与解释

这里显示, “insulin” “glucose” 与 “mass” 对模型结果影响较大。具体怎么样的影响需要借助于边际效应的关系。pdp-案例:Explaining Black-Box Machine Learning Models – Code Part 1: tabular data + caret + iml

 varImp(model_gbm)
 plot(varImp(model_gbm))

image.png

4. 多个模型比较

有时候需要多个模型放在一起比较。

set.seed(12)
model_gbm = train(diabetes ~ ., 
                  data = train,
                  method = "gbm",
                  trControl = myControl,
                  verbose = F,
                  #tuneGrid = gbm.grid,
                  metric = "ROC")
model_svm = train(diabetes ~ ., 
                 data=train,
                 method = "svmRadial",
                 trControl = myControl,
                 tuneLength = 8,
                 metric = "ROC")
                                   
model_rda = train(diabetes ~ ., 
                 data=train,
                 method = "rda", 
                 trControl = myControl,
                 tuneLength = 4,
                 metric = "ROC")
                                    
# compare all
all=resamples(list(GBM = model_gbm,SVM=model_svm,RDA = model_rda))
summary(all)
Call:
summary.resamples(object = all)

Models: GBM, SVM, RDA 
Number of resamples: 5 

AUC 
         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
GBM 0.8499955 0.8508692 0.8611407 0.8696634 0.8868533 0.8994585    0
SVM 0.8300370 0.8355535 0.8563194 0.8584288 0.8608459 0.9093879    0
RDA 0.8252053 0.8387715 0.8963407 0.8772405 0.9124427 0.9134421    0

F 
         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
GBM 0.7804878 0.8235294 0.8297872 0.8193452 0.8314607 0.8314607    0
SVM 0.8043478 0.8089888 0.8181818 0.8208631 0.8222222 0.8505747    0
RDA 0.7380952 0.8048780 0.8181818 0.8073135 0.8275862 0.8478261    0

Precision 
         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
GBM 0.7500000 0.7872340 0.7872340 0.7876843 0.8000000 0.8139535    0
SVM 0.7400000 0.7659574 0.7708333 0.7763243 0.7826087 0.8222222    0
RDA 0.7380952 0.7800000 0.7826087 0.7851408 0.8000000 0.8250000    0

Recall 
         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
GBM 0.7619048 0.8333333 0.8809524 0.8571429 0.8809524 0.9285714    0
SVM 0.8571429 0.8571429 0.8809524 0.8714286 0.8809524 0.8809524    0
RDA 0.7380952 0.7857143 0.8571429 0.8333333 0.8571429 0.9285714    0

模型AUC

可以看出AUC最大的为gbm模型0.8739。

# ROC
# Build custom AUC function to extract AUC
# from the caret model object
library(pROC) 
test_roc = function(model, data) {
  roc(data$diabetes,
      predict(model, data, type = "prob")[, "pos"])
  
}

# Examine results for test set
model_list = list(GBM = model_gbm,SVM=model_svm,RDA = model_rda)

model_list_roc = model_list %>%
  map(test_roc, data = test)

model_list_roc %>%
  map(auc)

# plot
df_roc=c()
for (i in 1:length(model_list)) {
  a=test_roc(model_list[[i]],test)
  b=tibble(tpr=a$sensitivities,
           fpr=1-a$specificities,
           model=names(model_list)[i])
  
  df_roc=rbind(df_roc,b)
}

ggplot(data=df_roc,aes(x = fpr, y = tpr, group = model)) +
  geom_line(aes(color = model), size = 1) +
  geom_abline(intercept = 0, slope = 1, 
              color = "gray", size = 1)+
  labs(title = ("ROC Curves for all models"),
       x="False Positive Rate (1 - Specificity)",
       y="True Positive Rate (Sensivity or Recall)")

image.png

结语

这是Caret的使用,后续会介绍如何使用Tidymodel,将更简化操作,输入输出步骤。
未完待续。

Caret 参考

  1. Caret resampling介绍
  2. Caret基础介绍-Rebecca
  3. A Brief Introduction to caret 变量为连续性
  4. Caret Tune 参数 循环设置
  5. Kaggle Caret 实战
  6. Data Science and Predictive Analytics
  7. Evaluating Model Performance by Building Cross-Validation from Scratch【为什么要resampling 】

next

Using XGBoost with Tidymodels 结合Caret
Caret 案例Machine Learning for Insurance Claims
Caret 预测Amesing huose-多个caret模型
Predict the Residential Sale Price of Properties in Ames
Multivariate Adaptive Regression Splines
Ames housing prediction
Tidymodels: tidy machine learning in R

pdp

pdp-案例:Explaining Black-Box Machine Learning Models – Code Part 1: tabular data + caret + iml
Chapter 5: Model-Agnostic Methods
Shining a light on the “Black Box” of machine learning
Gradient Boosting Machines
Partial dependence plots for tidymodels-based xgboost
【VIP】–Variable importance plots: an introduction to vip
【pdp】: An R Package for
VIP: Classification of Student Success with Caret

Handling Class Imbalance data

主要两种,1.resample方法增加精度。2.采用PROC评估。

  1. 【Weighting and sampling】-Handling Class Imbalance with R and Caret – An Introduction
  2. 【PROC】-Handling Class Imbalance with R and Caret – Caveats when using the AUC

Tidymodel with R

https://www.tidymodels.org/learn/
https://www.tmwr.org/
https://algotech.netlify.app/blog/tidymodels/

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57166.html

相关文章

西安企业做百度推广,一个月花三千和花三万到底差在哪?

4|最近跟几个西安的老板聊天,发现一个挺有意思的现象:同样做百度推广,有人一个月花三千块,询盘不断;有人一个月砸三万,水花都没见着。问他们区别在哪,大多数人说不清楚,只知道'钱花了,没效果'。 5| 6|百度推广这东西,说复杂也复杂,说简单也简单。核心就一件事:让你的潜在客户搜某个词的时候,你的信息...

我想当策划,大学应该选什么专业?

我想当策划,大学应该选什么专业?

学,广告,传播,公关,这些专业其实都可以。另外也可以学像汉语言文学,以及一些跟文学相关的一些专业,会对你找工作有帮助。但是,你想从事这个这份职业,除了专业的学习之外,更多的是,你要在上学的时候积极参与一些更营销策划相关的社会实践。比如说你可以做一些兼职,比如说帮别人去写稿,...

服装市场营销策略分析,“定位不慎满盘皆输”

服装市场营销策略分析,“定位不慎满盘皆输”

不同的区域需要不同的策略,而不同的营销策略需要不同的销售思路来配合。因此,在研究女装产品销售思路之前,最好先对于市场与营销策略做一次深入地了解。1.市场区域化(market segmentation):目标营销的第一步,是将整个市场拆分成若干个同性质的小市场。2.目标市场的...

晚间悦读丨你的思维方式,决定你的人生高度!

晚间悦读丨你的思维方式,决定你的人生高度!

越长大,越发现,能够决定你人生高度的,往往是你的认知层次。 你的认知在哪个层级,你的人生就处在什么状态。你认知的高度,决定了你人生的高度。 那如何才能升级方式、提升认知能力呢?可以从这三个方面做出改变。 NO. 1 改变态度 有人...

编写项目营销策划方案六大要点

编写项目营销策划方案六大要点

现在商业发展非常迅速,的需求非常的大,但是要做好营销策划是有一定难度的,我把自己做营销策划的一些体会在这里分享给朋友们。营销策划方案六大要点我们先说项目营销策划方案这个话题。大部分的营销策划人都是在企业里工作,大部分项目之初都是来源于一个想法,创始人、老板或者创始团队的一个...

【商场营销策划】如何进行商场营销策划?

【商场营销策划】如何进行商场营销策划?

商场是策划者们关注的永恒话题,那么究竟该如何作好商场营销策划呢?掌握以下这几点营销策略设计原则,至关重要!1.义利兼顾的原则。商场在获取利润的同时要充分考虑到消费者的合法利益和商场的长远利益。在作商场活动营销策略方案的时候应该将这一点作为首要的原则。对商场有利而对顾客不利的...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片