背景
今天在做多标签分类任务时,使用了accuracy_score计算预测准确率,然而却出现了训练集的准确率不断上升,验证集的准确率始终保持在很低的情况,因此对这种现象进行了分析
数据分布?
一开始我认为时训练集和验证集之间的数据分布不同,但是在多次改变train_test_split
的random_seed
,调整test_size
大小,改变验证集等方法后,结果仍然很低,因此排除了这种可能
归一化?
数据中存在负值,而模型采用relu激活函数,忽略了负值的影响,因此我使用sklearn的StandardScaler
进行了归一化,结果仍然很低,排除了归一化的影响
变量名?
我甚至一度怀疑是变量名的问题,在对验证集进行测试的时候,重用了训练集的变量名,结果仍然很低,排除这种影响
最终找到accuracy_score
在使用accuracy_score之前,我着实没有想到输入的y_true和y_pred竟然是1维向量,这下子就可以明白了,1维的时候比较的是每个值是否一样,而输入是2维的时候,比较的是每个一维向量是否完全相等,而不是对每个值进行比较,这就导致了训练时准确率不断上升,而验证集始终停留在较低值的位置。训练集在训练时可以完全拟合到正确值,而验证集总会存在一两个错误,导致整个样本的标签预测错误。由于本次任务是多标签分类任务,一个样本存在多个标签,因此即使只正确1个标签,准确率也并非0。
总结
在使用sklearn的一些方法时,应该看清楚输入的维度,想要方便,使用矩阵计算,最终因为使用错误,浪费了一个上午