Machine learning 快速文本分类器模型的混淆矩阵计算
我正在计算FacebookMachine 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
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)