我们已向您的注册邮箱发送了一封邮件,请您注意接收邮件
成为第位DCer 现在就去完善资料,参与平台更多活动吧!
请绑定手机号,体验更优质的DC竞赛服务
DC小运营QQ
3511403105
商务合作QQ
623576393(张先生)
客服邮箱
service@datacastle.cn
商务合作电话
13520118900(张先生)
公司地址
成都市高新区天府三街大源国际中心一期三栋1401号
竞赛圈 > 请大家指教
本人还是小小白,写的随机森林代码,用了五折交叉验证,还有并行计算,但是跑了一个周末也没有跑完,请大侠们多多批评指正
rm(list=ls())
setwd("D:\\competitions\\datacastle\\p2p")
train_x<-read.csv("train_x.csv",header=T)
train_y<-read.csv("train_y.csv",header=T)
train_y$y<-as.factor(unlist(train_y[2]))
#head(train_y)
fea<-read.csv("D:\\competitions\\datacastle\\p2p\\原始数据\\features_type.csv")
test<-read.csv("test_x.csv")
n<-nrow(train_x)
print("查看y中正负样本分布")
分布<-table(train_y[2])
cat("正负样本分布",分布)
比例<-prop.table(table(train_y[2]))
cat("正负样本比例",比例)
print("把train和test中类别型变量变成factor")
train和test特征<-rbind(train_x,test)
因子化train和test<-sapply(train和test特征[,-1][,fea[2]=='category'],as.factor)
#head(因子化train和test,n=2)
print("把因子化的数据和连续型的合并")
ok_data<-cbind(train和test特征[,-1][,!fea[2]=='category'],因子化train和test)
ok_data1<-cbind(train和test特征[,1],ok_data)
#dim(ok_data)
names(ok_data1)[1]<-"uid"
训练x<-ok_data1[1:n,]
合并训练x和y<-merge(训练x,train_y,by.x="uid",by.y="uid")
#dim(合并训练x和y)
print("生成平衡的训练数据")
rep<-合并训练x和y[合并训练x和y$y==0,]
for (i in 1:6){
rep<-rbind(rep,合并训练x和y[合并训练x和y$y==0,])
}#生成向上样本
上升后<-rbind(合并训练x和y,rep)#形成新添加7次负样本总数的样本
dim(上升后)
set.seed(100)
print("生成训练样本和测试样本")
train_n<-sample(n,n*0.7,replace=FALSE)#对数据随机抽样
training<-上升后[train_n,]
testing<-上升后[-train_n,]
#dim(上升后)
library(parallel)
library(doParallel)
library(foreach)
library(randomForest)
library(pROC)
library(ROCR)
library(caret)
training<-training[,-1]
search<-function(training,
k_folds=5,mtry1=floor(sqrt(ncol(training[,-c(1,11400)]))),
mtry2=1.5*floor(sqrt(ncol(training[,-c(1,11400)]))),ntree1=300,ntree2=600){
#构造 grid
tune_grid<-expand.grid(mtry=c(mtry1,mtry2),ntree=c(ntree1,ntree2))
#并行计算设置
n_cores<-detectCores()#查看电脑内核个数
cl<-makeCluster(n_cores)#使用核并且计算
registerDoParallel(cl)
#并行计算
results<-
foreach(grid=c(1:nrow(tune_grid)),
.packages=c("caret","pROC","randomForest"),
.combine=rbind,
.multicombine=T)%dopar%{
set.seed(1306)#Reproducibility
folds<-createFolds(y=training$y,k=k_folds)
ntree<-tune_grid[grid,"ntree"]
mtry<-tune_grid[grid,"mtry"]
auc_results<-NULL
search_results<-c()
#k折交叉验证
for(i in 1:k_folds){
train_cv<-training[-folds[[i]],]#交叉验证训练集合
test_cv<-training[folds[[i]],]
true_resp_cv<-test_cv$y
#随机森林
model_cv<-randomForest(data=train_cv,
y~.,
ntree=ntree,
mtry=mtry,
nodesize=50)
#预测
pred_cv<-predict(model_cv,test_cv,type="prob")[,2]
head(pred_cv,n=2)
#矩阵, AUC
roc_cv<-roc(true_resp_cv,pred_cv)#第一个参数是test中的真正y值,第二个参数是预测1的概率
auc_cv<-as.numeric(auc(roc_cv))
auc_results<-c(auc_results,auc_cv)
auc_results
}
return(c("auc"=sum(auc_results)/length(folds),#取十次交叉验证的auc平均值
"mtry"=mtry,
"ntree"=ntree))
stopCluster(cl)
return(results)
results<-search(training)
results
分享
数据科学征程,总有DC陪伴
商务合作 : 13520118900(张先生)
诚征英才 联系我们
扫一扫分享给周围朋友
提示
请确认是否缩小或放大浏览器比例,非100%浏览比例查看网页可能出现页面错乱