笔者按,Kaggle 上有各式各样的数据挖掘类比赛,很多参赛者也乐于分享自己的经验,从他人的经验中进行总结归纳,对自己的实践也非常重要。
本文将以 Kaggle 上 6 个不同的比赛为例,介绍常见的三类数据(结构化数据,NLP 数据,图像数据)分析经验,以助力大家提升数据分析能力。此文为上篇,主要介绍结构化数据和 NLP 数据,包含 Titanic 比赛,房价预测比赛,恶意评论分类,恐怖小说家身份识别。下篇将会介绍两个极具特色的图像类比赛——树叶分类竞赛(Leaf Classification)和肺癌检测比赛(Data Science Bowl 2017)。
正文如下,编译整理:
建立准确模型的关键是全面了解正在使用的数据,但数据通常是混乱的。在我自学机器学习的前几个月,对如何理解数据并没有很多的想法。我假设数据来自一个自底向上组织完好的包,或者至少有一组明确的步骤可以遵循。
查看别人的代码之后,我发现大家理解、可视化和分析相同数据集的方式是不同的,对此我很震惊。我决定通读几种不同的数据分析方式,找出其中的异同点,并提炼出一套理解数据集的最佳实践或策略,以便更好地利用它们进行数据分析。
本文中,我选择了一些在 Kaggle 上公开的探索性数据分析(EDA)。这些分析将交互式代码片段与文章结合在一起,有助于提供数据的鸟瞰图或梳理数据中的模式。
我同时研究了特征工程,这是一种获取现有数据并用一些方法将其转化,赋予数据其他含义的技术(例如,获取时间戳并提取 DAY_OF_WEEK 列,这些列可用于预测商店中的销售情况)。
我想看看各种不同的数据集,所以我选择了:
- 结构化数据
- NLP(自然语言)
- 数据图像数据
结构化数据
结构化数据集是包含训练和测试数据的电子表格。电子表格可能包含分类变量(颜色,如绿色、红色和蓝色),连续变量(年龄,如 4、15 和 67)和序数变量(教育程度,如小学、高中、大学)。
训练数据表中包括一个尝试解决的目标列,这些列不会出现在测试数据中。我所研究的大部分 EDA 都侧重于梳理出目标变量与其他列之间的潜在关联性。
我们的主要目的是寻找不同变量之间的关联性,有很多切分数据的方法。可视化的选择更多。
特征工程可以让你充分发挥想象力,不同参赛选手在合成特征或将分类特征合并为新特征时,都有不同的方法。
让我们更深入地看看 Titanic competition 和 House Prices competition 这两项比赛。
Titanic
Titanic 比赛非常受初学者欢迎,很多 Kaggle 用户都不断参与这个比赛。因此,这个比赛的 EDA 往往写得很好,并且有详细记录,是我看到的最清晰的。
数据集包括一个训练集电子表格,其中包含一列「Survived」,表示乘客是否幸存,以及其他补充数据,如年龄、性别、票价等等。
我选择用于分析的 EDA 是由 I,Coder 提供的 EDA to Prediction Dietanic,déjà vu 提供的 Titanic Survival for Beginners EDA to ML,katerina Kokatjuhha 提供的 In Depth Visualisations Simple Methods。
所有这三种 EDA 都以原始指标开始。
数据预处理过程中对空值或缺失值进行处理是关键一步。本文选取的三个 EDA,一个在前期处理了这一问题,另外两个在特征工程阶段进行处理。
I,Coder 反对指定一个随机数来填补缺失的年龄:
正如我们前面看到的,Age 特征有 177 个空值。要替换这些 NaN 值,我们可以为它们指定数据集的平均年龄。但问题是,有许多不同年龄段的人,我们不能把 4 岁小孩的平均年龄分配到 29 岁。有什么方法可以找出乘客的年龄段?我们可以检查名称特征。在这个特征中,我们可以看到像先生或夫人的称呼,我们可以将先生和夫人的平均值分配给各个年龄组。
I,Coder 将特征工程作为纯数据分析的一部分,然而其他两位作者认为它是一个独立的步骤。
这三位 kernel 作者在深入了解数据、找出数据间潜在相关性时,都非常依赖图表和可视化。他们使用的图表包括因子图、交叉表、条形图、饼图和小提琴图(结合箱线图和密度图特征的一种图)等等。
你可能对泰坦尼克号中的「女性与儿童优先」这句话很熟悉。在最初的数据分析中,对每位作者来说,年龄和性别这两个特征很重要。也可以对收入背景(如票价所示)进行一些详细的检测。
船上的男性比女性多很多。尽管如此,幸存的女性几乎是幸存男性的两倍。女性在船上的幸存率约为75%,而男性约为18-19%。——I,Coder
Jekaterina 和 I,Coder 都是基于对图表和数据的视觉检测得出结论,如 Jekaterina 所写:
- 性别:女性的幸存机会更高。
- 船舱等级:拥有头等舱票更有可能幸存。
- 血亲关系和规模:中等规模的家庭比独自旅行的人或大家庭的幸存率更高。原因可能是单独的人会想牺牲自己去帮助别人。对于大家庭,我认为是整个家庭太难管理,因此家族成员都在寻找彼此而不是忙着上船逃生。
救生船 C 有更高的幸存率。有趣的是,大部分头等舱的乘客乘坐的就是救生船 C。
Deja Vu 的 EDA 在分析的每一步都记录了一个准确的数字,就每个特征对最终预测的重要性提供了一个很好的反馈。
特征工程
三位 kernel 作者的特征工程存在很多可变性。
每位作者选择不同数量的 bucket 作为连续变量,如年龄和票价。与此同时,他们都以不同的方式处理家庭关系,I,Coder 建立了一个 SibSip(血亲关系)——是独自一人还是与家人(配偶或兄弟姐妹)一起(family_size 和 alone),Jekaterina 则列出了一个客舱bin,并提出以 child(儿童)或 adult(成人)作为特征。
I,Coder 在剔除不相关的列时特别激进:
- 名称 —>我们不需要名称特征,因为它不能转换为任何分类值。
- 年龄 —>我们有 Age_band 特征,所以不需要这个。
- 船票 —>它是不能被分类的随机字符串。
- 票价 —>我们有 Fare_cat 特征,所以不需要。
- 客舱 —>有许多缺失值,也有许多乘客有多个舱位。所以这是一个无用特征。
- 票价范围 —>我们有 Fare_cat 特征。
- 乘客身份 —>无法分类。
对于填补步骤,Jekaterina 写道:
- 上的救生船:用一个主要类来填充
- 船舱等级:因为票价中只有一个缺失值,我们将用相应船舱等级的中值进行填充
- 年龄:有几种输入技术,我们将使用均值上下范围内的随机数进行填充
她确保新的填充数据不会破坏平均值,进行了总结了:
点评
三位作者都有检查数据并描述整体形状。
I,Coder 考虑了整体的缺失值,而 Jekaterina 在接近尾声时才开始考虑。
每个人都着眼于幸存者的分类,然后按性别分类幸存者。交叉列表、因子图和小提琴图都是常用的图表。Jekaterina 还绘制了一些非常有趣的图表。
当涉及到特征工程时,作者们有些分歧。作者在构建新特征的问题上存在差异,一些人将其视为一个独立的步骤,另一些人则在初步数据分析时对其进行处理。围绕分箱的选择各不相同,随着年龄、产权和票价的不同,所收到的 bucket 数量都不同,并且只有 Jekaterina 构建了一个离散的 child/adult(儿童/成人)特征。
对于缺失值的填充方法也不同。I,Coder 建议查看现有数据以预测估算值,而 Jekaterina 确保她的估算数据不影响均值。
他们在思考和处理数据上有一些明显的相似之处,主要是在可视化和特征工程上有些差异。
房价
房价预测是另一种结构化数据比赛。它比上面的 Titanic 比赛有更多的变量,包括分类、顺序和一些连续特征。
我所选择的用来分析的 EDA 是 Pedro Marcelino 的 Comprehensive Data Exploration with Python,Angela的 Detailed Data Exploration in Python,以及Sangeon Park的 Fun Python EDA Step by Step。
虽然这些数据在类型上类似 Titanic,但实际上复杂得多。
在爱荷华州埃姆斯住宅问题中,有 79 个解释变量用来描述这些房子的方方面面。该竞赛要求你预测每间房的价格。
Angela 和 Pedro 花了一些时间来研究与 Titanic 比赛中类似的原始数据。Angela 在直方图上画出了售价,并绘制了关于这些特征的热图。而 Pedro 也描绘了售价,并得出了以下结论:
- 偏离了正态分布
- 有明显的正偏态
- 出现了尖峰态
之后,Pedro 将自己置于买家的角度,猜测哪些特性对他来说很重要,从而来看他的选择和售价之间的关系。之后,他建立了一个热图,让自己对特征有更加客观的观察。
相比之下,Angela 以一种更加客观的方式来描述,她通过相关关系列出了数字特征,也描绘了与售价相关的特征图,从数据中寻找模型。
Sang-eon 果断剔除了缺失值和离群值(并使用线性回归估算了临界线附近的异常值),之后才开始描绘与售价相关的多方面特征。
Pedro 一直在寻找数据之间的相关性,以检查数据丢失问题。他提出:
- 丢失数据有多普遍?
- 丢失数据是随机的还是有模式的?
这些问题的答案对于实践很重要,缺少数据可能意味着样本容量的减少。这会阻止我们进一步的分析。从真实性的角度来看,我们需要确保数据丢失不会导致偏颇。
为解决这些问题,Pedro 绘制了缺失单元的总数以及百分比,并选择删除了 15% 或是更多包含缺失数据的单元格所在的列。他再次依赖主观选择来决定移除哪些特征:
……我们会错过这些数据吗?我不这么想。这些变量似乎都不是很重要,因为它们中的大多数都不是我们在购买房子时所要考虑的方面。此外,通过仔细观察变量,比如「PoolQC」、「MiscFeature」和「fireplacery」等变量很有可能导致异常值出现,因此我们很乐意删除它们。
Pedro 对缺失数据的处理方法是,要么删除整个列(如果它们包含有大量缺失值),要么删除只有少数缺失值的行。他还建立了一个启发式的解决异常值的方法:
最主要是设定一个阈值来定义观测值是否为异常值。为此,我们将数据标准化。在这种情况下,数据标准化意味着将数据值转换为平均值为 0,标准差为 1 的数据。
他的结论是,从静态的角度来看,没什么可担心的。但在重新审查了数据之后,他删除了一些觉得可疑的数据点。
特征工程
Sangeon 检查了数据的偏态和峰度,并做了一个 wilxocc -rank 测试。他用一个非常好看的 3D 图进行总结:
与此同时,Pedro 讨论了这些数据的正态性、同方差性、线性度和无相关误差,他将数据归一化,并发现其他三个问题也得到了很好的解决。
点评
这三个 kernel 的作者都没有做过多的特征工程分析,可能是因为数据集中已经有很多的特性了。
有很多策略来决定如何处理这些数据,有些作者采用了主观策略,有些则直接采用更加客观的测量。对于何时以及如何剔除缺失数据或异常值,他们没有达成明确的共识。
与之前 Titanic 竞赛相比,这里更多的关注于统计方法和完整性。可能是因为有更多的特征需要处理,也有可能是无效的统计结果会对整体产生更大的影响。
自然语言处理
自然语言或 NLP 数据集包含单词或句子。虽然核心数据类型与结构化数据竞赛中的相同,但用于自然语言分析的工具——文本是特定的,这会导致不同的分析策略。
在其原始形式中,语言不易被机器学习模型识别。为了将其转换为适合神经网络的格式,需要对其进行变形。一种流行的技术是 Bag of Words(词袋),其中句子被有效地转换为 0 或 1 的集合,即特定单词是否出现。(不出现为 0,出现为 1)
由于需要转换数据,大多数 Notebook 的前几个步骤倾向于将文本转换为机器可读的内容,并且这一步骤都趋于相似。之后,大家的方法会出现很大差异,并对特征工程应用各种不同的可视化和技术。
恶意评论分类
我看到的第一个 NLP 比赛是 Toxic Comment Classifcation Competition(恶意评论分类),包括一个数据集,其中大量数据来自维基百科讨论页面的评论,通过评论在等级上的得分,来区分是侮辱、淫秽,还是恶意评论等。参与者面临的挑战是预测给定评论的恶意标签。
我选择用于分析的 EDA 是 Jagan 的 Stop the S@#$ - Toxic Comments EDA,Rhodium Beng 的 Classifying Multi-label Comments 和 Francisco Mendez 的 Don't Mess With My Mothjer。
三位作者都从描述数据集开始,随机抽取了一些评论。虽然没有缺失值,但评论中有很多噪音,并且不清楚这种噪音在最终的数据分析中是否有用。
恶意程度在各个类别之中不是均匀分布的。因此,我们可能会遇到分类失衡问题。—— Jagan
Francisco 剔除掉无实际意义的词(例如「and」或「the」)。他用双标图绘制出一个特定单词最适合的类别。
双标图中,大多数单词都是正常排列的,也有一些例外,肥胖与厌恶有相关性,这很令人惊讶,因为它是图表底部唯一的非种族词语,图表中有一些通用的冒犯性词语,像die(死亡)这样的词语只与威胁有关。
Francisco 之后提出错别字和恶意之间是否存在关联。
显然是有的,而且令人惊讶的是,当 mother 这个单词拼写错误的时候从来都不会跟厌恶或威胁扯上关系,但当它拼写正确时,就会有一些关于厌恶和威胁的评论。是不是人们倾向于在威胁某人或表达厌恶的时候下笔更谨慎一些呢?
随着 Francisco 进一步的挖掘,他发现在很多情况下,恶意评论中包括一遍又一遍复制粘贴的短语。在删除重复的单词,重新分析后,他发现了一组新的相关性。
普通的恶意评论中一般使用温和的词,如母亲、地狱、枪、愚蠢、白痴和闭嘴等,一些恶意的淫秽评论中会使用 f-word。从双标图中也可以知道恶意和侮辱是相似的,至少是有攻击性的,而更严重就是厌恶和威胁。
这三位作者都利用数据可视化取得了很好的效果。
Rhodium 创建一个字符长度直方图和分类类别之间的热图,并发现了一些标签之间高度相关,例如,侮辱评论有 74% 的可能也是淫秽的。
Jagan 绘制了一些词云、热图和交叉表,观察到:
- 非常恶意的评论可以被归纳为恶意标签
- 除了少数例外情况,其他分类似乎是恶意评论的一个子集
特征工程
Rhodium 将文本变成小写,手动将句法结构变成事物,并手动清除标点符号。
Jagan 绘制了各种与恶意相关的特征来寻找相关性。他发现,垃圾邮件经常存在恶意。
对于单个单词和单词对,Jagan 和 Rhodium 都使用 TF-IDF 绘制顶部单词。
点评
他们似乎都遵循了所关注领域内的几个最佳实践步骤,包括小写文本、处理结构和清理标点符号。然而,也有认为这些可能是潜在的特征方向,而不仅仅是噪音(例如,Francesco 发现错字和恶意之间的相关性)。
恐怖小说家身份识别
Spooky Author Identification (恐怖小说家身份识别)竞赛提供了三个恐怖主题作家 Edgar Allan Poe, HP Lovecraft 和 Mary Wollstonecraft Shelley 写的一些文本片段,要求参赛者构建一个能够将作家和特定文本进行匹配的预测模型。
我选择用于分析的 EDA 是 Anisotropic 的Spooky NLP and Topic Modelling Tutorial ,Bukun 的 Tutorial Detailed Spooky Fun EDA and Modelling 和 Heads or Tails 的 Treemap House of Horror Spooky EDA LDA Features。
这个数据集的有趣之处在于它的简单性,除了作家之外,文本中几乎没有其他非结构化的数据。因此,所有的 EDA 都只关注用不同的方法来解析和分析语言。
大家首先检查数据集,然后挑出几行来绘制每位作家的故事数目。Bukun 还研究了每位作家文章中的单词长度,而 Anisotropic 绘制了一张整体单词数目的条形图。
Anisotropic 表示,这些词都是常见的词,不仅仅出现在三位作家的恐怖故事和小说里,还有报纸、儿童读物、宗教文本——几乎所有其他的英语文本里都可以找到。因此,我们必须找到一种方法来对数据集进行预处理。首先去掉通常不会带来太多信息的单词 。
他们都构建了词云图来显示出现最频繁的单词:
Heads or Tails 也对每位作家的整体句子、单个句子和字词长度进行绘制,并发现作家之间的细微差异。
Anisotropic 和 Bukun 讨论了分词并且移除了停用词。他表示,这个阶段的工作是尝试将类似单词的不同变体减少到一个单独的术语(一个单词不同的分支都被简化为单个词干)。因此,如果文中有「running」、「runs」和「run」,将变成「run」。(当然,会失去过去、现在或将来时态)。
在分词之后,Anisotropic 删除了停用词,还原了词性并重新建立出现频次排在前 50 的单词的词频柱状图:
Bukun 绘制了出现频次前 10 的单词的词频图,并发现了一个不同的集合:
Heads or Tails 也这样做了,另外,还通过作家来看分词和词干化之后词频排在前面的单词。
Bukun 和 Heads or Tails 都使用 TF-IDF 值来查对于特定作者来说最「重要」的单词。
Bukun 观察到频率最高的二元模型和三元模型(分别是两个和三个单词的集合)。
Bukun 和 Heads or Tails 都进行了情绪分析,并观察了每位作家的整体负面情绪。
Bukun 使用了一种叫做「NRC 情感词汇」的词典来检测每个文本片段中的「恐惧」、「惊喜」和「快乐」的数量,并利用词云图、表格、条形图来可视化作家们的情绪。
特征工程
Bukun 建议增加一些可能的特性,包括逗号、分号、冒号、空格的数量以及包含大写字母的单词或是以大写字母开头的单词,并绘制每一种的图像。
Heads or Tails 强调:
我们已经注意到,可以通过知名人物来识别这三位作家。Mary Shelley 写了「Raymond」,Lovecraft 写了「Herbert West」。但是对于一般的名字呢?一些作家在某些特定的情况下更乐意使用名字吗?这是在研究完句子或字符长度之后,我们要关注的重点。
从这个角度来看,Heads or Tails 依赖于 babynames 包,它以每年最受欢迎的名字为特征,为数据添加一个额外的特性。
Bukun 和 Heads or Tails 都注意到作家之间性别代词的分类问题,Heads or Tails 也注意到句子的主题、作者的首字母、尾字母以及特殊单词的数量、每一个句子里面特殊单词所占的比重、对话的标签和押韵。(这是一个很酷的想法)
Heads or Tails 绘制了一张图总结,展示了特征的相互作用:
点评
这是一项值得研究的竞赛。因为文本片段更长,而且不依赖于结构化的数据。
他们倾向于利用小写单词、词干和分词等 NLP 常见应用,同时他们也倾向于使用比 Toxic 中更先进的技术,比如情感分析和二元、三元模型分析技术。
在这两个竞赛中,他们都用到了 TF-IDF。
在特征工程阶段,他们设计了各种各样新特征。包括每个句子的平均单词数、标点符号的选择、以及单词是否重复等。