機器學習入門第三章:決策樹分類器—編碼


機器學習入門第三章:決策樹分類器—編碼

在第二部分中,我們嘗試探索sklearn庫的決策樹分類器。 我們將調整理論部分討論的參數,並檢驗結果的準確性。

通過閱讀您將對實現有足夠的瞭解,但我強烈建議您在打開教程的同時打開編輯器和代碼。 我將為您提供更好的見識和長期的學習。

0.我們要做什麼。

編碼練習是以前的Naive Bayes分類程序的擴展,該程序將電子郵件分為垃圾郵件和非垃圾郵件。 不用擔心,如果您還沒有完成過樸素貝葉斯課程(第1章)(儘管我建議您先完成)。 相同的代碼段也將在此處以抽象方式進行討論。

機器學習入門第三章:決策樹分類器—編碼

Nature of randomness!

1.下載

我已經為數據集和示例代碼創建了一個git存儲庫。 您可以從此處下載(使用第3章文件夾)。 萬一它失敗了,您可以使用/參考我的版本(第3章文件夾中的classifier.py)來了解其工作原理。

2.關於數據清洗

如果您已經完成Naive Bayes的編碼部分,則可以跳過這一部分。(這是針對直接跳到此處的讀者的)。

在應用sklearn分類器之前,我們必須清除數據。 清理包括刪除停用詞,從文本中提取最常用的詞等。在相關的代碼示例中,我們執行以下步驟:

要詳細瞭解,請再次參考此處的第1章編碼部分。

  1. 從訓練集中的電子郵件文檔構建單詞詞典。
  2. 考慮最常見的3000個單詞。
  3. 對於訓練集中的每個文檔,為字典中的這些單詞和相應的標籤創建一個頻率矩陣。 [垃圾郵件的文件名以" spmsg"開頭。
<code>The code snippet below does this:def make_Dictionary(root_dir):   all_words = []   emails = [os.path.join(root_dir,f) for f in os.listdir(root_dir)]   for mail in emails:        with open(mail) as m:            for line in m:                words = line.split()                all_words += words   dictionary = Counter(all_words)# if you have python version 3.x use commented version.   # list_to_remove = list(dictionary)   list_to_remove = dictionary.keys()for item in list_to_remove:       # remove if numerical.        if item.isalpha() == False:            del dictionary[item]        elif len(item) == 1:            del dictionary[item]    # consider only most 3000 common words in dictionary.dictionary = dictionary.most_common(3000)return dictionarydef extract_features(mail_dir):  files = [os.path.join(mail_dir,fi) for fi in os.listdir(mail_dir)]  features_matrix = np.zeros((len(files),3000))  train_labels = np.zeros(len(files))  count = 0;  docID = 0;  for fil in files:    with open(fil) as fi:      for i,line in enumerate(fi):        if i == 2:          words = line.split()          for word in words:            wordID = 0            for i,d in enumerate(dictionary):              if d[0] == word:                wordID = i                features_matrix[docID,wordID] = words.count(word)      train_labels[docID] = 0;      filepathTokens = fil.split('/')      lastToken = filepathTokens[len(filepathTokens) - 1]      if lastToken.startswith("spmsg"):          train_labels[docID] = 1;          count = count + 1      docID = docID + 1  return features_matrix, train_labels/<code>

進入決策樹分類器的世界

決策樹分類器的代碼與之前的兩個分類器Naive Bayes和SVM相似。 我們導入樹庫。 接下來,我們提取特徵和標籤。 我們將它們訓練成模型。 然後預測。 稍後,我們將檢查準確性。

<code>from sklearn import treefrom sklearn.metrics import accuracy_scoreTRAIN_DIR = "../train-mails"TEST_DIR = "../test-mails"dictionary = make_Dictionary(TRAIN_DIR)print "reading and processing emails from file."features_matrix, labels = extract_features(TRAIN_DIR)test_feature_matrix, test_labels = extract_features(TEST_DIR)model = tree.DecisionTreeClassifier()print "Training model."#train modelmodel.fit(features_matrix, labels)predicted_labels = model.predict(test_feature_matrix)print "FINISHED classifying. accuracy score : "print accuracy_score(test_labels, predicted_labels)/<code>


準確度分數是多少?您將收到大約91.53%。

現在,讓我們探索一些調整參數,並嘗試使訓練更快。

最小樣品分裂

理想情況下,決策樹停止根據功能拆分工作集,要麼是用盡了功能,要麼是工作集落入同一類。 我們可以通過以最小分割標準容忍某些錯誤來加快速度。 使用此參數,如果工作集中的項目數減少到指定值以下,則決策樹分類程序將停止拆分。

下圖是最小樣本分割為10的圖。

sklearn庫中的默認值為2。

嘗試將此參數設置為40

<code>model = tree.DecisionTreeClassifier(min_samples_split=40)/<code>


這裡的準確度是多少?您將獲得大約87.3%的準確性。

分割標準:criterion

從理論上講,我們瞭解到良好的拆分決策之一是採取能夠提供最佳信息增益的決策。 sklearn的標準可以是gini或熵(用於獲取信息)。 衡量分割質量的功能。 支持的標準是對基尼雜質的"基尼"和對信息增益的"熵"。

嘗試這兩個並檢查什麼是準確性。

<code>model = tree.DecisionTreeClassifier(criterion="entropy")/<code>

<code>model = tree.DecisionTreeClassifier(criterion="gini")/<code>

您可以在此處找到詳細的參數:

最後的想法

決策樹是分類策略,而不是分類算法。 它採用自上而下的方法,並使用分而治之的方法來做出決策。 通過這種方法,我們可以有多個葉子類。

接下來是什麼

在下一部分中,我們將討論k最近鄰算法,並使用sklearn庫再次實現小代碼。 我們將探索調整參數,這是k近鄰選擇的三種不同方法。


機器學習入門第三章:決策樹分類器—編碼


(本文翻譯自Savan Patel的文章《Chapter 3 : Decision Tree Classifier — Coding》,參考:https://medium.com/machine-learning-101/chapter-3-decision-tree-classifier-coding-ae7df4284e99)


分享到:


相關文章: