作者:胡言  R语言中文社区专栏作者

知乎ID:https://www.zhihu.com/people/hu-yan-81-25

前言

本次实践学习并练习使用R语言rpart包构建决策树,寻找决定高薪合同的技术统计元素。

期间用到了过采样方法解决目标样本量太少的问题,并应用了AUC、KS、混肴矩阵、精确度等模型评价指标,算是决策树的一次比较完备的实例实践。

废话少说,上代码:

载入包

#载入分析所需要的包
library(dplyr)
library(devtools)
library(woe)
library(ROSE)
library(rpart)
library(rpart.plot)
library(ggplot2)
require(caret)
library(pROC)

使用Rmarkdown写code时我喜欢把整个工程用到的包都在最开始的地方载入,可以设置(include=FALSE)不展示这部分代码,好处是通篇比较干净整洁。

本文用到的数据依旧是为2016-2017赛季NBA300多为球员的技术统计,感谢简书用户“牧羊的男孩”(点击阅读原文获取)。

以下为“牧羊的男孩”提供的数据字段解释,非常感谢!


dat_nba<-read.csv('nba_2017_nba_players_with_salary.csv')
dat_nba$cut_salary<-ifelse(dat_nba$SALARY_MILLIONS>15,1,0)
dat_nba$cut_salary<-as.factor(dat_nba$cut_salary)
dat_nba<-select(dat_nba,-PLAYER,-SALARY_MILLIONS,-TEAM)
cat('目标变量:\n')
summary(dat_nba$cut_salary)
cat('\n')
names(dat_nba)

目标变量:

  1. 0 1

  2. 291 51

  • [1] "X" "Rk" "POSITION" "AGE" "MP" "FG"

  • [7] "FGA" "FG." "X3P" "X3PA" "X3P." "X2P"

  • [13] "X2PA" "X2P." "eFG." "FT" "FTA" "FT."

  • [19] "ORB" "DRB" "TRB" "AST" "STL" "BLK"

  • [25] "TOV" "PF" "POINTS" "GP" "MPG" "ORPM"

  • [31] "DRPM" "RPM" "WINS_RPM" "PIE" "PACE" "W"

计算IV值

#install_github("riv","tomasgreif")
#library(devtools)
#library(woe)
IV<-iv.mult(dat_nba,"cut_salary",TRUE)   #原理是以Y作为被解释变量,其他作为解释变量,建立决策树模型
iv.plot.summary(IV)

过采样办法

#install.packages("ROSE")
#library(ROSE)
# 过采样&下采样
datt1<-dat_nba
table(datt1$cut_salary)
data_balanced_both <- ovun.sample(cut_salary ~ ., data = datt1, method = "both", p=0.5,N=342,seed = 1)$data
table(data_balanced_both$cut_salary)

原始样本正负比例:

  • 0 1

  • 291 51

过采样后正负比例:

  • 0 1

  • 183 159

#library(rpart)#设置随机分配,查分数据为train集和test集#
dat=data_balanced_both
smp_size <- floor(0.6 * nrow(dat))
set.seed(123)
train_ind <- sample(seq_len(nrow(dat)), size = smp_size)
train <- dat[train_ind, ]
test <- dat[-train_ind, ]
dim(train)
dim(test)fit<-(cut_salary~.)
rtree<-rpart(fit,minsplit=10, cp=0.03,data=train)
printcp(rtree)#library(rpart.plot) #调出rpart.plot包
rpart.plot(rtree, type=2) 

Warning message:

In strsplit(code, "\n", fixed = TRUE) :

input string 1 is invalid in this locale

  • [1] 205 37

  • [1] 137 37

Classification tree:

rpart(formula = fit, data = train, minsplit = 10, cp = 0.03)

Variables actually used in tree construction:

[1] FT GP PF TRB WINS_RPM

Root node error: 93/205 = 0.45366

n= 205

CP nsplit rel error xerror xstd

  • 1 0.548387 0 1.00000 1.00000 0.076646

  • 2 0.118280 1 0.45161 0.50538 0.064717

  • 3 0.043011 2 0.33333 0.40860 0.059826

  • 4 0.032258 3 0.29032 0.34409 0.055878

  • 5 0.030000 5 0.22581 0.33333 0.055156

#检验预测效果#
pre_train<-predict(rtree,type = 'vector') #type = c("vector", "prob", "class", "matrix"),
table(pre_train,train$cut_salary)#检验test集预测效果#
pre_test<-predict(rtree, newdata = test,type = 'vector')
table(pre_test, test$cut_salary)#检验整体集预测效果#
pre_dat<-predict(rtree, newdata = datt1,type = 'class')
table(pre_dat, datt1$cut_salary)

train集: 0 1

  • 99 8

  • 13 85

test集 0 1

  • 60 13

  • 11 53

pre_dat 0 1

  • 237 10

  • 54 41

评价决策树

result=datt1
result$true_label=result$MobDr1to6_od15
result$pre_prob=pre_dat
#install.packages("gmodels")
TPR <- NULL
FPR <- NULL
for(i in seq(from=1,to=0,by=-0.1)){#判为正类实际也为正类TP <- sum((result$pre_prob >= i) * (result$true_label == 1)) #判为正类实际为负类FP <- sum((result$pre_prob >= i) * (result$true_label == 0))#判为负类实际为负类TN <- sum((result$pre_prob < i) * (result$true_label == 0)) #判为负类实际为正类FN <- sum((result$pre_prob < i) * (result$true_label == 1)) TPR <- c(TPR,TP/(TP+FN))FPR <- c(FPR,FP/(FP+TN))
}max(TPR-FPR)  #KS#library(ggplot2)
ggplot(data=NULL,mapping = aes(x=seq(0,1,0.1),y=TPR))+geom_point()+geom_smooth(se=FALSE,formula = y ~ splines::ns(x,10), method ='lm')+geom_line(mapping = aes(x=seq(0,1,0.1),y=FPR),linetype=6)

KS值为:

[1] 0.3277339

# 找到KS值对应的切分点:
for (i in seq(0,10,1)){print(i)print(TPR[i]-FPR[i])
}
## 混肴矩阵
result$pre_to1<-ifelse(result$pre_prob>=0.7,1,0)
#require(caret)
xtab<-table(result$pre_to1,result$true_label)
confusionMatrix(xtab)

[1] 0

numeric(0)

  • [1] 1

  • [1] 0

  • [1] 2

  • [1] 0

  • [1] 3

  • [1] 0.6066303

  • [1] 4

  • [1] 0.6183546

  • [1] 5

  • [1] 0.6183546

  • [1] 6

  • [1] 0.6183546

  • [1] 7

  • [1] 0.6183546

  • [1] 8

  • [1] 0.6183546

  • [1] 9

  • [1] 0.6183546

  • [1] 10

  • [1] 0.6183546

Confusion Matrix and Statistics

0 1

0 237 10

1 54 41

Accuracy : 0.8129

95% CI : (0.7674, 0.8528)

No Information Rate : 0.8509

P-Value [Acc > NIR] : 0.9772

Kappa : 0.4561

Mcnemar's Test P-Value : 7.658e-08

  • Sensitivity : 0.8144

  • Specificity : 0.8039

  • Pos Pred Value : 0.9595

  • Neg Pred Value : 0.4316

  • Prevalence : 0.8509

  • Detection Rate : 0.6930

  • Detection Prevalence : 0.7222

  • Balanced Accuracy : 0.8092

  • 'Positive' Class : 0

## roc曲线及AUC
#library(pROC)
datt1_pro<-predict(rtree, newdata = datt1,type = 'prob')
datt1$pre_prob<-datt1_pro[,2]
modelroc <- roc(datt1$cut_salary,datt1$pre_prob)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE)

#设置随机分配,查分数据为train集和test集#
dat=datt1
smp_size <- floor(0.5 * nrow(dat))
train_ind <- sample(seq_len(nrow(dat)), size = smp_size)
train_2 <- dat[train_ind, ]
test_2 <- dat[-train_ind, ]
dim(train_2)
dim(test_2)#检验预测效果#
pre_train_2<-predict(rtree,newdata=train_2,type = 'vector')
table(pre_train_2,train_2$cut_salary)#检验test集预测效果#
pre_test_2<-predict(rtree, newdata = test_2,type = 'vector')table(pre_test_2, test_2$cut_salary)pre_train_2p<-predict(rtree,newdata=train_2,type = 'prob')
train_2$pre<-pre_train_2p[,2]
modelroc <- roc(train_2$cut_salary,train_2$pre)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE)pre_test_2p<-predict(rtree, newdata = test_2,type = 'prob')
test_2$pre<-pre_test_2p[,2]
modelroc <- roc(test_2$cut_salary,test_2$pre)
plot(modelroc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE)
  • [1] 171 38

  • [1] 171 38

  • pre_train_2 0 1

  • 1 114 2

  • 2 31 24

  • pre_test_2 0 1

  • 1 123 8

  • 2 23 17



公众号后台回复关键字即可学习

回复 爬虫             爬虫三大案例实战  
回复 Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

R语言决策树:NBA球员如何拿到大合同相关推荐

  1. R语言决策树、bagging、随机森林模型在训练集以及测试集的预测结果(accuray、F1、偏差Deviance)对比分析、计算训练集和测试集的预测结果的差值来分析模型的过拟合(overfit)情况

    R语言决策树.bagging.随机森林模型在训练集以及测试集的预测结果(accuray.F1.偏差Deviance)对比分析.计算训练集和测试集的预测结果的差值来分析模型的过拟合(overfit)情况 ...

  2. R语言-决策树-party包

    1.首先解释下熵和吉尼系数在决策树的功用 决策树学习的关键是如何选择最优的划分属性.通常,随着划分过程的不断进行,我们希望决策树的内部分支节点所包含的样本尽可能属于同一类别,即节点的"纯度& ...

  3. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

  4. R语言----决策树与随机森林详解

    决策树 首先区分树模型和线性模型的区别: 线性模型: 对所有特征给予权重相加得到一个新的值 (例:逻辑回归通过大于某一概率阈值的划分为一类,小于某一概率阈值的为另一类) 逻辑回归只能找到线性的分割 ( ...

  5. R语言决策树(ID3、CART、C4.5、C5.0)算法使用举例

    1.环境及数据准备 #环境变量 rm(list = ls());#清空变量空间#载入所需R Rackages library(rattle) library(rpart) library(rpart. ...

  6. R语言——决策树模型

    决策树(Tree Nodels)是一种创建树状模型的方法,它使用'基尼不纯度'(Gini Impurity)或信息增益(Information Gain)等标准对节点进行递归分割,以创建树状模型.决策 ...

  7. R语言决策树(ID3)

    数据来源自<数据挖掘:方法与应用> 导入Rstudio中: library(tidyverse) df = readxl::read_xlsx("datas/student.xl ...

  8. R语言中文社区2018年终文章整理(作者篇)

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...

  9. R语言CART决策树、随机森林、chaid树预测母婴电商平台用户寿命、流失可视化

    全文链接:http://tecdat.cn/?p=31644 借着二胎政策的开放与家庭消费升级的东风,母婴市场迎来了生机盎然的春天,尤其是母婴电商行业,近年来发展迅猛(点击文末"阅读原文&q ...

  10. 数据分析-R语言资料整理

    独家分享--48页PPT解密数据可视化! Excel图表快捷操作小技巧 基于随机森林的分类与回归 R语言制作网页 ggplot2:可视化设计师的神器,了解一下 [译]R包介绍:Online Rando ...

最新文章

  1. 在html中引入css、js和jQuery的方法
  2. java什么叫内部对象,java – 函数对象的内部类中的变量/对象会发生什么?
  3. python入门——条件语句、for、while循环4
  4. PHP安装加载yaf扩展
  5. 加来道雄 基因编辑 纳米机器人_基因编辑,人工制造超人?科学正在成为新迷信...
  6. OpenCV YOLO DNN(yolo_object_detection)
  7. Android音频开发(4):如何存储和解析wav文件
  8. 【秘诀】我进公司到现在都尽量避免遇上和同事撞单
  9. Github | 基于Pytorch可微分计算机视觉库
  10. LOJ 2339 「WC2018」通道——边分治+虚树
  11. kafka connect分布式安装
  12. RS编码的matlab仿真
  13. APM代码调试知识点汇总
  14. Effective Java(第三版) 学习笔记 - 第六章 枚举和注解 Rule34~Rule41
  15. oracle v session表,Oracle技术之V$SESSION_LONGOPS超过系统时间
  16. Android IMEI和MEID获取问题记录
  17. 苹果状态栏HTML,iphoneX 适配客户端H5页面的方法教程
  18. QCC51XX---如何修改MDE的主题
  19. Raspberry Pi Pico SDK开发-PIO介绍
  20. 关于线程的interrupt与sleep问题

热门文章

  1. 人生苦短,我用 Chrome!
  2. 电子书下载:MySQL5权威指南(第3版)
  3. 开源 - WPF报表引擎
  4. javascript-mqtt
  5. 使用js切割URL的参数
  6. ★★停止动画和停止所有动画$(selector).stop() 详解
  7. 05-不借用第三个变量实现两个变量值互换(运算符)
  8. 紧急救援 L2-001 dijkstra 打印路径 最短路条数 权值
  9. 并发编程---死锁||递归锁---信号量---Event事件---定时器
  10. linux ssh远程无密码登陆无效