分类算法与数据挖掘

################分类算法与数据挖掘---也就是回归于分类算法--对应于Y的0/1算法

####分类分析---原因,想看看这个人的个人信用,预测会不会还钱,考虑贷不贷给他钱0/1;

####依据一些别的特征,预测是不是有肿瘤0/1  类似logistic回归y=0/1---不过数据分成训练集和验证集

#####包-rpart、rpart.plot、party

#####对这些y=0/1分类变量的方法:逻辑回归、决策树、随机森林、支持向量机、神经网络、贝叶斯、K近邻。

#数据准备--- UCI机器学习数据库

loc<-"https://archive.ics.uci.edu/ml/machine-learning-databases/"

ds<-"breast-cancer-wisconsin/breast-cancer-wisconsin.data"

url<-paste(loc,ds,sep = "")

loc

ds

url

breast<-read.table(url,sep = ",",header = F,na.strings = "?")

names(breast)<-c("ID","clumpThickness","sizeUniformity","shapeUniformity","maginalAdhesion","singleEpithelialCellSize",

                "bareNuclei","blandChromatin","normalNucleoli","mitosis","class")

df<-breast[-1]

df$class<-factor(df$class,levels = c(2,4),labels = c("benign","malignant"))

##set.seed()保证操作的可重复性,别人也用1234,产生的随机数就和你的一样了

set.seed(1234)

##选取训练集--从nrow(df)中即699个数字中,无放回(如果放回,replace=T)抽取0.7*nrow(df)个数字

train<-sample(nrow(df),0.7*nrow(df))

##提取出训练集的列表

df.train<-df[train,]

###提取验证集的列表

df.validate<-df[-train,]

  ##看看各个列表的数目

table(df.train$class)

table(df.validate$class)

###方法一: 逻辑回归

  ###abcdef  glm(a~.)用.可以表示除了a之外的所有

##拟合:

fit_logit<-glm(class~.,data = df.train,family = binomial())

summary(fit_logit)

##用模拟的数据在新的数据集中,进行数据的验证: type = "response" 直接返回预测的概率值0~1之间

prob<-predict(fit_logit,df.validate,type="response")

prob

#3将概率大于0.5的定义为恶性肿瘤;概率小于0.5的定义为良性肿瘤,

logit.pred<-factor(prob>.5,levels = c(FALSE,TRUE),labels = c("benign","malignant"))

logit.pred

##3得出实际与预测的交叉表

logit.perf<-table(df.validate$class,logit.pred,dnn=c("Actual","Predicted"))

###预测出118个良,76个恶性

####  准确率为(76+118)/(129+81)=0.92 (76+118)/200=0.97

(76+118)/(129+81) ###有问题

(76+118)/200

###再回归来看 有几个模拟概率>0.05,不满足,可以删除再模拟,也可以用下面的方法

logit.fit.reduced<-step(fit_logit)

###决策树:两类-经典树,条件推断树

  ####经典树----rpart包做rpart()决策树;prune()做树枝的剪枝,得到预测误差最小的树枝

library(rpart)

set.seed(1234)

##生成树

dtree<-rpart(class~.,data = df.train,method="class",parms = list(split="information"))

dtree$cptable

plotcp(dtree)

###剪枝  依据dtree$cptable得到的cp复杂度参数=0.0125

dtree.pruned<-prune(dtree,cp=0.0125)

##3作图 prp做出最终的图

library(rpart.plot)

prp(dtree.pruned,type=2,extra = 104,fallen.leaves =TRUE,main="Decision Tree" )

##对验证集进行分类验证

dtree.pred<-predict(dtree.pruned,df.validate,type="class")

dtree.perf<-table(df.validate$class,dtree.pred,dnn = c("Actual","Predicted"))

dtree.perf

(122+79)/200

##3条件推断树 依据显著性分类;对比与经典的的包含为Y为其中一类的纯度分类划分 party包

library(party)

fit_ctree<-ctree(class~.,data = df.train)

plot(fit_ctree,main="Conditional Inference Tree")

ctree.pred<-predict(fit_ctree,df.validate,type="response")

ctree.perf<-table(df.validate$class,ctree.pred,dnn = c("Actual","Predicted"))

ctree.perf

###随机森林法:决策树预测类别众数纪委随机森林预测的样本单元的类别

  ###sandomForest包 randomForest()  默认生成500棵树

library(randomForest)

set.seed(1234)

###na.action=na.roughfix  有缺省值用对应列的中位数代替

fit.forest<-randomForest(class~.,df.train,na.action=na.roughfix,importance=TRUE)

fit.forest

###给出变量重要性  看看哪个变量重要

importance(fit.forest,type = 2)

##队验证集进行验证

forest.pred<-predict(fit.forest,df.validate)

forest.perf<-table(df.validate$class,forest.pred,dnn = c("Actual","Predicted"))

forest.perf

##支持向量机SVM  投影  x,y->  x2,2k开方*xy,y2 ->变为三维数据 Z1,Z2,Z3

### kernlab包ksvm函数-强大  或者e1071包中的svm()函数 简单

library(e1071)

set.seed(1234)

fit.svm<-svm(class~.,df.train)

fit.svm

svm.predit<-predict(fit.svm,na.omit(df.validate))

svm.perf<-table(na.omit(df.validate)$class,svm.predit,dnn = c("Actual","Predicted"))

svm.perf

#####选择调和参数  改进支持向量机参数

set.seed(1234)

tuned<-tune.svm(class~.,data=df.train,gamma = 10^(-6:1),cost = 10^(-10:10))

#3得到gamma=0.01,cost=1模拟最好

tuned

fit.tuned.svm<-svm(class~.,data = df.train,gamma=0.01,cost=1)

svm.tuned.pred<-predict(fit.tuned.svm,na.omit(df.validate))

svm.tuned.perf<-table(na.omit(df.validate)$class,svm.tuned.pred,dnn = c("Actual","Predicted"))

svm.tuned.perf

##############################################

###选择预测最好的解---评价二分类准确性

performance<-function(table,n=2){

  if(!all(dim(table)==c(2,2)))

    stop("Must be a 2x2 table")

  tn=table[1,1]

  fp=table[1,2]

  fn=table[2,1]

  tp=table[2,2]

  sensitivity=tp/(tp+fn)

  specificity=tn/(tn+fp)

  ppp=tp/(tp+fp)

  npp=tn/(tn+fn)

  hitrate=(tp+tn)/(tp+tn+fp+fn)

  result<-paste("Sensitivity=",round(sensitivity,n),

                "\nSpecificity=",round(specificity,n),

                "\nPositive Predictive Value=",round(ppp,n),

                "\nNegative Predictive Value=",round(npp,n),

                "\nAccuracy=",round(hitrate,n),"\n",sep="")

  cat(result)

}

performance(logit.perf) 

performance(dtree.perf)

performance(ctree.perf)

performance(forest.perf)

performance(svm.perf)

performance(svm.tuned.perf)

################################################

###rattle包进行数据挖掘 library(rattle)-> rattle()进入GUI图形交互界面

#数据准备 

loc<-"https://archive.ics.uci.edu/ml/machine-learning-databases/"

ds<-"breast-cancer-wisconsin/breast-cancer-wisconsin.data"

url<-paste(loc,ds,sep = "")

breast<-read.table(url,sep = ",",header = F,na.strings = "?")

names(breast)<-c("ID","clumpThickness","sizeUniformity","shapeUniformity","maginalAdhesion","singleEpithelialCellSize",

                "bareNuclei","blandChromatin","normalNucleoli","mitosis","class")

df<-breast[-1]

df$class<-factor(df$class,levels = c(2,4),labels = c("benign","malignant"))

breast$class<-factor(df$class,levels = c(2,4),labels = c("benign","malignant"))

library(rattle)

rattle()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容