题图引自PPT: a-k-nearest-neighbor-based-algorithm-for-multi-label-classification
San Francisco Crime Classification是Kaggle平台上预测在San Francisco, LA城市中某一时间点可能发生罪案类型。前面自己一直是把它作为一个多分类问题在考虑的,直到最近才发现,或许忽略了一个重要的问题:数据集中存在着的重复值。
源数据去重
训练集共9列['Dates', 'Category', 'Descript', 'DayOfWeek', 'PdDistrict', 'Resolution', 'Address', 'X', 'Y'],其中'Category'为犯罪类别标签。训练集共878049条数据,按全部列进行drop_duplicates后还剩875726条数据;由于测试集中缺'Descript','Resolution'两列,往往将训练集中的这两列删去。测试集共884262条数据,按全部列进行drop_duplicates去重后还剩884262条数据,但其实这个结果是有问题的。测试集中包含'Id'列作为索引号,如果不考虑'Id'列,去重后只剩下了695910条数据。
不考虑['Descript','Resolution']时,原始数据中重复值示例如下图所示。 源文件中的重复记录示例 drop_duplicates
pivot_table对不同的时空坐标下(['Dates', 'DayOfWeek', 'PdDistrict', 'Address', 'X', 'Y', ])的犯罪类别计数统计结果如下所示。对应1个犯罪类别标签的数据 588020条,对应两个犯罪类别的共 81339条,对应3个犯罪类别标签的数据 17551条……相同时空坐标下犯罪类别最多的达到8个(共两组)。
如果不去重,原始数据中重复最多的记录甚至高到16条:第116782-116801(Dates =="2013-10-18 15:00:00" 、Address == "0 Block of POWELL ST"),其犯罪类型是'OTHER OFFENSES '。有点怀疑是否SFPD的这个记录里原本还有其它的字段,比如嫌疑人名字、登记上报的警员编号……之类,但在公布时将一些敏感的字段给去除掉了?比如重复了16次的这些记录是一个群体性事件?又如第365481-365495(Dates =="2010-04-10 22:15:00"、Address == "2700 Block of MCALLISTER ST")记录了14条,其类别标签分别为7条'OTHER OFFENSES'(其它违法)、7条'VANDALISM'(故意毁坏公共财产?),对应的是7个嫌疑人,每人涉嫌触犯了两个违法类别的行为?还是说这些时空坐标都相同但犯罪类别不同的数据时竞赛举办方有意加进去的噪声?当然,这些是没来由的大胆猜测,或许没法找到更多的证据来加以证明。 想来实际生活中,倒是有可能同时涉及多项指控的情况,因此也不能把这些对应多个犯罪类别的数据当成异常数据置之不理。
def listCat(x):
return list(x)
trainDF.drop_duplicates(inplace=True,subset=['Dates', 'DayOfWeek', 'PdDistrict', 'Address', 'X', 'Y', 'Category'])
Train_duplicated=pd.pivot_table(trainDF,index=['Dates','DayOfWeek','PdDistrict', 'Address', X', 'Y'],
values='Category',aggfunc=[len,listCat])
Multi-label Category数据示例
按照Multi-Class(多分类)与Multi-Label(多标签)的定义,这样看来,"San Francisco Crime Classification"视为多标签分类问题似乎更合理?类似Kaggle上的Greek Media Monitoring Multilabel Classification (WISE 2014)。
multiclass vs multilabelMulticlass classification means a classification task with more than two classes; e.g., classify a set of images of fruits which may be oranges, apples, or pears. Multiclass classification makes the assumption that each sample is assigned to one and only one label: a fruit can be either an apple or a pear but not both at the same time.
Multilabel classification assigns to each sample a set of target labels. This can be thought as predicting properties of a data-point that are not mutually exclusive, such as topics that are relevant for a document. A text might be about any of religion, politics, finance or education at the same time or none of these.
Multi-label-Binarizer
然而,将"San Francisco Crime Classification"视为多标签分类问题的话,更令人头疼的是,最后预测出的结果应该是类似samplesubmission图中"Greek Media Monitoring Multilabel Classification",一个Id对应预测出的1个(或多个)犯罪类型标签。然而Kaggle要求提交的结果是(884262, 40)的csv文件,因此按多标签分类所预测结果需要转换为以Id为索引,以39个犯罪类别为列的形式;且每个Id对应的一行数据中,有且仅有某1列为1,其余列全为0。问题是,884262测试集中的重复数据相当多。['Dates', 'DayOfWeek', 'PdDistrict', 'Address', 'X', 'Y']这5列全相同的重复数据,重复次数最多的高达40条(Dates=="2007-08-01 13:00:00" and Address=="1000 Block of POTRERO AV",如samplesubmisson图中左下所示)。而且即使在训练模型之前,特征工程构建了其它的变量,应该是基于训练集与测试集都同时具有的上述这5列的基础之上计算得来的。因此如果这5列数据相同的话,其它特征工程所构建的新特征也应相同才对。
samplesubmission
testDF出现的重复值
测试集中的重复值数据导致的问题,以下图中测试集中的数据为例,假设按照多标签分类问题,最后预测结果,对于Dates=="2015-05-10 23:45:00"、 Address=="4700 Block of MISSION ST",模型最后将其分类为'LARCENY/THERY',此时虽然犯罪类别标签唯一,但测试集中同样的地址、经纬度坐标和日期时间出现了两次,自然在按要求的格式转换预测结果时这两个条目的预测结果均为'LARCENY/THERY';对应条目为[…[3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0],[4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0]…]。其中3/4为Id,第18列为1对应所有犯罪类别中按字母排序的第18项'LARCENY/THERY'。
而假设若按照Dates=="2015-05-10 22:00:00"、 Address=="GREEN ST / POLK ST"等特征,模型最后将其分类给出了'OTHER OFFENSES'和'VANDALISM'两个标签,结果转换时,是将这两个标签分别分到第19/20条数据,还是将可能性更大的其中一个标签重复两次呢?如果是两个标签分别置于两个Id,它们出现的次序又该谁先谁后了?二者之间的排列顺序是否对提交结果最终的评分有影响?更严重的是,对于极端情况下的,比如前面提到,重复次数达到32、甚至40的数据,若也预测出多个类别标签的话,又该如何去分配这些类别呢?……想到的问题很多,一时找不到很好的解决办法。
而且,即使不作为Multi-Label多标签问题处理,重复值所引出的问题也必须加以解决才是。如果特征都相同但标签不同,又不作为多标签分类,岂不是成了薛定谔的猫了?到底如何,只有继续学习,期望能找出答案。
PREDICT
写到这里,结论就是:不管是训练集还是测试集,都必须
随时关注重复值!
随时关注重复值!
随时关注重复值!
参考资料
- sklearn: Multiclass and multilabel algorithms
- A Strong Baseline To Classify Toxic Comments On Wikipedia With Fasttext In Keras
- Guide To Multi-Class Multi-Label Classification With Neural Networks In Python
- 深度学习---多标签分类问题
- 使用 scikit-learn 实现多类别及多标签分类算法
- Chicago Police Department: Crime Type Categories: Definition & Description
网友评论