|
|
51CTO旗下网站
|
|
移动端

如何在Kaggle上打比赛,带你进行一次完整流程体验

Kaggle是一个磨练您的机器学习和数据科学技能的好地方,您可以将自己与他人进行比较,并学习新的技术。在这篇文章中,我们利用一个典型的例子,来给大家演示如何参加Kaggle竞赛。

作者:机器学习与数据分析来源:今日头条|2020-02-25 15:11

引言

Kaggle是最著名的机器学习竞赛网站。Kaggle竞赛由一个数据集组成,该数据集可以从网站上获得,需要使用机器、深度学习或其他数据科学技术来解决问题。一旦你发现了一个解决方案,你就可以把你的模型结果上传到网站上,然后网站根据你的结果对你进行排名。如果你的结果可以击败其他参赛选手,那么你可能获得现金奖励。

如何在Kaggle上打比赛,带你进行一次完整流程体验

Kaggle是一个磨练您的机器学习和数据科学技能的好地方,您可以将自己与他人进行比较,并学习新的技术。

在这篇文章中,我们利用一个典型的例子,来给大家演示如何参加Kaggle竞赛:

  • 开发一个模型来预测一条推特(tweet)内容是否与灾难有关。
  • 使用模型对Kaggle提供的测试数据集进行预测。
  • 提交你的结果,就可以进入Kaggle排行榜了。

推特数据集

Kaggle最新的一项竞赛提供了一个数据集,包含推文以及一个告诉我们这些推文是否真的是关于灾难的标签。该比赛的排行榜上有近3000名参赛者,最高奖金为1万美元。数据和比赛大纲可以在这里看到:

https://www.kaggle.com/c/nlp-getting-started

如果你还没有Kaggle账户,你可以先免费创建一个。

如果你从比赛页面选择“下载全部”,你会得到一个包含三个CSV文件的zip文件:

如何在Kaggle上打比赛,带你进行一次完整流程体验

第一个数据文件train.csv包含一组特性及其对应的用于培训目的的目标标签。该数据集由以下属性组成:

  • Id: tweet的数字标识符。当我们将我们的预测上传到排行榜时,这将是非常重要的。
  • 关键字:推文中的一个关键字,可能在某些情况下没有。
  • 位置:发送推文的位置,这也可能不存在。
  • 文本:推文的全文。
  • 目标:这是我们试图预测的标签。如果这条推文真的是关于一场灾难,它将是1,如果不是,它将是0。

让我们并进一步了解这个。在下面的代码中,您将注意到我使用了一个set_option 命令。这个来自Pandas库的命令允许您控制dataframe结果显示的格式。我在这里使用这个命令,以确保显示文本列的全部内容,这使我的结果和分析更容易查看:

  1. import pandas as pdpd.set_option('display.max_colwidth',  
  2. -1)train_data = pd.read_csv('train.csv')train_data.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

第二个数据文件test.csv是测试集,只包含特征,而没有标签。对于这个数据集,我们将预测目标标签并使用结果在排行榜上获得一个位置。

  1. test_data = pd.read_csv('test.csv')test_data.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

第三个文件sample_submission是示例,展示了提交文件的外观。这个文件将包含test.csv文件中的id列和我们用模型预测的目标。一旦我们创建了这个文件,我们将提交给网站,并获得一个位置的排行榜。

  1. sample_submission =  
  2. pd.read_csv('sample_submission.csv')sample_submission.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

数据清理

对于任何机器学习任务,在我们可以训练一个模型之前,我们必须执行一些数据清理和预处理。这在处理文本数据时尤为重要。

为了简化我们的第一个模型,并且由于这些列中有许多缺失的数据,我们将删除位置和关键字特性,只使用来自tweet的实际文本进行训练。我们还将删除id列,因为这对训练模型没有用处。

  1. train_data = train_data.drop(['keyword''location''id'],  
  2. axis=1)train_data.head() 

我们的数据集变成这样:

如何在Kaggle上打比赛,带你进行一次完整流程体验

文本常常包含许多特殊字符,这些字符对于机器学习算法来说不一定有意义。因此,我要采取的第一步是删除这些。我也把所有的单词都小写了。

  1. import redef  clean_text(df, text_field):    df[text_field] =  
  2. df[text_field].str.lower()    df[text_field] =  
  3. df[text_field].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A- 
  4. Za-z \t])|(\w+:\/\/\S+)|^rt|http.+?", "", elem))      return  
  5. dfdata_clean = clean_text(train_data, "text")data_clean.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

另一个有用的文本清理过程是删除停止字。停止词是非常常用的词,通常传达很少的意思。在英语中,这些词包括“the”、“it”和“as”。如果我们把这些单词留在文本中,它们会产生很多噪音,这将使算法更难学习。

NLTK是用于处理文本数据的python库和工具的集合。除了处理工具之外,NLTK还拥有大量的文本语料库和词汇资源,其中包括各种语言中的所有停止词。我们将使用这个库从数据集中删除停止字。

可以通过pip安装NLTK库。安装之后,需要导入库文集,然后下载stopwords文件:

  1. import nltk.corpusnltk.download('stopwords'

一旦这一步完成,你可以阅读停止词,并使用它来删除他们的推文。

  1. from nltk.corpus import stopwordsstop =  
  2. stopwords.words('english')data_clean['text'] =  
  3. data_clean['text'].apply(lambda x: ' '.join([word for word in  
  4. x.split() if word not in (stop)]))data_clean.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

数据预处理

一旦清理好数据,就需要进一步的预处理,为机器学习算法的使用做好准备。

所有的机器学习算法都使用数学计算来映射特征(在我们的例子中是文本或单词)和目标变量中的模式。因此,在对机器学习模型进行训练之前,必须将文本转换为数字表示,以便进行这些计算。

这种类型的预处理有很多方法,但是在这个例子中,我将使用两个来自scikit-learn库的方法。

这个过程的第一步是将数据分割成标记或单个单词,计算每个单词在文本中出现的频率,然后将这些计数表示为一个稀疏矩阵。CountVectoriser函数可以实现这一点。

下一步是对CountVectoriser生成的字数进行加权。应用这种加权的目的是缩小文本中出现频率非常高的单词的影响,以便在模型训练中认为出现频率较低、可能信息量较大的单词很重要。TfidTransformer可以执行这个功能。

机器学习流程

让我们把所有这些预处理和模型拟合一起放到scikit-learn流程中,看看模型是如何执行的。对于第一次尝试,我使用线性支持向量机分类器(SGDClassifier),因为这通常被认为是最好的文本分类算法之一。

  1. from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test =  
  2. train_test_split(data_clean['text'],data_clean['target'],random_state 
  3.  = 0)from sklearn.feature_extraction.text import TfidfVectorizerfrom  
  4. sklearn.pipeline import Pipelinefrom sklearn.feature_extraction.text 
  5.  import CountVectorizerfrom sklearn.feature_extraction.text import  
  6. TfidfTransformerfrom sklearn.linear_model import  
  7. SGDClassifierpipeline_sgd = Pipeline([    ('vect',  
  8. CountVectorizer()),    ('tfidf',  TfidfTransformer()),    ('nb',  
  9. SGDClassifier()),])model = pipeline_sgd.fit(X_train, y_train) 

让我们使用这个训练好的模型来预测我们的测试数据,并看看这个模型是如何执行的。

  1. from sklearn.metrics import classification_reporty_predict =  
  2. model.predict(X_test)print(classification_report(y_test, y_predict)) 
如何在Kaggle上打比赛,带你进行一次完整流程体验

对于第一次尝试,模型执行得相当好。

提交成绩

现在让我们看看这个模型在竞争测试数据集上的表现,以及我们在排行榜上的排名。

首先,我们需要清除测试文件中的文本,并使用模型进行预测。下面的代码获取测试数据的副本,并执行我们应用于培训数据的相同清理。输出如下面的代码所示。

  1. submission_test_clean = test_data.copy()submission_test_clean =  
  2. clean_text(submission_test_clean,  
  3. "text")submission_test_clean['text'] =  
  4. submission_test_clean['text'].apply(lambda x: ' '.join([word for word 
  5.  in x.split() if word not in (stop)]))submission_test_clean =  
  6. submission_test_clean['text']submission_test_clean.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

接下来,我们使用模型创建预测。

  1. submission_test_pred = model.predict(submission_test_clean) 

为了创建一个提交,我们需要构造一个dataframe,它只包含来自测试集的id和我们的预测。

  1. id_col = test_data['id']submission_df_1 = pd.DataFrame({     
  2.               "id": id_col,                   "target":  
  3. submission_test_pred})submission_df_1.head() 
如何在Kaggle上打比赛,带你进行一次完整流程体验

最后,我们将其保存为CSV文件。必须包含index=False,否则索引将被保存为文件中的一列,您的提交将被拒绝。

  1. submission_df_1.to_csv('submission_1.csv'index=False

一旦我们有了CSV文件,我们就可以返回比赛页面并选择提交预测按钮。这将打开一个表单,您可以上传CSV文件。添加一些关于该方法的注释是一个好主意,这样您就有了以前提交尝试的记录。

如何在Kaggle上打比赛,带你进行一次完整流程体验

提交文件后,您将看到如下结果:

如何在Kaggle上打比赛,带你进行一次完整流程体验

现在我们有一个成功的提交!

如何在Kaggle上打比赛,带你进行一次完整流程体验

这个模型在排行榜上给了我0.78分,排名2371。显然还有一些改进的空间,但现在我已经有了一个未来提交的基准。

如何在Kaggle上打比赛,带你进行一次完整流程体验

【编辑推荐】

  1. 谷歌确认收购数据科学社区Kaggle 巩固其AI地位
  2. 中文自动转SQL,准确率高达92%,这位Kaggle大师刷新世界纪录
  3. 谷歌把打败99%程序员的AutoML集成到Kaggle平台!
【责任编辑:未丽燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

消息队列Kafka运维实践攻略

消息队列Kafka运维实践攻略

入门级消息队列
共3章 | 独行侠梦

45人订阅学习

编程零基础,Scratch 开发小游戏

编程零基础,Scratch 开发小游戏

游戏化编程
共5章 | googlingman

22人订阅学习

Docker一键部署,3小时学以致用

Docker一键部署,3小时学以致用

Docker学以致用
共3章 | jextop

103人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微