三、决策树

# 建立路径
setwd("F:\\8#机器学习\\第二步\\第一版1.0\\")


# 读取数据
set.seed(126)
user <- read.csv("完整版1.0_进模型_30.csv",stringsAsFactors = F)


# 查看数据
View(user[1:10,])
table(user$index_1)
summary(user)
str(user)


# 查看变量类型
sapply(user,class)


# 选择要的变量
user <- user[,c(6:57,59:64)]


# 将预测变量转化为因子
user$index_1 <- as.factor(user$index_1)


# 决策树可以对全数据做模型、也可手动分类做模型、缺失值和极值可以手动处理
# 举例 (此处不用)
user <- user[user$flag==1 | user$flag==2 | user$flag==3,]
user$flag <- NULL


##将数据分为训练集和测试集,比例为7:3
set.seed(123)
ind=sample(2, nrow(user), replace=TRUE, prob=c(0.7, 0.3))
user_train <- user[ind==1,]
user_test <- user[ind==2,]


# 检查训练和测试集中的亏损的比例情况
prop.table(table(user$index_1))
prop.table(table(user_train$index_1))
prop.table(table(user_test$index_1))


##################################训练模型###############################
# 安装包并且载入包
install.packages("C50")
library(C50)


# 构建模型
# model <- C5.0(train, class, trials = 1, costs = NULL)
# train: 一个包含训练数据的数据框
# class: 包含训练数据每一行的分类的一个因子向量
# trials: 为一个可选数值,用于控制自助法循环的次数(默认为1)
# costs: 为一个可选矩阵,用于给出与各种类型错误相对应的成本
# 该函数返回一个C5.0模型对象,该对象可用于预测


# 预测模型
# prediction <- predict(m, test, type = "class")
# m: 由C5.0(train, class, trials = 1, costs = NULL) 训练的一个模型
# test: 一个包含测试数据的数据框,该数据框和用来创建分类器的训练数据有相同的特征
# type: 取值为“”或者“”标示预测是最可能的类别值或者是原始的预测概率
# 该函数返回一个向量,根据参数type的取值,该向量含有预测的类别值或者原始的预测概率
# 实际操作
user_model <- C5.0(user_train[-53], user_train$index_1) # 准确率69.8  正确率 52%
user_model
# summary函数查看树的详细信息
summary(user_model)


# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")


#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))




##########################################################################################
######################################模型提升##############################################
##########################################################################################
##########################trials 循环#######################
user_model <- C5.0(user_train[-53], user_train$index_1,trials=20) # 准确率71.9  正确率 55.9%
user_model
# summary函数查看树的详细信息
summary(user_model)


# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")


#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))


##########################minCases #######################


user_model <- C5.0(user_train[-53], user_train$index_1,trials=20,
                   control= C5.0Control(minCases = 400)) # 准确率72.6  正确率 59.3%
user_model
# summary函数查看树的详细信息
summary(user_model)


# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")


#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))


##############几个参数调节#################
# 可调参数 CF 复杂度minCases每个叶节点上的最小样本数,trials:bosting次数
tc <- C5.0Control(subset = F,CF = 0.07,winnow = F,noGlobalPruning=F,minCases =488)
user_model <- C5.0(user_train[-53], user_train$index_1,trials=20,
                   control= tc) # 准确率72.6  正确率 59.3%
user_model
# summary函数查看树的详细信息
summary(user_model)


# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")


#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))


# 安装RWeka包 (出现问题的解决办法)
Sys.setenv(JAVA_HOME='E:\\java') # for 64-bit version
install.packages("rJava")
library(rJava)
install.packages("RWeka",dependencies = TRUE)
library(RWeka)


# OneR
kk <- user_train[,c(53,56:58)]
names(kk) <- c("index_1","a1","b1","c1")
mushroom_1R <- OneR(index_1 ~ ., data = kk)
mushroom_1R
summary(mushroom_1R)


# JRip
mushroom_JRip <- JRip(index_1 ~ ., data = kk)
mushroom_JRip
summary(mushroom_JRip)


# 根据前面的重要度从新选择变量
library(C50)
mushroom_c5rules <- C5.0(type ~ odor + gill_size, data = mushrooms, rules = TRUE)
summary(mushroom_c5rules)


#-----可以增加成本矩阵---------
error_cost <- matrix(c(0, 1, 2, 0), nrow = 2)
error_cost
# 建立模型
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)


# 成本矩阵中,预测正确的赋予0,将1预测为0的情况赋予成本2,将0预测为1的情况赋予成本1。
error_cost <- matrix(c(0, 1, 1.1, 0), nrow = 2)


# 简单画图
plot(user_cost,main="Whole Tree")

plot(user_boost20,subtree = 3,main="NO.3")
plot(user_cost,subtree = 13,main="NO.13")


########## 最优参数查找 ##############

rbind_zpp <- c() 
rbind_null <- c()
i = 250
for (ll in 1:20){
  # i = 
  k = 0.01
  for(l in 1:20){
    tc <- C5.0Control(subset = F,CF = k,winnow = F,noGlobalPruning=F,minCases = i)
    
    user_boost20 <- C5.0(user_train[-53], user_train$index_1, trials = 20,
                         control = tc)
    
    user_boost_pred20 <- predict(user_boost20, user_test)
    zpp <- table(user_test$index_1,user_boost_pred20)
    rbind_null$mincases <- i
    rbind_null$CF <- k
    rbind_null$zhunquelv <- zpp[2,1]/(zpp[1,1]+zpp[2,1])
    rbind_null$zhengquelv <- (zpp[1,1]+zpp[2,2])/(zpp[1,1]+zpp[2,1]+zpp[1,2]+zpp[2,2])
    rbind_null_1 <- as.data.frame(rbind_null)
    
    rbind_zpp <- rbind(rbind_zpp,rbind_null_1)
    k <- k + 0.01
    print(k)
  }
  i <- i + 14
  print(i)
}


write.csv(rbind_zpp,"最优参数.csv")
# 建立路径
setwd("F:\\8#机器学习\\第二步\\第一版1.0\\")

# 读取数据
set.seed(126)
user <- read.csv("完整版1.0_进模型_30.csv",stringsAsFactors = F)

# 查看数据
View(user[1:10,])
table(user$index_1)
summary(user)
str(user)

# 查看变量类型
sapply(user,class)

# 选择要的变量
user <- user[,c(6:57,59:64)]

# 将预测变量转化为因子
user$index_1 <- as.factor(user$index_1)

# 决策树可以对全数据做模型、也可手动分类做模型、缺失值和极值可以手动处理
# 举例 (此处不用)
user <- user[user$flag==1 | user$flag==2 | user$flag==3,]
user$flag <- NULL

##将数据分为训练集和测试集,比例为7:3
set.seed(123)
ind=sample(2, nrow(user), replace=TRUE, prob=c(0.7, 0.3))
user_train <- user[ind==1,]
user_test <- user[ind==2,]

# 检查训练和测试集中的亏损的比例情况
prop.table(table(user$index_1))
prop.table(table(user_train$index_1))
prop.table(table(user_test$index_1))

##################################训练模型###############################
# 安装包并且载入包
install.packages("C50")
library(C50)

# 构建模型
# model <- C5.0(train, class, trials = 1, costs = NULL)
# train: 一个包含训练数据的数据框
# class: 包含训练数据每一行的分类的一个因子向量
# trials: 为一个可选数值,用于控制自助法循环的次数(默认为1)
# costs: 为一个可选矩阵,用于给出与各种类型错误相对应的成本
# 该函数返回一个C5.0模型对象,该对象可用于预测

# 预测模型
# prediction <- predict(m, test, type = "class")
# m: 由C5.0(train, class, trials = 1, costs = NULL) 训练的一个模型
# test: 一个包含测试数据的数据框,该数据框和用来创建分类器的训练数据有相同的特征
# type: 取值为“”或者“”标示预测是最可能的类别值或者是原始的预测概率
# 该函数返回一个向量,根据参数type的取值,该向量含有预测的类别值或者原始的预测概率
# 实际操作
user_model <- C5.0(user_train[-53], user_train$index_1) # 准确率69.8  正确率 52%
user_model
# summary函数查看树的详细信息
summary(user_model)

# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")

#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))


############################################################################################
######################################模型提升##############################################
############################################################################################
##########################trials 循环#######################

user_model <- C5.0(user_train[-53], user_train$index_1,trials=20) # 准确率71.9  正确率 55.9%
user_model
# summary函数查看树的详细信息
summary(user_model)

# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")

#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))

##########################minCases #######################

user_model <- C5.0(user_train[-53], user_train$index_1,trials=20,
                   control= C5.0Control(minCases = 400)) # 准确率72.6  正确率 59.3%
user_model
# summary函数查看树的详细信息
summary(user_model)

# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")

#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))


##############几个参数调节#################
# 可调参数 CF 复杂度minCases每个叶节点上的最小样本数,trials:bosting次数
tc <- C5.0Control(subset = F,CF = 0.07,winnow = F,noGlobalPruning=F,minCases =488)
user_model <- C5.0(user_train[-53], user_train$index_1,trials=20,
                   control= tc) # 准确率72.6  正确率 59.3%
user_model
# summary函数查看树的详细信息
summary(user_model)

# 简单查看树模型 可查看分支树
plot(user_model,subtree = 3,main="NO.3")

#利用训练的模型对测试数据集进行预测,调用gmodel软件包评价模型预测准确性:
user_pred <- predict(user_model, user_test)
library(gmodels)
CrossTable(user_test$index_1, user_pred, prop.chisq = FALSE, prop.c = FALSE, 
           prop.r = FALSE, dnn = c("实际", "预测"))

# 安装RWeka包 (出现问题的解决办法)
Sys.setenv(JAVA_HOME='E:\\java') # for 64-bit version
install.packages("rJava")
library(rJava)
install.packages("RWeka",dependencies = TRUE)
library(RWeka)

# OneR
kk <- user_train[,c(53,56:58)]
names(kk) <- c("index_1","a1","b1","c1")
mushroom_1R <- OneR(index_1 ~ ., data = kk)
mushroom_1R
summary(mushroom_1R)

# JRip
mushroom_JRip <- JRip(index_1 ~ ., data = kk)
mushroom_JRip
summary(mushroom_JRip)

# 根据前面的重要度从新选择变量
library(C50)
mushroom_c5rules <- C5.0(type ~ odor + gill_size, data = mushrooms, rules = TRUE)
summary(mushroom_c5rules)



#-----可以增加成本矩阵---------
error_cost <- matrix(c(0, 1, 2, 0), nrow = 2)
error_cost
# 建立模型
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)


# 成本矩阵中,预测正确的赋予0,将1预测为0的情况赋予成本2,将0预测为1的情况赋予成本1。
error_cost <- matrix(c(0, 1, 1.1, 0), nrow = 2)

# 简单画图
plot(user_cost,main="Whole Tree")

plot(user_boost20,subtree = 3,main="NO.3")
plot(user_cost,subtree = 13,main="NO.13")

########## 最优参数查找 ##############

rbind_zpp <- c() 
rbind_null <- c()
i = 250
for (ll in 1:20){
  # i = 
  k = 0.01
  for(l in 1:20){
    tc <- C5.0Control(subset = F,CF = k,winnow = F,noGlobalPruning=F,minCases = i)
    
    user_boost20 <- C5.0(user_train[-53], user_train$index_1, trials = 20,
                         control = tc)
    
    user_boost_pred20 <- predict(user_boost20, user_test)
    zpp <- table(user_test$index_1,user_boost_pred20)
    rbind_null$mincases <- i
    rbind_null$CF <- k
    rbind_null$zhunquelv <- zpp[2,1]/(zpp[1,1]+zpp[2,1])
    rbind_null$zhengquelv <- (zpp[1,1]+zpp[2,2])/(zpp[1,1]+zpp[2,1]+zpp[1,2]+zpp[2,2])
    rbind_null_1 <- as.data.frame(rbind_null)
    
    rbind_zpp <- rbind(rbind_zpp,rbind_null_1)
    k <- k + 0.01
    print(k)
  }
  i <- i + 14
  print(i)
}

write.csv(rbind_zpp,"最优参数.csv")










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值