Py学习  »  机器学习算法

万字长文教你搞定机器学习!拿走不谢!

挑圈联靠 • 2 年前 • 266 次点击  

You jump, I......


空间转录组的旅程让我们先停一下,来让我们的视线回顾到机器学习上,今天晨曦将与大家一起运用mlr3包来体验一下完整的机器学习流程并拿真实数据进行演示,相信给位小伙伴如果有耐心完整跟下来,相信一定会有所收获


万字高能警告

引言

本次我们的真实数据来源于Kaggle上一个很经典的比赛Titanic - Machine Learning from Disaster,首先我们的第一步自然就是要了解我们的数据来思考我们应该用什么模型来解决这个问题


目的:根据数据构建一个模型来预测在泰坦尼克号沉没的时候存活的情况

数据:


我们可以很清楚的看到,整个数据包含两大类,总共10个变量,分别是:

1. 响应变量:生存状态(0:死亡;1:生存)

注意:在进行模型构建的时候,我们的习惯是把我们感兴趣/阳性结局标记为1

2. 预测变量:

a. pclass-票价(反映了社会经济地位)(1:上流;2:中产;3:平民)

b. sex-性别

c. Age-年龄

d. sibsp-亲人的数量(兄弟、姐妹、同父异母的妹妹)

e. parch-家庭成员的数量(父母、儿女)

f. ticket-船票编号

g. fare-票价

h. cabin-船舱编号

i. embarked-出发港口


好,到这里我们就了解了我们的数据都是什么,那么接下来,我们就开始尝试用代码来进行模型的构建


注意:各位小伙伴可以思考晨曦在构建模型的过程中的一些思考,说不定可以给你一丢丢帮助哦~

代码实战

#准备工作library(tidyverse)library(mlr3verse)library(paradox)library(knitr)library(dplyr)library(Hmisc)


晨曦解读

工欲善其事必先利其器~


###2.准备数据####train_org = read_csv("Kaggle/Titanic - Machine Learning from Disaster/train.csv")test_org = read_csv("Kaggle/Titanic - Machine Learning from Disaster/test.csv")


train_org


test_org


晨曦解读

注意,我们下载的数据比kaggle界面介绍的数据会多出几个变量,但是无关紧要(后续会删掉),然后测试集上是没有响应变量的


#Exploratory Data Analysis(EDA)Hmisc::describe(train_org)skimr::skim(train_org)


使用skim函数探索数据的结果如下:



晨曦解读

两种探索数据的函数,describe函数提供的信息更加全面,skim函数提供的信息则相对精简,各有所长,选择一种即可


#特征选择#首先我们需要剔除一些依照我们朴素的感觉觉得没有什么关系的预测变量train %  select(-c(PassengerId,Ticket,Cabin))#上述的三个预测变量和响应变量之间并没有什么关系,比如说船舱编号,船到都沉没了,你在哪个船舱能够幸免?#至于乘客ID因为和响应变量存在绝对的关系,因为乘客编号只对应一个乘客,然后这个乘客的死或者生是肯定的,所以对于这种编号类型的数据我们也是主张剔除


train



晨曦解读

然后这个时候我们再来想一个问题,名字这个预测变量重不重要?很显然你叫什么名字并不能够让你在还难中幸存下来,所以这个时候我们完全可以把名字变量直接去掉,但是,如果想要考虑的更深入,我们可以来观察一下名字这个变量


Braund,Mr.Owen Harris

Cumings,Miss.Laina


上述这两个名字很显然包含了一些重要信息——性别(或者说是状态——Mr:先生;Mrs:夫人;Miss:女士),而且很显然据我们的背景知识可以知道,泰坦尼克号沉没的时候,是首先让女性上了救护船,所以绝大多数幸存的是女性,那么这里面的信息很显然就和我们的响应变量有关系了,那么我们自然是需要提取这些信息的


#特征选择eq identity train$identity = sapply(identity, function(x) x[1])table(train$identity)




晨曦解读

这个时候我们又会面临一个问题,就是一个预测变量下含有太多的分类,因为我们在平时构架预测模型的时候,一个预测变量下的分类变量我们都是最好设置为两个(男或者女,生存或者死亡)因为这样才是最好计算且最合适的,所以我们这个分类变量的数目太多了,所以我们需要合并一下(简单来说就是把出现频率低的给直接合并掉)


eq = as.data.frame(table(train$identity))other_identity = eq[which(eq$Freq < 10), "Var1"]train[which(train$identity %in% other_identity), "identity"] train$identity = as.factor(train$identity)train %  select(-Name)table(train$identity)




晨曦解读

这个时候看起来就会舒服很多,然后我们再次通过select函数把Name变量去掉,然后我们的数据集就被整理成了下面这种形式



然后我们需要按照我们整理数据的流程把测试集也整理一下,也就是上面步骤的一个复刻


#整理测试集数据test %  select(-c(PassengerId,Ticket,Cabin))eq_test identity test$identity = sapply(identity, function(x) x[1])table(test$identity)      eq_test = as.data.frame(table(test$identity))other_identity = eq_test[which(eq_test$Freq < 10), "Var1"]test[which(test$identity %in% other_identity), "identity"] test$identity = as.factor(test$identity)test %  select(-c(Name))   table(test$identity)


test数据如下:



晨曦解读

到这里我们数据内容上就整理完毕了,我们做到了每一个预测变量我们都知道是什么意思,以及每一个预测变量内的数据都是和响应变量具有相关性的,那么我们接下来还需要考虑最后一点就是数据的形式


注意:模型本质上来说其实就是数学公式的具体化,所以依照我们最朴素的理解来说,其预测变量需要时数值型变量,那么为什么有的时候我们选择分类变量也可以呢,是因为R包自动帮助我们进行了转换,也就是所谓的哑变量,但是我们最好先把分类变量转化为因子的形式,这一点需要注意


#转换数据类型test$Embarked = as.factor(test$Embarked)test$Sex = as.factor(test$Sex)train$Embarked train$Sex train$Survived 


至此,我们的数据整理就结束了:内容+格式,以后我们每一次整理数据的时候只要从这两方面入手绝大部分问题都会被我们提前避开掉


那么下面我们就开始进行mlr3包的整体流程


Ps:各位小伙伴如果感兴趣mlr3包的具体细节话,欢迎在评论区留言,点赞多就加更哦~


#创建任务task 



#创建学习器lrn "classif.rpart",predict_type = "prob")#获取超参数列表lrn$param_set




晨曦解读

机器学习相对于我们普通的三大模型(线性、logistic、cox)其最大的魅力可能就是调节超参数了,我们可以通过调节超参数来让模型的性能得到更进一步的提高,当然这里我们先不着急调节超参数,我们再来探索一下我们创建的学习器里还有什么其它内容


#获取学习器拥有的特性lrn$properties#[1] "importance"        "missings"         #[3] "multiclass"        "selected_features"#[5] "twoclass"          "weights"


晨曦解读

这个意思就是学习器(随机森林)本身可以支持变量重要性筛选、缺失值的处理、多个响应变量、特征选择(自身)、二分类响应变量、权重等


注意:没有任何一个算法天生支持缺失值的处理,都是作者自行定义了出现缺失值的情况,比如说来源于rpart包的随机森林作者就定义了缺失值出现时应该如何,所以这个算法就支持了缺失值处理


#查看学习器lrn#: Classification Tree#* Model: -#* Parameters: xval=0#* Packages: mlr3, rpart#* Predict Type: prob#* Feature types: logical, integer,#  numeric, factor, ordered#* Properties: importance, missings,#  multiclass, selected_features, twoclass,#  weights


晨曦解读

通过前面的解释,现在学习器的内容我们大致就可以看懂了,然后接下来我们就需要拟合任务开始构建模型


#训练模型lrn$train(task)#模型信息在学习器里通过符号就可以调取其中的模型信息print(lrn$model)




#模型预测并获得模型性能评价指标pred $predict(task)pred$confusion#        truth#response   0   1


    
#       0 514 100#       1  35 242measure "classif.acc","classif.ce"))pred$score(measure)#classif.acc  classif.ce #  0.8484848   0.1515152


晨曦解读

注意,我们这个时候使用训练集构建模型,又用训练集测试模型,这个时候的模型评价指标属于“王婆卖瓜自卖自夸”,但是,虽然不是很准确,但是我们也已经大概知道了这个模型的一个性能评价,那么我们接下来就需要调节超参数


#调节超参数resampling "cv",folds = 10)#定义模型评价方式measure "classif.acc")#定义模型评价指标search_space  cp = p_dbl(lower = 0.001,upper = 0.1), minsplit = p_int(lower = 1,upper = 100))#定义超参数调优空间learner.tuned = AutoTuner$new( learner = lrn, resampling = resampling, measure = measure, search_space = search_space, terminator = trm("evals", n_evals = 100), tuner = tnr("random_search"))learner.tuned$train(task)#拟合任务开始调优#这一步过程是一个不断循环的过程,包括:随机搜索超参数组合→带入模型→10折交叉验证→得出模型性能→再重头开始更换超参数组合(直到迭代100次)learner.tuned$tuning_result#获取最佳超参数组合#            cp minsplit learner_param_vals  x_domain#1: 0.006658182       13           #   classif.acc#1:   0.8227091learner.tuned$predict(task)$confusion#获取混淆矩阵#         truth#response   0   1#       0 517  90#       1  32 252


晨曦解读

注意,我们这里的10折交叉验证是针对超参数调优的,最后获得的模型是模型性能评价指标最优下超参数的组合


#使用模型进行预测pred $predict_newdata(test)


晨曦解读

好,到这里我们就通过mlr3完成了整体的模型构建再到预测的部分,相信各位小伙伴经过这一趟流程下来,对于机器学习以及mlr3包的一些细节应该是有所体会了


随后的几期推文都是围绕着机器学习和空间转录组


Ps:取决于晨曦写完了哪篇.......呜呜QAQ


各位小伙伴还有感兴趣的内容也可以在评论区提问,如果恰好是晨曦有所了解的,也会写成推文来和各位小伙伴一起学习


那么这期推文到这里就结束了~


我是晨曦,我们下期再见


Ps:回复“kaggle1"可以得到本期推文的示例代码以及示例数据哦~






晨曦的空间转录组笔记系列传送门

1. 拿去耍!!空间转录组实战来了!你在实验室的装逼利器!

2. 来领你的空间转录组救急包!你的装逼速成教程来了!

3. 新贵分析!单细胞联合空转分析,R语言手把手教学,你学废了吗?



晨曦单细胞文献阅读系列

非肿瘤单细胞分析模板已到位!眼馋单细胞的小伙伴快来看!手把手教你产出第一篇单细胞SCI!

万字长文介绍单细胞高级分析!学会这个分析,搞定单细胞套路80%的难题!

太顶了!学会这篇Nature分析,帮你搞定一篇高分SCI!


晨曦碎碎念系列传送门(未完待续...)
1. 想白嫖单细胞生信文章?这五大源头数据库,是你发文章的源泉!高频预警!你一定要收藏!
2. 盘活国自然的新思路!你研究的热点真的是热点吗?大数据帮你定位!
3. 好家伙!90%以上审稿人都会问到的问题,今天帮你解决!就是这么齐齐整整!
4. 没想到!生信分组还有这个大坑!你被坑过吗?!
5. 关于富集分析这件事,我有话想说。。。
6. 好御好高级!CNS级别美图是如何炼成的?看这篇就懂了!
7. 化繁为简!一文帮你彻底搞懂机器学习!想发高分文章,这篇是基础!
8. 你不知道的机器学习算法!关键时候能救命!
9. 致命!芯片&测序的联合到底能不能联合分析?审稿人最爱用这刁难你!
10. 躲不过的树!80%的生信SCI中都见过它!你真的搞懂了吗?
11. Python or R? 哪个更适用于生信发文章?深入浅出给你讲透!
12. 生信和抖音是一样的算法原理?不仅让你成瘾,也能发高分文章!
13. 跟3-5分SCI相比,CNS里的生信玩的可太花了!其实简单的离谱!
14. 揭秘!小鼠和人的免疫浸润分析有何区别?看这篇就够了!
15. 临床预测模型中的宠儿!最常见的机器学习 算法,没有之一!直接拿来用 !
16. 临床预测模型评价,不只有ROC,这个指标你遗漏了吗?
17. 非肿瘤机器学习模板奉上!还不赶快产出2022年你的第一篇SCI?!
18. 拿去耍!!空间转录组实战来了!你在实验室的装逼利器!


晨曦单细胞笔记系列传送门

1. 首次揭秘!不做实验也能发10+SCI,CNS级别空间转录组套路全解析(附超详细代码!)

2. 过关神助!99%审稿人必问,多数据集联合分析,你注意到这点了吗?

3. 太猛了!万字长文单细胞分析全流程讲解,看完就能发文章!建议收藏!(附代码)

4. 秀儿!10+生信分析最大的难点在这里!30多种方法怎么选?今天帮你解决!

5. 图好看易上手!没有比它更适合小白入手的单细胞分析了!老实讲,这操作很sao!

6. 毕业救星!这个R包在高分文章常见,实用!好学!

7. 我就不信了,生信分析你能绕开这个问题!今天一次性帮你解决!


晨曦从零开始学画图系列传送门
1. 看完这篇,彻底掌握生信画图精髓!超级实用,我不许你不知道!
2. 想让SCI看上去更高逼格?这些绘图技巧你一定要知道!
3. 3min掌握SCI配色神技,学会你就是组会汇报上最靓的仔!

晨曦单细胞数据库系列传送门

1. 宝儿,5min掌握一个单细胞数据库,今年国自然就靠它了!(附视频)

2. 审稿人返修让我补单细胞数据咋办?这个神器帮大忙了!

3. 想白嫖、想高大上、想有高大上的SCI?这个单细胞数据库,你肯定用得上!(配视频)

4. What? 扎克伯格投资了这个数据库?炒概念?跨界生信?

5. 不同物种也能合并做生信?给你支个妙招,让数据起死回生!

6. 零成本装逼指南!单细胞时代,教你用单细胞数据库巧筛基因,做科研!

7. 大佬研发的单细胞数据库有多强? 别眼馋 CNS美图了!零基础的小白也能10分钟学会!

8. 纯生信发14分NC的单细胞测序文章,这个北大的发文套路,你可以试下!实在不行,拿来挖挖数据也行!

9. 如何最短时间极简白嫖单细胞分析?不只是肿瘤方向!十分钟教你学会!

10. 生信数据挖掘新风口!这个单细胞免疫数据库帮你一网打尽了!SCI的发文源头!




END

撰文丨晨   曦
排版丨四金兄
主编丨小雪球



欢迎大家关注解螺旋生信频道-挑圈联靠公号~




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/132440
 
266 次点击