跟Kaggle大神17枚金牌得主学NLP实战
【新智元导读】本文作者Dean Sublett是Kaggle大神Abhishek Thakur的迷弟,通过学习Abhishek的相关教程受益良多,因此,近期他在medium上撰文对相关自然语言处理的知识做了梳理总结。
本文作者Dean Sublett是Kaggle大神Abhishek Thakur的迷弟,通过学习Abhishek的相关教程受益良多,因此,近期他在medium上撰文对相关自然语言处理的知识做了梳理总结。
提起Abhishek Thakur,很多kaggler对他都非常熟悉,2017年,他在 Linkedin 发表了一篇名为Approaching (Almost) Any Machine Learning Problem的文章,介绍他建立的一个自动的机器学习框架,几乎可以解决任何机器学习问题,这篇文章曾火遍 Kaggle。
Abhishek在Kaggle上的成就:
- Competitions Grandmaster(17枚金牌,世界排名第3)
- Kernels Expert (Kagglers排名前1%)
- Discussion Grandmaster(65枚金牌,世界排名第2)
目前,Abhishek在挪威boost公司担任首席数据科学家的职位,这是一家专门从事会话人工智能的软件公司。
以下是本文作者对Abhishek的NLP实战技术学习总结:
Abhishek的NLP方法
强烈建议在阅读本文的同时阅读kernel。想要更全面掌握NLP或数据科学,请确保自己写代码时,能理解Abhishek的每一行代码。我们的任务是确定测试集中每个句子的作者。
1. 研究数据并理解问题
导入必要的Python模块和数据之后,Abhishek调用数据上的head方法,查看前五行是什么样的。
由于Abhishek是专家,并且这是一个NLP问题,与涉及数值数据的问题相比,探索性数据分析EDA)是比较浅显的问题。
数据科学的新人会从更全面的EDA中收益。对数据进行深入的研究可以发现任何缺失的值,知道需要进行多少数据清理,并在问题的后期帮你做出建模决策。
Abhishek还提醒到,我们正在解决多类文本分类问题。他指出了Kaggle将用于评分提交的评估指标。
在这次竞赛中,Kaggle使用多分类的对数损失函数来衡量提交模型的性能。理想情况下,多类分类模型的对数损失函数为0。
2. 预处理
接下来,Abhishek使用scikit-learn中的LabelEncoder方法为每个作者分配一个整数值。
通过使用整数值(0,1,2)对作者列中值的文本标签进行编码,Abhishek使其分类模型更易于理解数据。
在对作者标签进行编码之后,Abhishek使用来自scikit-learn的train_test_split将数据分成训练和验证集。
他选择了90:10的训练/验证拆分(Python数据科学中最常用的拆分通常为70:30到80:20)。
因此,他打算在数据集中的90%的句子训练模型,然后他用剩余10%的数据评估模型的准确性。
3. 建模
在创建第一个模型前,Abhishek在数据上使用了TF-IDF(Term Frequency - reverse Document Frequency)。
TF-IDF将对文本列中的句子出现的单词赋予权重。
当我们试图确定一个特定的句子是由哪个作者写的,诸如“the”这样的词对于任何作者的分类都不重要,因为“the”经常出现并没有揭示很多信息,但是在对HP编写的句子进行分类时,像“Cthulhu”这样的词会非常重要。
因此,TF-IDF将在预测作者方面,能帮助我们理解哪些词是重要的。
对数据运行TF-IDF是一种特征提取形式。在这里,我们需要得出一些重要的数据预测或特征,来帮助我们找出一个特定的句子是由哪个作者写的。
有了TF-IDF,可以对单词的重要性进行统计测量,以帮助我们预测句子的作者。
在训练集和验证集上拟合TF-IDF之后,Abhishek准备了逻辑回归模型。如果对这种分类模型不熟悉,请先阅读本文。
在拟合逻辑回归模型之后,Abhishek计算了逻辑回归模型的对数损失(回想一下,他在kernel运行初始就编写了多分类对数损失函数)。
对于逻辑回归模型,多分类对数损失函数返回对数损失值0.626。虽然拟合TF-IDF和逻辑回归模型为我们提供了一个良好的开端,但是我们可以改进这个对数损失得分。
4. 模型调整
我们不满意0.626的对数损失得分,希望优化此项评估指标。从这里开始,我们可以采取多种途径,而这正是Abhishek所做的。
在对数据进行探索和预处理之后,我们留下了许多不同的特征提取和模型拟合的组合。
例如,Abhishek使用字数来进行特征提取而不是TF-IDF。
通过这种特征提取技术,他的逻辑回归模型的对数损失得分从0.626提高到0.528 ,这是高达0.098的改进!
总结
从这一点开始,Abhishek的内核越来越详细,因此,我将让他解释其他分类模型。
这是我们讨论的内容:
EDA:如果我们想要了解数据集,探索性数据分析是至关重要的,当我们开始构建模型时,EDA可以节省我们的时间。
多类别分类问题:这类问题要求我们预测观察属于哪个类别,每个观察可能属于三个或更多类别中的任何一个类别
预处理:在构建任何模型之前,必须对数据进行预处理。在这个例子中,为了我们的模型,需要使用LabelEndcoder将文本标签转换成整数值
特征提取:无论何时我们有原始数据集(在我们的示例中是句子摘录),我们都需要派生一些预测器,来帮助我们对观察进行分类。Abhishek向我们展示了如何使用TF-IDF和字数统计。
以下是本文中提到的所有Abhishek代码
参考链接:
https://towardsdatascience.com/what-i-learned-from-abhishek-thakur-4b905ac0fd55
本文授权转载自图灵TOPIA(turingtopia)