Kaggle比賽教你最快速度入門文本分類(經典方法篇)

本篇文章是自然語言處理系列的第一篇,介紹最基本的文本分類問題解決方案:Logistic Regression、TF-IDF。數據集使用的是Kaggle競賽中的Toxic評論分類挑戰賽。

文本分類的基本流程:

  • 讀取數據
  • 清洗數據
  • 特徵提取
  • 模型訓練
  • 模型評估

讀取數據

Kaggle競賽的數據一般有train、test和sample_submission,我們用pandas來讀取需要的數據。

train = pd.read_csv(../input/train.csv)test = pd.read_csv(../input/test.csv)sample_submission = pd.read_csv(../input/sample_submission.csv)labels = ["toxic", "severe_toxic", "obscene", "threat", "insult", "identity_hate"]

labels是我們需要將文本分為的六個類別。

清洗數據

機器學習工作中廣為流傳的一句話:「數據決定機器學習的上限,演算法讓我們不斷逼近這個上限」。

一個乾淨的數據集是我們在運用機器學習演算法取得成功的關鍵,因此,對文本進行合適的處理是非常關鍵的一步。

以下是我在清洗文本過程中主要完成的工作:

  1. 把你的文章分成一個個單獨的單詞。
  2. 將所有字元轉換為小寫。
  3. 刪除所有不相關的字元,例如任何非字母、數字字元。
  4. 恢復所有簡寫形式的單詞
  5. 考慮將「@$&」等字元轉換為「at,dollar,and」。
  6. 最後,有很多單詞是拼寫錯誤的,這個部分還需要想辦法來處理。

def clean_text(comment_text): comment_list = [] for text in comment_text: # 將單詞轉換為小寫 text = text.lower() # 刪除非字母、數字字元 text = re.sub(r"[^A-Za-z0-9(),!?@&$\`"\_
]", " ", text) text = re.sub(r"
", " ", text) # 恢復常見的簡寫 text = re.sub(r"whats", "what is ", text) text = re.sub(r"s", " ", text) text = re.sub(r"ve", " have ", text) text = re.sub(r"cant", "can not ", text) text = re.sub(r"cannot", "can not ", text) text = re.sub(r"nt", " not ", text) text = re.sub(r"im", "i am ", text) text = re.sub(r"
e", " are ", text) text = re.sub(r"d", " would ", text) text = re.sub(r"ll", " will ", text) # 恢復特殊符號的英文單詞 text = text.replace(&, and) text = text.replace(@, at) text = text.replace($, dollar) comment_list.append(text) return comment_listtrain["clean_comment_text"] = clean_text(train[comment_text])test[clean_comment_text] = clean_text(test[comment_text])

我們看看清洗前和清洗後的數據,效果還算是不錯。

提取TF-IDF特徵

自然語言處理的一個難點問題就是如何表示文本,機器學習模型都是以數值為輸入,所以我們需要找到一種很好的表達方式讓我們的演算法能夠理解文本數據。

為了幫助我們的模型更多地關注有意義的單詞,我們可以使用TF-IDF進行特徵提取。

all_comment_list = list(train[clean_comment_text]) + list(test[clean_comment_text])text_vector = TfidfVectorizer(sublinear_tf=True, strip_accents=unicode,token_pattern=rw{1,}, max_features=5000, ngram_range=(1, 1), analyzer=word)text_vector.fit(all_comment_list)train_vec = text_vector.transform(train[clean_comment_text])test_vec = text_vector.transform(test[clean_comment_text])

這裡,我們使用了sklearn庫中的TfidfVectorizer來提取TF-IDF特徵。

模型訓練

本篇文章是第一篇,所以我們使用一個非常簡單的Logistic Regression模型來進行分類。

首先,將訓練數據劃分為訓練集和驗證集。

x_train, x_valid, y_train, y_valid = train_test_split(train_vec, train[labels], test_size=0.1, random_state=2018)x_test = test_vec

我們保留了訓練集中的0.1為驗證集,用來評估我們的模型性能。

accuracy = []for label in labels: clf = LogisticRegression(C=6) clf.fit(x_train, y_train[label]) y_pre = clf.predict(x_valid) train_scores = clf.score(x_train, y_train[label]) valid_scores = accuracy_score(y_pre, y_valid[label]) print("{} train score is {}, valid score is {}".format(label, train_scores, valid_scores)) accuracy.append(valid_scores) pred_proba = clf.predict_proba(x_test)[:, 1] sample_submission[label] = pred_probaprint("Total cv accuracy is {}".format(np.mean(accuracy)))

對於分類問題,我們用準確率來評估演算法。

好了,我們用非常簡單的Logistics Regression演算法就在文本分類問題上獲得了98.2%的準確率,表現已經非常不錯。核心代碼已經放出來了,有興趣的同學可以在Kaggle上下載數據集,自己一步一步實現,印象會更深一些。

打個廣告,歡迎關注我的微信公眾號:Kaggle數據分析。專註分享Kaggle比賽的實戰經驗。


推薦閱讀:

機器學習面試之偏差方差
word embedding之GLOVE代碼
斯坦福CS231n項目實戰(三):Softmax線性分類
關鍵詞提取Part1(A Quick Review)
機器學習篇-數據劃分

TAG:Kaggle | 機器學習 |