我正在使用這個資料集(信用卡欺詐)并嘗試prediction model使用 k-means 聚類來訓練。但pre_model結果由clusterid標記。因此,當我嘗試通過 評估模型的性能時confusionMatrix,它會彈出一個錯誤,指出testing data and predicted result are not in same level. 那么,如何將labelin 預測結果轉換testdata$Class為1or 0(是否欺詐)而不是集群 ID?謝謝!
代碼:
data = read.csv("creditcard.csv")
data$Class <- as.factor(data$Class)
data_split <- createDataPartition(data$Class, times=1, p=0.8, list=F)
train_data <- data[data_split ,]
testdata <- data[-data_split ,]
scaled_data <- scale(train_data[-c(31)])
scaled_data <- as.matrix(scaled_data)
clust <- kmeans(scaled_data, centers = 9, nstart = 25)
pre_model <- cl_predict(clust , testdata)
confusionMatrix(testdata$Class, pre_model , positive='1')
K-means 聚類結果:
> Clustering vector:
[1] 7 7 6 6 7 7 8 8 3 8 6 3 6 7 7 8 7 8 7 6 6 7 7 7 3 7 7 6 7 7 7 7 7 7 7 7 7 7 7 7 3 7 7 7 8 7
[47] 8 7 6 7 7 1 7 7 8 7 7 3 7 7 8 6 7 3 7 7 8 7 7 7 7 3 7 7 7 7 7 7 7 3 7 7 9 6 7 7 7 7 3 1 7 7
[93] 7 7 3 7 7 7 7 7 7 7 7 7 8 3 7 7 7 8 7 7 7 7 7 7 7 7 7 7 8 7 6 8 8 7 8 8 8 7 8 7 7 7 7 7 6 8
[139] 7 8 8 6 7 3 8 3 9 7 7 7 8 7 7 8 7 3 7 7 7 7 6 7 7 7 1 7 7 7 7 7 7 6 7 7 8 7 7 7 8 6 7 8 7 8....
混淆矩陣中的錯誤:
錯誤:
data和reference應該是水平相同的因素。
uj5u.com熱心網友回復:
由于聚類分析是一種無監督的方法,因此您的分析很復雜。也就是說,它不會嘗試預測原始集群分配。它只是根據自變數對資料進行分組。讓我們使用iris只有 3 個組而不是您的資料似乎具有的 9 個組的資料集來跟蹤您的代碼。
library(caret)
library(clue)
set.seed(42)
data(iris)
Class <- iris$Species
iris.z <- scale(iris[, -5])
iris_split <- createDataPartition(iris$Species, times=1, p=0.8, list=FALSE)
iris_train <- iris.z[iris_split, ]
iris_test <- iris.z[-iris_split, ]
Class_train <- Class[iris_split]
Class_test <- Class[-iris_split]
這與您的代碼非常接近,并進行了一些細微的調整。我們加載必要的包,caret而clue您沒有在代碼中包含這些包。我們為亂數生成器設定種子,因為kmeans使用隨機初始分配,因此結果可能會因一次運行而異。其次,我們縮放所有資料,使訓練和測驗資料集處于相同的規模,然后我們創建原始資料和組成員的訓練和測驗子集。現在進行聚類分析:
Clust_train <- kmeans(iris_train, centers=3, nstart=25)
table(Clust_train$cluster, Class_train)
# Class_train
# setosa versicolor virginica
# 1 0 9 31
# 2 0 31 9
# 3 40 0 0
請注意,不能保證集群將匹配原始組名稱。對于 3 個簇/組,很容易識別出簇 1 主要由 virginica、簇 2 的雜色和簇 3 的 setosa 組成。然而,第 1 組還包括 9 個 versicolor 標本,第 2 組還包括 9 個 virginica 標本。對于 9 個集群,結果可能不那么簡單。
下一個將簇號轉換為最可能的物種名稱:
train_pre <- factor(ifelse(Clust_train$cluster==1, 3, ifelse(Clust_train$cluster==2, 2, 1)), labels=levels(iris$Species))
tbl_train <- table(train_pre, Class_train)
tbl_train
# Class_train
# train_pre setosa versicolor virginica
# setosa 40 0 0
# versicolor 0 31 9
# virginica 0 9 31
sum(diag(tbl_train))/sum(tbl_train) * 100
# [1] 85
因此,訓練聚類分析在將同一物種的標本分組時的準確率約為 85%。現在將測驗組分配給集群:
pre_model <- cl_predict(Clust_train, iris_test)
test_pre <- factor(ifelse(pre_model==1, 3, ifelse(pre_model==2, 2, 1)), labels=levels(iris$Species))
confusionMatrix(Class_test, test_pre, positive='1')
# Confusion Matrix and Statistics
#
# Reference
# Prediction setosa versicolor virginica
# setosa 10 0 0
# versicolor 0 8 2
# virginica 0 5 5
# . . .
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/347468.html
