前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第3章:决策树分类器 - 编码

第3章:决策树分类器 - 编码

作者头像
iOSDevLog
发布2019-05-07 11:06:32
6120
发布2019-05-07 11:06:32
举报
文章被收录于专栏:iOSDevLogiOSDevLog

作者:Savan Patel 时间:2017年5月14日 原文:https://medium.com/machine-learning-101/chapter-3-decision-tree-classifier-coding-ae7df4284e99

image.png

在第二部分中,我们尝试探索sklearn库的决策树分类器。我们将调整理论部分讨论的参数和结账准确性结果。

虽然通过阅读你会对实现有足够的了解,但我强烈建议你打开编辑器和代码以及教程。我会给你更好的洞察力和持久的学习。 我们该怎么办?

编码练习是以前的Naive Bayes分类器程序的扩展,它将电子邮件分类为垃圾邮件和非垃圾邮件。不用担心,如果你还没有通过朴素贝叶斯(第1章)(虽然我建议你先完成它)。这里也应以抽象的方式讨论相同的代码片段。

随机性!

1.下载

我已经为数据集和示例代码创建了一个git存储库。您可以从此处下载(使用第3章文件夹)。如果失败,您可以使用/引用我的版本(第3章文件夹中的classifier.py)来理解工作。

2.关于清理的一点点

如果你已经编写了朴素贝叶斯的一部分,你可以跳过这部分。(这是直接跳到这里的读者)。

在我们应用sklearn分类器之前,我们必须清理数据。清理涉及删除停用词,从文本中提取最常见的单词等。在相关的代码示例中,我们执行以下步骤:

要详细了解,再一次请参考编码部分第一章在这里

  1. 从训练集中的电子邮件文档构建单词词典。
  2. 考虑最常见的3000字。
  3. 对于训练集中的每个文档,为字典和相应标签中的这些单词创建频率矩阵。[垃圾邮件文件名以前缀“ spmsg开头
代码语言:javascript
复制
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 dictionary
def 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

进入决策树分类器的世界 决策树分类器的代码类似于前两个分类器Naive Bayes和SVM。我们导入树库。接下来,我们提取功能和标签。我们将他们培养成模型。然后预测。之后,我们将检查准确性。

代码语言:javascript
复制
from sklearn import tree
from sklearn.metrics import accuracy_score
TRAIN_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 model
model.fit(features_matrix, labels)
predicted_labels = model.predict(test_feature_matrix)
print "FINISHED classifying. accuracy score : "
print accuracy_score(test_labels, predicted_labels)

准确度得分是多少?您将收到约91.53%。 现在让我们探讨一些调整参数,并尝试更快地进行训练。 最小样本分割 理想情况下,决策树会根据功能停止拆分工作集,要么功能耗尽,要么工作集最终在同一个类中。我们可以通过在最小分割标准下容忍一些错误来加快速度。使用此参数,如果工作集中的项目数减少到指定值以下,则决策树分类器将停止拆分。

以下是最小样本分割为10的图表。

sklearn库中的默认值为2。 尝试将此参数设置为40

代码语言:javascript
复制
model = tree.DecisionTreeClassifier(min_samples_split = 40)

这里的准确度是多少?你将获得约87.3%的准确率。 分裂标准:标准 从理论上讲,我们了解到一个好的分裂决策是采用一个提供最佳信息收益的决策。sklearn的标准可以是基尼或熵(用于获取信息)。衡量分裂质量的功能。支持的标准是基尼杂质的“gini”和信息增益的“熵”。

尝试这两个并检查什么是准确性。

代码语言:javascript
复制
model = tree.DecisionTreeClassifier(criterion =“entropy”)

代码语言:javascript
复制
model = tree.DecisionTreeClassifier(criterion =“gini”)

您可以在此处找到详细参数:http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

最后的想法

决策树是分类策略,而不是分类算法。它采取自上而下的方法并使用分而治之的方法来做出决定。我们可以使用这种方法有多个叶类。

接下来是什么

在下一部分中,我们将讨论k-最近邻算法,并使用sklearn库再次实现一个小代码。我们将探讨调整参数,k-最近邻选择的三种不同方法。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.下载
  • 2.关于清理的一点点
  • 最后的想法
    • 接下来是什么
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档