Machine learning 快速文本分类器模型的混淆矩阵计算

Machine learning 快速文本分类器模型的混淆矩阵计算,machine-learning,dataset,evaluation,confusion-matrix,fasttext,Machine Learning,Dataset,Evaluation,Confusion Matrix,Fasttext,我正在计算FacebookFastText分类器的混淆矩阵模型: 我的预测和测试集如下 $ head -n10 /root/pexp __label__spam __label__verified __label__verified __label__spam __label__verified __label__verified __label__verified __label__verified __label__verified __label__verified $ head -n

我正在计算Facebook
FastText
分类器的混淆矩阵模型:

我的预测和测试集如下

$ head -n10 /root/pexp 
__label__spam
__label__verified
__label__verified
__label__spam
__label__verified
__label__verified
__label__verified
__label__verified
__label__verified
__label__verified

$ head -n10 /root/dataset_test.csv 
__label__spam
__label__verified
__label__verified
__label__spam
__label__verified
__label__verified
__label__verified
__label__verified
__label__verified
__label__verified
模型的预测已通过以下方式在测试集上计算:

./fasttext predict /root/my_model.bin /root/dataset_test.csv > /root/pexp
然后我将计算
FastText
混淆矩阵:

$ ./confusion.py /root/dataset_test.csv /root/pexp
$ ./confusion.py /root/dataset_test_norm_label.csv /root/pexp
Accuracy: 0.998852852227
[[9432    21]
 [    3 14543]]
但我一直被这个错误困扰着:

Traceback (most recent call last):
  File "./confusion.py", line 18, in <module>
    test_labels = parse_labels(args.test)
  File "./confusion.py", line 10, in parse_labels
    return np.array(list(map(lambda x: int(x[9:]), f.read().split())))
  File "./confusion.py", line 10, in <lambda>
    return np.array(list(map(lambda x: int(x[9:]), f.read().split())))
ValueError: invalid literal for int() with base 10: 'spam'
此外,在
FastText
的情况下,测试集可能在某个点上具有规范化标签(不带前缀
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

awk 'BEGIN{FS=OFS="\t"}{ $1 = "__label__" tolower($1) }1' /root/dataset_test.csv  > /root/dataset_test_norm.csv 
看看这个

此外,必须从标签列以外的其他列剪切输入测试文件:

cut -f 1 -d$'\t' /root/dataset_test_norm.csv > /root/dataset_test_norm_label.csv
最后我们得到了混淆矩阵:

$ ./confusion.py /root/dataset_test.csv /root/pexp
$ ./confusion.py /root/dataset_test_norm_label.csv /root/pexp
Accuracy: 0.998852852227
[[9432    21]
 [    3 14543]]
我的最终解决办法是

[更新]


脚本现在运行良好。我已经在我的FastText Node.js实现中直接添加了混淆矩阵计算脚本,
FastText.js

您的脚本错误,并且在给定的输入文件中需要数字(请查看parse_labels方法),而tou有text labels.uhm,因此您指的是
返回np.array(列表(map(lambda x:int(x[9:]),f.read().split())
方法,该方法正在解析标签…完全正确。如果我理解的很好,那一行期望在第九个字符之后的所有内容都形成一个整数;这根本不是数据的样子。是的,因为默认情况下,
fasttext
添加的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>前缀正好是9个字符。所以我的猜测是为什么标签是一个数字而不是一个字符串…因为标签通常应该是一个字符串…根本不需要删除
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
。这里,
eq=test\u labels==pred\u labels
中的比较确实比较字符串。因此,您可以稍微改进
parse_labels()
返回np.array(f.readlines())
from sklearn.metrics import confusion_matrix

# predict the data
df["predicted"] = df["text"].apply(lambda x: model.predict(x)[0][0])

# Create the confusion matrix
confusion_matrix(df["labeled"], df["predicted"])


## OutPut:
# array([[5823,    8,  155,    1],
#        [ 199,   51,   22,    0],
#        [ 561,    2,  764,    0],
#        [  48,    0,    4,    4]], dtype=int64)