我正在对实际数据和来自分类器的预测数据进行多标签分类。实际数据包括三类(c1、c2和c3),同样,预测数据也包括三类(c1、c2和c3)。数据如下
Actual_data Predicted_data
c1 c2 c3 c1 c2 c3
1 1 0 1 1 1
1 1 0 1 0 1
1 0 1 0 1 1
0 1 1 1 0 0
1 0 0 1 1 0
1 1 1 1 0 1
在多标签分类中,文档可能属于多个类别。在上述数据中,1表示文档属于特定类,0表示文档不属于特定类。
第一行Actual\u数据表示文档属于c1类和c2类,不属于c3类。类似地,第一行predicted\u数据表示文档属于类别c1、c2和c3。
最初我使用R编程来寻找实际数据和预测数据之间的混淆矩阵。我将这些数据帧保存在y_actual和y_predict中。
y_actual<-as.matrix(Actual_data)
y_predict<-as.matrix(Predicted_data)
xtab<-table(y_actual,y_predict)
输出xtab是
y_predict
y_actual 0 1
0 1 5
1 5 7
然后,我使用R的插入符号包创建了混淆矩阵,如下所示
library(caret)
confusionMatrix(xtab)
Confusion Matrix and Statistics
y_predict
y_actual 0 1
0 1 5
1 5 7
Accuracy : 0.4444
95% CI : (0.2153, 0.6924)
No Information Rate : 0.6667
P-Value [Acc > NIR] : 0.9856
Kappa : -0.25
Mcnemar's Test P-Value : 1.0000
Sensitivity : 0.16667
Specificity : 0.58333
Pos Pred Value : 0.16667
Neg Pred Value : 0.58333
Prevalence : 0.33333
Detection Rate : 0.05556
Detection Prevalence : 0.33333
Balanced Accuracy : 0.37500
'Positive' Class : 0
在这种情况下,我没有得到多标签混淆矩阵,而是得到了二进制标签混淆矩阵。我想要一个混淆矩阵,其中c1、c2、c3在y-实际中,而y-预测代替0、1在y-实际和y-预测中。
然后我在互联网上搜索到,utiml包用于R中的多标签分类,但没有提供所需的输出。然后我尝试了python的scikit包进行多标签分类,下面给出了代码。
import numpy as np
from sklearn.metrics import multilabel_confusion_matrix
y_actual = np.array([[1, 1, 0],
[1, 1, 0],
[1, 0, 1],
[0, 1, 1],
[1, 0, 0],
[1, 1, 1]])
y_predict = np.array([[1, 1, 1],
[1, 0, 1],
[0, 1, 1],
[1, 0, 0],
[1, 1, 0],
[1, 0, 1]])
matrix = multilabel_confusion_matrix(y_actual, y_predict)
print(matrix)
print(classification_report(y_actual,y_predict))
程序的输出是
[[[0 1]
[1 4]]
[[0 2]
[3 1]]
[[1 2]
[1 2]]]
precision recall f1-score support
0 0.80 0.80 0.80 5
1 0.33 0.25 0.29 4
2 0.50 0.67 0.57 3
micro avg 0.58 0.58 0.58 12
macro avg 0.54 0.57 0.55 12
weighted avg 0.57 0.58 0.57 12
samples avg 0.53 0.61 0.54 12
在这种情况下,我也没有得到输出标签。有谁能帮助我在任何平台(R-programming、python或weka)中获得上述实际和预测数据的多标签混淆矩阵需要使用什么样的包。在输出中,混淆矩阵需要是y\u actual和y\u predict的c1、c2和c3的3×3矩阵。
y_predict
y_actual c1 c2 c3
c1 4
c2 1
c3 2
这里对角线元素表明它实际上属于c1,分类器预测它属于c1。c2和c3也是如此。我的问题是如何获得混淆矩阵的其他值,因为它是多标签分类。这个问题不是多类分类问题,而是多标签分类问题。
一种解决方案是改变数据的表示方式,使其与混淆矩阵方面的插入符号或sklearn期望的内容相匹配。如果您认为混淆矩阵中的每个单元格表示离散类预测(即,“对于这个类,我们预测它,但我们实际看到了它”),那么您可以看到,对于您的示例,没有办法实际构建这样一个矩阵,其中类可以具有相同的值。
考虑到这一点,在你的例子中,你实际上没有三个离散的类别——你有8个。
这意味着对于每一行观察,给定存在的三个分类值,您的数据点可以采用:
none of the categories
only c1
c1&c2
c1&c3
only c2
c2&c3
only c3
all categories
您所需要做的就是向数据帧中添加一个新列,该列重新编码现有的三个目标列,以便新列采用1或8个值来指示这些组合中的每一个。
以下是解决方案的一个示例:
#Recreating your data
Actual_data <- cbind(c(1, 1, 1, 0, 1, 1),
c(1, 1, 0, 1, 0, 1),
c(0, 0, 1, 1, 0, 1)
)
colnames(Actual_data) <- c("c1", "c2", "c3")
Predicted_data <- cbind(c(1, 1, 0, 1, 1, 1),
c(1, 0, 1, 0, 1, 0),
c(1, 1, 1, 0, 0, 1)
)
colnames(Predicted_data) <- c("c1", "c2", "c3")
#To make it easy to recode everything, we can convert these two objects into dataframes:
Predicted_data <-as.data.frame(Predicted_data)
Actual_data <- as.data.frame(Actual_data)
#Next, we make a simple function that goes through each row and recodes the class
#combinations to a distinct category
set_class_combinations <- function(df){
df$target <- 0
for (i in nrow(df)){
df$target[df$c1 == 0 & df$c2 == 0 & df$c3 == 0] <- 1
df$target[df$c1 == 1 & df$c2 == 0 & df$c3 == 0] <- 2
df$target[df$c1 == 1 & df$c2 == 1 & df$c3 == 0] <- 3
df$target[df$c1 == 1 & df$c2 == 0 & df$c3 == 1] <- 4
df$target[df$c1 == 0 & df$c2 == 1 & df$c3 == 0] <- 5
df$target[df$c1 == 0 & df$c2 == 1 & df$c3 == 1] <- 6
df$target[df$c1 == 0 & df$c2 == 0 & df$c3 == 1] <- 7
df$target[df$c1 == 1 & df$c2 == 1 & df$c3 == 1] <- 8
}
return(df)
}
#With the function, we can add a new "target" column to our respective dataframes
Predicted_data <- set_class_combinations(Predicted_data)
Actual_data <- set_class_combinations(Actual_data)
#As your example does not include all available combinations, we just need to ensure that we
#account for this when we set the factor levels (1 through 8) and call the `confusionMatrix` function
cm <- confusionMatrix(factor(Predicted_data$target, levels = 1:8), factor(Actual_data$target, levels = 1:8))
print(cm)
我试图弄清楚如何使用神经网络为多标签分类任务生成混淆矩阵。我之前设法使用函数“交集”计算准确性,因为对此我不关心任何排序。 然而,为了计算混淆矩阵,我确实关心预测/标签的索引顺序。由于标签的值始终相同(
我正在使用分类器的多类多标签输出。类的总数为14,实例可以关联多个类。例如: 我现在制作混淆矩阵的方式: 输出如下: 现在,我不确定sklearn的混淆矩阵是否能够处理多标签多类数据。谁能帮我一下吗?
我正在y_test并y_pred混淆矩阵。我的数据用于多标签分类,因此行值是一种热编码。 我的数据有30个标签,但在输入混淆矩阵后,输出只有11行和列,这让我很困惑。我想我应该有一辆30X30的。 它们的格式是numpy数组。(y\u test和y\u pred是我使用dataframe.values将其转换为numpy数组的数据帧) y\U测试。形状 y_test y\u预测。形状 y\u预测
我需要计算表示为多个热向量的标签和预测的混淆矩阵。sklearn似乎不支持这种情况。 这是我所拥有的一个例子。假设有三个类,和;目标/标签为: 因此,我们有标签矩阵: 预测是: 预测矩阵为: 我希望输出是一个混淆矩阵,大致如下所示: 我使用来估计分类精度。然而,尽管正在为此类标签的准确性而工作,但混淆矩阵不支持上述场景。是否有任何替代? 另一个问题似乎给出了三个混淆矩阵,这不是我要寻找的情况。
我得到了混淆矩阵,但是因为我的实际数据集有很多分类类别,所以很难理解。 范例- 但是如何打印标签/列名以便更好地理解呢? 我甚至试过这个- 需要帮忙吗?
假设我有一个具有n个级别的因子变量y,我有预测和实际结果。如何构造混淆矩阵? 对于n=2的情况,这个问题已经得到了回答。看见 R:如何为预测模型制作混淆矩阵? 我试过的 这就是我能走多远 现在这必须以矩阵的形式呈现。 出身背景 混淆矩阵具有水平标签“实际类别”和垂直标签“预测类别”。矩阵元素的计数如下所示: 元素(1,1)=实际类的计数数为A,预测类的计数数为A 元素(1,2)=实际类别为A,预测