攻略: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學習與發展的乾貨


分享到:


相關文章: