- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 1148 个
- 通用积分
- 0
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 502 点
- 帖子
- 22
- 精华
- 0
- 在线时间
- 34 小时
- 注册时间
- 2016-3-10
- 最后登录
- 2019-7-18
高中生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
 - 1148 个
- 通用积分
- 0
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 502 点
- 帖子
- 22
- 精华
- 0
- 在线时间
- 34 小时
- 注册时间
- 2016-3-10
- 最后登录
- 2019-7-18
 | 开心 2016-4-8 09:30:30 |
|---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
|
经管之家送您一份
应届毕业生专属福利!
求职就业群
感谢您参与论坛问题回答
经管之家送您两个论坛币!
+2 论坛币
代码如下:
- #模型训练代码
- rm(list=ls(all=TRUE))#首先删除工作空间中所有对象
- train_data=read.csv("train2.csv",header=TRUE)
- test_data=read.csv("test111.csv",header=TRUE)#分别导入训练和测试数据
- glm.fit=glm(IS_INTERNET_TV~NET_MONTHS+AGE+GENDER+IS_SCHOOLUSER+STABLE_SCORE,data=train_data,family=binomial(link="logit"))
- #用训练数据生成模型, glm(formula,family=family(link=function),data=),formula是准则的意思,family是概率分布的意思,binomial分布族
- #link="logit"连接logit函数
- summary(glm.fit)
- n=nrow(train_data)#训练数据的行数,也就是样本数量
- R2<-1-exp((glm.fit$deviance-glm.fit$null.deviance)/n)#计算Cox-Snell拟合优度
- cat("Cox-Snell R2=",R2,"\n") #cat的用法:cat(……,file="myfile",append=false),示例:firstname<-c("Jane") +cat("hello",firstname,"\n)
- cat("Nagelkerke R2=",R2,"\n")
- R2<-R2/(1-exp((-glm.fit$null.deviance)/n))#计算Nagelkerke拟合优度,我们在最后输出这个拟合优度值(拟合率)
- p<-predict.glm(glm.fit,test_data)#用模型对测试数据进行预测
- p<-exp(p)/(1+exp(p))#计算因变量的值
- predict_table<-transform(test_data,predict=ifelse(p<=0.5,0,1))#可以自己设定阈值,如P值大于0.6
- write.table(predict_table,file = "predict_01.csv",sep=",",row.names = FALSE,quote = FALSE)#输出预测结果文件
- #计算准确率:被分对的样本数除以所有的样本数
- t_table<-table(predict_table$IS_INTERNET_TV,predict_table$predict)
- sum_diag<-sum(diag(t_table))#计算对角线
- sum<-sum(table(predict_table$IS_INTERNET_TV,predict_table$predict))
- accuracy<-sum_diag/sum
- print(accuracy)
- #计算精确度
- precision<-(t_table[1])/(colSums(t_table)[1])
- print(precision)
- #计算召回率
- recall<-(t_table[1])/(rowSums(t_table)[1])
- print(recall)
- data.rezult<-c(accuracy,precision,recall)
- print(data.rezult)
复制代码结果如下:
- > #模型训练代码
- > rm(list=ls(all=TRUE))#首先删除工作空间中所有对象
- > train_data=read.csv("train2.csv",header=TRUE)
- > test_data=read.csv("test111.csv",header=TRUE)#分别导入训练和测试数据
- >
- > glm.fit=glm(IS_INTERNET_TV~NET_MONTHS+AGE+GENDER+IS_SCHOOLUSER+STABLE_SCORE,data=train_data,family=binomial(link="logit"))
- > #用训练数据生成模型, glm(formula,family=family(link=function),data=),formula是准则的意思,family是概率分布的意思,binomial分布族
- > #link="logit"连接logit函数
- > summary(glm.fit)
- Call:
- glm(formula = IS_INTERNET_TV ~ NET_MONTHS + AGE + GENDER + IS_SCHOOLUSER +
- STABLE_SCORE, family = binomial(link = "logit"), data = train_data)
- Deviance Residuals:
- Min 1Q Median 3Q Max
- -3.0499 -0.7299 0.3088 0.6863 2.9859
- Coefficients:
- Estimate Std. Error z value Pr(>|z|)
- (Intercept) -1.392e+00 6.322e-02 -22.013 <2e-16 ***
- NET_MONTHS 6.098e-03 4.048e-04 15.064 <2e-16 ***
- AGE -1.251e-02 1.518e-03 -8.239 <2e-16 ***
- GENDER -1.617e-04 1.524e-05 -10.606 <2e-16 ***
- IS_SCHOOLUSER -3.075e-02 9.863e-02 -0.312 0.755
- STABLE_SCORE 1.564e-01 2.394e-03 65.338 <2e-16 ***
- ---
- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
- (Dispersion parameter for binomial family taken to be 1)
- Null deviance: 26964 on 20548 degrees of freedom
- Residual deviance: 18352 on 20543 degrees of freedom
- (1951 observations deleted due to missingness)
- AIC: 18364
- Number of Fisher Scoring iterations: 5
- > n=nrow(train_data)#训练数据的行数,也就是样本数量
- >
- > R2<-1-exp((glm.fit$deviance-glm.fit$null.deviance)/n)#计算Cox-Snell拟合优度
- > cat("Cox-Snell R2=",R2,"\n") #cat的用法:cat(……,file="myfile",append=false),示例:firstname<-c("Jane") +cat("hello",firstname,"\n)
- Cox-Snell R2= 0.3180192
- > cat("Nagelkerke R2=",R2,"\n")
- Nagelkerke R2= 0.3180192
- >
- > R2<-R2/(1-exp((-glm.fit$null.deviance)/n))#计算Nagelkerke拟合优度,我们在最后输出这个拟合优度值(拟合率)
- >
- > p<-predict.glm(glm.fit,test_data)#用模型对测试数据进行预测
- > p<-exp(p)/(1+exp(p))#计算因变量的值
- >
- > predict_table<-transform(test_data,predict=ifelse(p<=0.5,0,1))#可以自己设定阈值,如P值大于0.6
- > write.table(predict_table,file = "predict_01.csv",sep=",",row.names = FALSE,quote = FALSE)#输出预测结果文件
- >
- > #计算准确率:被分对的样本数除以所有的样本数
- > t_table<-table(predict_table$IS_INTERNET_TV,predict_table$predict)
- > sum_diag<-sum(diag(t_table))#计算对角线
- > sum<-sum(table(predict_table$IS_INTERNET_TV,predict_table$predict))
- > accuracy<-sum_diag/sum
- > print(accuracy)
- [1] 0.7257071
- > #计算精确度
- > precision<-(t_table[1])/(colSums(t_table)[1])
- > print(precision)
- 0
- 0.9153751
- > #计算召回率
- > recall<-(t_table[1])/(rowSums(t_table)[1])
- > print(recall)
- 0
- 0.6680012
- > data.rezult<-c(accuracy,precision,recall)
- > print(data.rezult)
- 0 0
- 0.7257071 0.9153751 0.6680012
复制代码请教诸位大神,为什么print(precision)和print(recall)为什么变成数组了?怎么能把那个0去掉?
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
|
|
-
总评分: 论坛币 + 20
查看全部评分
|