当前位置: 首页 > 科技观察

如何在Kaggle上比赛,带你完整流程体验

时间:2023-03-21 01:24:38 科技观察

介绍Kaggle是最著名的机器学习比赛网站。Kaggle竞赛由网站提供的数据集组成,需要使用机器、深度学习或其他数据科学技术来解决问题。找到解决方案后,您可以将模型结果上传到网站,然后网站会根据您的结果对您进行排名。如果您的成绩击败其他竞争对手,您可能会获得现金奖励。Kaggle是磨练机器学习和数据科学技能、与他人比较以及学习新技术的好地方。在这篇文章中,我们用一个典型的例子来向大家展示如何参加Kaggle竞赛:开发一个模型来预测一条推文(tweet)内容是否与灾难有关。使用该模型对Kaggle提供的测试数据集进行预测。提交您的结果以进入Kaggle排行榜。最近关于Twitter数据集的Kaggle竞赛提供了一个推文数据集和一个标签,告诉我们这些推文是否实际上是关于灾难的。比赛有近3,000名参赛者进入排行榜,最高奖金为10,000美元。数据和比赛大纲可以在这里看到:https://www.kaggle.com/c/nlp-getting-started如果你还没有Kaggle账户,你可以免费创建一个。如果您从比赛页面选择“全部下载”,您将获得一个包含三个CSV文件的zip文件:第一个数据文件train.csv包含一组特征及其对应的目标标签,用于训练目的。数据集包含以下属性:Id:推文的数字标识符。当我们将预测上传到排行榜时,这将非常重要。关键字:推文中的关键字,在某些情况下可能存在也可能不存在。location:发送推文的位置,也可能不存在。文本:推文的全文。目标:这是我们要预测的标签。如果推文真的是关于灾难的,则为1,否则为0。让我们仔细看看这个。在下面的代码中,您会注意到我使用了set_option命令。Pandas库中的此命令允许您控制显示数据框结果的格式。我在这里使用这个命令来确保显示文本列的全部内容,这使得我的结果和分析更容易查看:importpandasaspdpd.set_option('display.max_colwidth',-1)train_data=pd.read_csv('train.csv')train_data.head()第二个数据文件test.csv是测试集,只包含特征,没有标签。对于这个数据集,我们将预测目标标签并使用结果来获得排行榜上的位置。test_data=pd.read_csv('test.csv')test_data.head()第三个文件sample_submission是一个示例,显示提交文件应该是什么样子。该文件将包含test.csv文件中的id列和我们使用模型预测的目标。创建此文件后,我们会将其提交到网站并获得该职位的排行榜。sample_submission=pd.read_csv('sample_submission.csv')sample_submission.head()数据清理与任何机器学习任务一样,在我们训练模型之前,我们必须执行一些数据清理和预处理。这在处理文本数据时尤为重要。为了简化我们的第一个模型,并且由于这些列中有很多缺失数据,我们将删除位置和关键字特征,只使用推文中的实际文本进行训练。我们还将删除id列,因为这对训练模型没有用。train_data=train_data.drop(['keyword','location','id'],axis=1)train_data.head()我们的数据集变成这样:文本中往往包含很多特殊字符,这些字符对于机器学习算法不一定有意义。所以我要采取的第一步是删除这些。我也把所有的词都小写了。importredefclean_text(df,text_field):df[text_field]=df[text_field].str.lower()df[text_field]=df[text_field].apply(lambdaelem:re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z\t])|(\w+:\/\/\S+)|^rt|http.+?","",elem))returndfdata_clean=clean_text(train_data,"text")data_clean.head()另一个有用的文本清理过程是删除停用词。停用词是非常常见的词,通常传达的含义很少。在英语中,这些词包括“the”、“it”和“as”。如果我们将这些词留在文本中,它们会产生大量噪音,这将使算法更难学习。NLTK是一组用于处理文本数据的Python库和工具。除了处理工具,NLTK还拥有庞大的文本语料库和词汇资源,包括各种语言的所有停用词。我们将使用这个库从数据集中删除停用词。NLTK库可以通过pip安装。安装后,您需要导入语料库,然后下载停用词文件:importnltk.corpusnltk.download('stopwords')完成后,您可以读取停用词并使用它来删除他们的推文。fromnltk.corpusimportstopwordsstop=stopwords.words('english')data_clean['text']=data_clean['text'].apply(lambdax:''.join([wordforwordinx.split()ifwordnotin(stop)]))data_clean。head()数据预处理一旦数据被清理干净,就需要进一步的预处理来为机器学习算法的使用做准备。所有机器学习算法都使用数学计算来映射目标变量中的特征(在我们的例子中是文本或单词)和模式。因此,在训练机器学习模型之前,必须将文本转换为数值表示才能执行这些计算。这种类型的预处理有很多方法,但在这个例子中,我将使用scikit-learn库中的两种方法。此过程的第一步是将数据拆分为标记或单个单词,计算每个单词在文本中出现的频率,然后将这些计数表示为稀疏矩阵。CountVectoriser函数执行此操作。下一步是对CountVectoriser生成的字数进行加权。应用此权重的目的是缩小文本中非常高频词的影响,以便在模型训练中将频率较低、可能提供信息的词视为重要词。TfidTransformer可以执行此功能。机器学习管道让我们将所有这些预处理和模型拟合放在一个scikit-learn管道中,看看模型是如何执行的。第一次尝试时,我使用了线性支持向量机分类器(SGDClassifier),因为这通常被认为是文本分类的最佳算法之一。fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(data_clean['text'],data_clean['target'],random_state=0)fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.pipelineimportPipelinefromsklearn.feature_extraction.textimportCountVectorizerfromsklearn.feature_extraction.textimportTfidfTransformerfromsklearn.linear_modelimportSGDClassifierpipeline_sgd=Pipeline([('vect',CountVectorizer()),('tfidf',TfidfTransformer()),('nb',SGDClassifier()),])model=pipeline_sgd.fit(X_train,y_train)让我们使用这个训练好的模型来预测在我们的测试数据上,看看这个模型的表现如何。fromsklearn.metricsimportclassification_reporty_predict=model.predict(X_test)print(classification_report(y_test,y_predict))对于第一次尝试,模型表现相当不错。提交分数现在让我们看看模型在竞赛测试数据集上的表现如何,以及我们在排行榜上的排名。首先,我们需要清理测试文件中的文本并使用模型进行预测。下面的代码获取测试数据的副本,并执行我们应用于训练数据的相同清理。输出显示在下面的代码中。submission_test_clean=test_data.copy()submission_test_clean=clean_text(submission_test_clean,"text")submission_test_clean['text']=submission_test_clean['text'].apply(lambdax:''.join([wordforwordinx.split()ifwordnotin(停止)]))submission_test_clean=submission_test_clean['text']submission_test_clean.head()接下来,我们使用模型来创建预测。submission_test_pred=model.predict(submission_test_clean)要创建提交,我们需要构建一个仅包含来自测试集的id和我们的预测的数据框。id_col=test_data['id']submission_df_1=pd.DataFrame({"id":id_col,"target":submission_test_pred})submission_df_1.head()最后,我们将其保存为CSV文件。必须包括index=False,否则索引将作为列保存在文件中,您的提交将被拒绝。submission_df_1.to_csv('submission_1.csv',index=False)获得CSV文件后,我们可以返回比赛页面并选择“提交预测”按钮。这将打开一个表单,您可以在其中上传CSV文件。添加一些关于该方法的注释是个好主意,这样您就可以记录以前的提交尝试。提交文件后,你会看到这样的结果:现在我们提交成功了!这个模型在排行榜上给了我0.78分,排名2371。显然还有一些改进的空间,但现在我为以后的提交有了一个基准。