1 分類
1.1 決策樹分類
library(party)
set.seed(2)
data(iris)
#隨機(jī)抽取訓(xùn)練集和測(cè)試集
index<-sample(1:nrow(iris),100)
train<-iris[index,]
test<-iris[-index,]
#建立C4.5決策樹模型
ctree.model <- ctree(Species ~ ., data <- train)
#輸出決策樹圖
plot(ctree.model, type <- "simple")
決策樹
#預(yù)測(cè)結(jié)果
train_predict <- predict(ctree.model) # 訓(xùn)練數(shù)據(jù)集
test_predict <- predict(ctree.model, newdata <- test) # 測(cè)試數(shù)據(jù)集
#輸出訓(xùn)練數(shù)據(jù)的分類結(jié)果和混淆矩陣
train_predictdata <- cbind(train, predictedclass=train_predict)
train_confusion <- table(actual <- train$Species, predictedclass <- train_predict)
#判對(duì)率
sum(diag(prop.table(train_confusion)))
#[1] 0.96
#輸出測(cè)試數(shù)據(jù)的分類結(jié)果和混淆矩陣
test_predictdata <- cbind(test, predictedclass=test_predict)
test_confusion <- table(actual <- test$Species, predictedclass <- test_predict)
#判對(duì)率
sum(diag(prop.table(test_confusion)))
#[1] 0.96
1.2 神經(jīng)網(wǎng)絡(luò)分類
library(nnet)
data("iris")
set.seed(2)
#抽取訓(xùn)練集和測(cè)試集
ind = sample(2,nrow(iris),replace = TRUE,prob = c(0.7,0.3))
trainset = iris[ind == 1,]
testset = iris[ind == 2,]
#預(yù)測(cè)結(jié)果
iris.nn = nnet(Species ~ .,data = trainset,size = 2,rang = 0.1,decay = 5e-4,maxit = 200)
summary(iris.nn)
#輸出測(cè)試數(shù)據(jù)的分類結(jié)果和混淆矩陣
iris.predict = predict(iris.nn,testset,type = "class")
nn.table = table(testset$Species,iris.predict)
#判對(duì)率
sum(diag(prop.table(nn.table)))
#[1] 0.9347826
1.3 貝葉斯分類
data("iris")
set.seed(123) #設(shè)置隨機(jī)種子
#抽取訓(xùn)練集和測(cè)試集
ind = sample(2,nrow(iris),replace = TRUE,prob = c(0.7,0.3))
traindata = iris[ind == 1,]
testdata = iris[ind == 2,]
# 使用naiveBayes函數(shù)建立樸素貝葉斯分類模型
library(e1071) # 加載e1071包
naiveBayes.model <- naiveBayes(Species ~ ., data = traindata) # 建立樸素貝葉斯分類模型
# 預(yù)測(cè)結(jié)果
train_predict <- predict(naiveBayes.model, newdata = traindata) # 訓(xùn)練數(shù)據(jù)集
test_predict <- predict(naiveBayes.model, newdata = testdata) # 測(cè)試數(shù)據(jù)集
# 輸出訓(xùn)練數(shù)據(jù)的分類結(jié)果和混淆矩陣
train_predictdata <- cbind(traindata, predictedclass = train_predict)
train_confusion <- table(actual = traindata$Species, predictedclass = train_predict)
#判對(duì)率
sum(diag(prop.table(train_confusion)))
#[1] 0.9811321
# 輸出測(cè)試數(shù)據(jù)的分類結(jié)果和混淆矩陣
test_predictdata <- cbind(testdata, predictedclass = test_predict)
test_confusion <- table(actual = testdata$Species, predictedclass = test_predict)
#判對(duì)率
sum(diag(prop.table(test_confusion)))
#[1] 0.8863636
1.4 總結(jié)
1.所有在對(duì)iris數(shù)據(jù)集分(聚)類研究中尾膊,setosa均可以完全正確分(聚)類斩松,而另外兩類則會(huì)出現(xiàn)不同程度的誤差瞻凤,這也是導(dǎo)致整個(gè)研究模型出現(xiàn)誤差的原因;
2.在使用的三種分類研究方法中溯香,決策樹模型的效果最優(yōu)鲫构,因此可以使用該方法進(jìn)行鳶尾花數(shù)據(jù)集的分類預(yù)測(cè)研究。
2 聚類
2.1 K-means
library(cluster)
#去除原有的factor類型的種類變量
df<-iris[,-5]
head(df)
#確定最佳聚類數(shù)目
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") + geom_vline(xintercept = 3, linetype = 2)
#設(shè)置隨機(jī)數(shù)種子玫坛,保證實(shí)驗(yàn)的可重復(fù)進(jìn)行
set.seed(12)
#利用k-means進(jìn)行聚類
km_result <- kmeans(df,3)
print(km_result)
#提取類標(biāo)簽并且與原始數(shù)據(jù)進(jìn)行合并
mydf <- cbind(iris, cluster = km_result$cluster)
head(mydf)
#查看每一類的數(shù)目
table(mydf$cluster)
#進(jìn)行可視化展示
fviz_cluster(km_result, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)
k-means
table<-table(mydf$Species,mydf$cluster)
sum(diag(prop.table(table))) #判對(duì)率
#[1] 0.8933333
2.2 K-medoids
library(cluster)
#去除原有的factor種類變量
kmedf<-iris[,-5]
head(kmedf)
#分為三類
fit_pam=pam(kmedf,3)
fit_pam[1:length(fit_pam)]
#分類情況
summary(fit_pam)
mykmedf <- cbind(iris, cluster =fit_pam$clustering)
head(mykmedf)
#查看每一類的數(shù)目
table(mykmedf$cluster)
#進(jìn)行可視化展示
fviz_cluster(fit_pam, data = mykmedf,
palette = c("#2E9Fdf", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)
K-medoids
#判對(duì)率
kmetable<-table(mykmedf$Species,mykmedf$cluster)
sum(diag(prop.table(kmetable)))
[1] 0.8933333
2.3 層次聚類
hirisdata<-iris[,-5]
head(hirisdata)
#使用自底向上的聚類方法處理數(shù)據(jù)集:
hc = hclust(dist(hirisdata,method = "euclidean"),method = "ward.D2")
#調(diào)用plot函數(shù)繪制聚類樹圖
plot(hc,hang = -0.01,cex =0.7)
層次聚類
#定義count函數(shù),計(jì)算分類準(zhǔn)確率
mycount<-function(num,min,max)
{
count=0
{
for (x in num) {
if(x>=min&x<=max)
count<-count+1
}
}
count
}
num1<-hc$order[1:50]
count1<-mycount(num1,1,50)
num2<-hc$order[51:100]
count2<-mycount(num2,101,150)
num3<-hc$order[101:150]
count3<-mycount(num3,51,100)
#準(zhǔn)確率
correctrate<-(count1+count2+count3)/150
[1] 0.8
#驗(yàn)證標(biāo)準(zhǔn)化之后對(duì)聚類結(jié)果的影響
hirisdata<-scale(hirisdata)
#準(zhǔn)確率
correctrate<-(count1+count2+count3)/150
[1] 0.52
2.4 總結(jié):
1.在對(duì)鳶尾花數(shù)據(jù)集進(jìn)行聚類時(shí)结笨,K-means、K-medoids兩種聚類方法的正確率相同湿镀,可見在數(shù)據(jù)集離群點(diǎn)和噪音不大的情況下炕吸,二者聚類效果基本相同,但當(dāng)出現(xiàn)離群點(diǎn)和噪音時(shí)勉痴,應(yīng)該考慮K-medoids聚類方法赫模;
2.鳶尾花數(shù)據(jù)集進(jìn)行聚類分析時(shí),劃分聚類效果優(yōu)于層次聚類蒸矛;
3.對(duì)于量綱不一致的數(shù)據(jù)瀑罗,應(yīng)進(jìn)行標(biāo)準(zhǔn)化,但對(duì)于量綱一致的數(shù)據(jù)雏掠,標(biāo)準(zhǔn)化之后結(jié)果并不一定優(yōu)于未標(biāo)準(zhǔn)化的數(shù)據(jù)得到的結(jié)果斩祭。