攻略:Kaggle竞赛与赛者应该知道的要点

全文共4621字,预计学习时长

14分钟


攻略:Kaggle竞赛与赛者应该知道的要点


Kaggle很有可能是最著名的机器学习竞赛网站。

Kaggle竞赛包括一个可从网站获得的数据集,需要用机器学习、深度学习或其他数据科学技术来解决问题。

一旦开发出解决方案,参赛者就可以将预测结果上传回站点,预测结果的成功与否将会决定参赛者在竞赛排行榜中的位置,参赛者甚至可能获得现金奖励。


Kaggle是磨练机器学习和数据科学技能、将自己与他人进行比较、学习新技术的极佳平台。本文将提供第一次参加Kaggle竞赛的攻略。本文包括以下内容:


· 开发模型,用来预测推文是否与真正的灾难有关。

· 用模型对Kaggle提供的测试数据集进行预测。

· 进行第一次提交,在Kaggle排行榜上占有一席之地。


检测灾难推文


网站上一个最新的竞赛提供了一个数据集,其中含有推文和一个标签,参赛者可通过该标签得知推文是否真的与灾难有关。该竞赛有将近3000名参赛者,最高现金奖励为10000美元。点击此处可查看数据和竞赛大纲。


如果没有Kaggle账户,点击此处免费创建。


在竞赛页面选择“全部下载”将获得含有三个CSV文件的压缩文件。


攻略:Kaggle竞赛与赛者应该知道的要点

第一个数据集包含一系列特征以及用于训练的相应目标标签。该数据集具有以下属性:


· Id:推文的数值标识符。参赛者将预测结果上传至排行榜时,它会派上大用场。

· 关键字:某些情况下,推文中的关键字可能会丢失。

· 位置:发送推文的位置。这也有可能不显示。

· 文本:推文的全文。

· 目标:参赛者试图预测的标签。如果该推文确实和灾难有关,则为1,否则为0。


仔细阅读这些文件,以便进一步了解它们。你会注意到下面的代码中已经包含了一个set_option指令。Pandas set_options允许你控制数据框结果的显示格式。此处包含指令旨在确保显示文本列的完整内容,让结果和分析更易于查看。


<code>import pandasas pd 

pd.set_option('display.max_colwidth', -1)train_data = pd.read_csv('train.csv')
train_data.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

第二个数据集只包含数据集的特征,用来预测目标标签,其结果将决定是否能在排行榜上获得一席之地。


<code>test_data =pd.read_csv('test.csv')
test_data.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

第三个数据集举例说明了提交的文件应该采用什么格式。该文件将包括test.csv文件中的id列以及模型预测的目标。创建此文件后,参赛者会将其提交给网站,从而进入排行榜。


<code>sample_submission= pd.read_csv('sample_submission.csv')
sample_submission.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

为机器学习准备数据


无论是什么机器学习任务,数据清洗和预处理都是必须的,之后才能对模型进行训练。处理文本数据时,这一点尤为重要。


为了让第一个模型易于操作,而且由于这些列中缺少大量数据,位置和关键字特征将会删去,仅用推文中的实际文本进行训练。id列也会删去,因为它对训练模型没有用处。


<code>train_data =train_data.drop(['keyword', 'location', 'id'], axis=1)
train_data.head()/<code>


现在,数据集如下所示。


攻略:Kaggle竞赛与赛者应该知道的要点

文本(尤其是推文)通常会包含很多特殊字符,但这些字符对机器学习算法来说不一定有意义。因此,笔者要采取的第一步就是删去这些字符。还将把所有单词变成小写。


<code>import redef  clean_text(df, text_field):
df[text_field] =df[text_field].str.lower()
df[text_field] =df[text_field].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z\\t])|(\\w+:\\/\\/\\S+)|^rt|http.+?", "", elem))
return dfdata_clean =clean_text(train_data, "text")data_clean.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

另一种有用的文本清理过程是删除停用词。停用词使用频率很高,但传达的意义一般不大。在英语中,停用词包括“the”、“it”、“as”这样的词。这些词如果保留在文本中,将会产生大量噪声,算法学习起来会更加困难。


自然语言工具包(NLTK)汇集了用于处理文本数据的python库和工具,点击此处访问完整文档。除了处理工具之外,自然语言工具包还拥有庞大的文本语料库和词汇资源,其中包括多种语言的全部停用词资源。该库将用来从数据集中删除停用词。


自然语言工具包库可通过pip安装。安装完成后,需要导入语料库并下载停用词文件。


<code>import nltk.corpus
nltk.download('stopwords')/<code>


此步骤完成后,你可以读入停用词,并使用语料库删除推文中的停用词。


<code>from nltk.corpus importstopwords
stop = stopwords.words('english')data_clean['text'] =data_clean['text'].apply(lambda x: ' '.join([word for word in x.split() if wordnot in (stop)]))data_clean.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

数据预处理


数据清洗干净后,还需要进行进一步的预处理才能用于机器学习算法。


所有机器学习算法都使用数学计算映射特征中的模式(在本文的情况下是文本或单词)和目标变量。因此,为了执行计算,训练机器学习模型之前必须将文本转换为数字形式。


该类型的预处理有多种方法,但笔者将举例使用scikit-learn库中的两种方法。


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


CountVectoriser函数可实现此目的。


下一步是对CountVectoriser产生的字数进行加权。采用该加权的目的是按比例减少文本中频繁出现单词的影响,这样,在模型训练过程中,不频繁出现或提供更多信息的单词会得到重视。TfidTransformer可执行此功能。


机器学习管道


将所有预处理和模型拟合放入scikit-learn管道,看看模型的表现如何。第一次尝试,笔者使用的是线性支持向量机分类器(SGDClassifier)——公认的最佳文本分类算法之一。


<code>from sklearn.model_selectionimport train_test_splitX_train, X_test, y_train, y_test =train_test_split(data_clean['text'],data_clean['target'],random_state = 0)fromsklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifierpipeline_sgd = Pipeline([
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('nb', SGDClassifier()),
])model = pipeline_sgd.fit(X_train, y_train)/<code>


用训练好的模型预测保留的测试数据,看看模型的表现如何。


<code>from sklearn.metrics importclassification_reporty_predict = model.predict(X_test)
print(classification_report(y_test, y_predict))/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

第一次尝试,该模型的表现相当不错。


进行第一次提交


现在一起来看看该模型在竞赛测试数据集中的表现和排行榜上的排名。


首先需要清洗测试文件中的文本,然后用模型做预测。下面的代码获取测试数据的副本,并执行与训练数据相同的清洗操作。输出显示在代码下方。


<code>submission_test_clean =test_data.copy()
submission_test_clean = clean_text(submission_test_clean, "text")
submission_test_clean['text'] = submission_test_clean['text'].apply(lambda x: ''.join([word for word in x.split() if word not in (stop)]))
submission_test_clean = submission_test_clean['text']
submission_test_clean.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

接下来用模型进行预测。


<code>submission_test_pred =model.predict(submission_test_clean)
/<code>

创建提交需要构建的仅包含测试集id和预测的数据框。


<code>id_col = test_data['id']
submission_df_1 = pd.DataFrame({
"id": id_col,
"target":submission_test_pred})
submission_df_1.head()/<code>
攻略:Kaggle竞赛与赛者应该知道的要点

最后将其另存为CSV文件。要包含index=False,这很重要,否则索引将被另存为文件中的一列,提交也会遭到拒绝。


<code>submission_df_1.to_csv('submission_1.csv',index=False)/<code>

获得CSV文件后,可以返回竞赛页面并选择“提交预测”按钮。该操作会打开一个表格,参赛者可以在上面上传CSV文件。最好添加一些有关该方法的注释,以便于记录之前提交的尝试。


攻略:Kaggle竞赛与赛者应该知道的要点

提交文件后会显示此界面。


攻略:Kaggle竞赛与赛者应该知道的要点

现在提交成功了!


攻略:Kaggle竞赛与赛者应该知道的要点

该模型让笔者在排行榜上获得0.78分,排名为2371。很显然还有一些提高的空间,但现在笔者拥有了可用来比较的基准,这有利于以后的竞赛。


攻略:Kaggle竞赛与赛者应该知道的要点

本文对初次参加Kaggle竞赛该怎样提交预测做了概述。想要提高分数,还可以进一步采取其他步骤。比如更好的文本清洗、不同的预处理方法、尝试其他机器学习算法、模型的超参数调整等等。


攻略:Kaggle竞赛与赛者应该知道的要点


攻略:Kaggle竞赛与赛者应该知道的要点

我们一起分享AI学习与发展的干货


分享到:


相關文章: