在 Python 中使用 scikit-learn 抽查分类机器学习算法

抽查是发现哪些算法在您的机器学习问题上表现良好的一种方法。

您无法事先知道哪些算法最适合您的问题。您必须尝试多种方法,并专注于那些被证明最有前途的方法。

在这篇文章中,您将发现 6 种机器学习算法,您可以使用它们在 Python 中通过 scikit-learn 抽查您的分类问题。

使用我的新书《使用 Python 进行机器学习掌握》**启动您的项目**,包括分步教程和所有示例的 Python 源代码文件。

让我们开始吧。

  • 2017年1月更新:更新以反映 scikit-learn 0.18 版本中的 API 变化。
  • **2018 年 3 月更新**:添加了下载数据集的备用链接,因为原始链接似乎已被删除。
Spot-Check Classification Machine Learning Algorithms in Python with scikit-learn

在 Python 中使用 scikit-learn 抽查分类机器学习算法
图片由 Masahiro Ihara 拍摄,保留部分权利

算法抽查

您无法事先知道哪种算法最适合您的数据集。

您必须通过试错来发现一些在您的问题上表现良好的算法,然后您可以加倍投入并进一步调整它们。我将这个过程称为抽查。

问题不是

我应该在我的数据集上使用哪种算法?

而是

我应该在我的数据集上抽查哪些算法?

您可以猜测哪些算法可能在您的数据集上表现良好,这可能是一个很好的起点。

我建议尝试多种算法,看看哪些擅长从您的数据中找出结构。

  • 尝试混合算法表示(例如实例和树)。
  • 尝试混合学习算法(例如,用于学习相同类型表示的不同算法)。
  • 尝试混合建模类型(例如线性和非线性函数或参数和非参数)。

让我们具体一点。在下一节中,我们将介绍您可以在 Python 中用于下一个机器学习项目进行抽查的算法。

算法概述

我们将介绍 6 种分类算法,您可以在您的数据集上进行抽查。

2 种线性机器学习算法

  1. 逻辑回归
  2. 线性判别分析

4 种非线性机器学习算法

  1. K-最近邻
  2. 朴素贝叶斯
  3. 分类与回归树
  4. 支持向量机

每个示例都在 Pima Indians 糖尿病发作数据集上进行演示。这是一个二元分类问题,所有属性都是数值型。

你可以在此处了解更多关于此数据集的信息:

每个示例都是完整且独立的。这意味着您可以将其复制并粘贴到您自己的项目中并立即开始使用。

使用 10 折交叉验证的测试工具用于演示如何抽查每个机器学习算法,并使用平均准确率度量来指示算法性能。

这些示例假设您了解每种机器学习算法及其使用方法。我们不会深入探讨每个算法的 API 或参数化。

需要 Python 机器学习方面的帮助吗?

参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。

立即点击注册,还将免费获得本课程的 PDF 电子书版本。

线性机器学习算法

本节演示了如何使用两种线性机器学习算法的最小示例:逻辑回归和线性判别分析。

1. 逻辑回归

逻辑回归假定数值输入变量服从高斯分布,并且可以建模二元分类问题。

您可以使用 LogisticRegression 类构建逻辑回归模型。

注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。

运行示例会打印平均估计准确率。

2. 线性判别分析

线性判别分析(LDA)是一种用于二元和多类分类的统计技术。它也假定数值输入变量服从高斯分布。

您可以使用 LinearDiscriminantAnalysis 类构建 LDA 模型。

注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。

运行示例会打印平均估计准确率。

非线性机器学习算法

本节演示了如何使用 4 种非线性机器学习算法的最小示例。

1. K-近邻

K-近邻(或 KNN)使用距离度量来查找训练数据中与新实例最相似的 K 个实例,并将这些近邻的平均结果作为预测。

您可以使用 KNeighborsClassifier 类构建 KNN 模型。

注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。

运行示例会打印平均估计准确率。

2. 朴素贝叶斯

朴素贝叶斯计算每个类别的概率以及给定每个输入值的每个类别的条件概率。这些概率针对新数据进行估计并相乘,假设它们都是独立的(一个简单或朴素的假设)。

处理实值数据时,假定高斯分布以便使用高斯概率密度函数轻松估计输入变量的概率。

您可以使用 GaussianNB 类构建朴素贝叶斯模型。

注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。

运行示例会打印平均估计准确率。

3. 分类与回归树

分类与回归树(CART 或决策树)从训练数据构建二叉树。通过评估训练数据中的每个属性和每个属性的每个值,以贪婪的方式选择分割点,以最小化成本函数(例如 基尼系数)。

您可以使用 DecisionTreeClassifier 类构建 CART 模型。

注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。

运行示例会打印平均估计准确率。

4. 支持向量机

支持向量机(或 SVM)旨在找到一条最能分隔两个类别的线。最接近这条最能分隔类别的线的数据实例被称为支持向量,并影响线的放置位置。SVM 已扩展到支持多个类别。

特别重要的是通过核参数使用不同的核函数。默认情况下使用强大的径向基函数

您可以使用 SVC 类构建 SVM 模型。

注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。

运行示例会打印平均估计准确率。

总结

在这篇文章中,您发现了 6 种机器学习算法,您可以使用它们在 Python 中通过 scikit-learn 抽查您的分类问题。

具体来说,您学会了如何抽查

2 种线性机器学习算法

  1. 逻辑回归
  2. 线性判别分析

4 种非线性机器学习算法

  1. K-最近邻
  2. 朴素贝叶斯
  3. 分类与回归树
  4. 支持向量机

您对抽查机器学习算法或本文有任何疑问吗?请在下面的评论区提出您的问题,我将尽力回答。

发现 Python 中的快速机器学习!

Master Machine Learning With Python

在几分钟内开发您自己的模型

...只需几行 scikit-learn 代码

在我的新电子书中学习如何操作
精通 Python 机器学习

涵盖自学教程端到端项目,例如
加载数据可视化建模调优等等...

最终将机器学习带入
您自己的项目

跳过学术理论。只看结果。

查看内容

使用 scikit-learn 在 Python 中抽查分类机器学习算法的 30 条回复

  1. vachar 2017 年 2 月 15 日上午 4:08 #

    我在阅读文档时很容易遗漏东西,所以我显然错过了可以用 sklearn 来做这个。
    这太棒了。谢谢你

  2. chandrisha 2017 年 3 月 5 日下午 2:59 #

    如何使用随机森林进行预测?我正在进行我的毕业设计,使用机器学习和随机森林,但遇到问题。您能提供一个方法吗?

    • Jason Brownlee 2017 年 3 月 6 日上午 10:58 #

      是的,在所有训练数据上拟合模型,然后调用 y=model.predict(X) 来预测新的输入数据。

  3. Jeff 2017 年 10 月 25 日上午 2:50 #

    在使用抽查算法构建模型时,您也使用了交叉验证,不是吗?
    我们是否需要在 X 和 Y 上计算交叉验证分数,还是在 X_train 和 y_train 上计算?
    在进行训练集-测试集分割后,我们是否也可以进行交叉验证?

  4. Jeff 2017 年 10 月 26 日下午 12:49 #

    非常感谢你,Jason。

  5. Gareth 2017 年 11 月 14 日上午 5:18 #

    嗨,Jason,我正在尝试在我的数据集上运行一些这些模型,但我收到“ValueError: could not convert string to float:”的错误,与我的对象数据类型的属性相关,有没有简单的解决方法?谢谢。

    • Jason Brownlee 2017 年 11 月 14 日上午 10:20 #

      也许可以确认您已将数据加载为数值类型,如果不是,请将其转换为数值类型。

  6. Aleksei 2017 年 12 月 12 日下午 9:06 #

    我有一个更具方法论的问题。

    浏览社交媒体、网站、职位描述等,似乎数据科学家应该理解哪种算法(通常是方法)可以应用于哪种问题。这很公平,但这与抽查方法有点不同吗?

    我的意思是,抽查有点像把所有东西都扔进去,然后看看什么有效。那么基本原理和严谨性呢?这种严谨性甚至与业务问题相关吗?

    感谢您的关注

    • Jason Brownlee 2017 年 12 月 13 日上午 5:34 #

      我们无法通过实验预先知道哪种算法对给定数据集来说是好的或最好的。这难以处理。同样,如何最好地为问题配置算法也难以处理。

      我认为职位描述意味着你需要知道哪些算法可以用于分类、回归、聚类、时间序列等。

  7. Yazeed Alotaibi 2018 年 3 月 25 日上午 1:27 #

    我总是得到 0.0

    我尝试了这篇文章中的所有代码

    只更改了 url 和 name

    还调整了 x 和 y 以适应我的数据

    这是我的数据

    https://raw.githubusercontent.com/Yazeedot/yazeedot.github.io/master/assets/survey.csv

  8. manohar 2018 年 5 月 5 日下午 4:24 #

    你好,

    KNN 中未定义 seed

  9. Mamta 2018 年 5 月 8 日下午 5:23 #

    感谢您的邮件和课程……我短时间内学到了很多东西……我最喜欢您的每日指南。由于有很多东西要阅读,您的课程让我对 Python 和 ML 概念充满信心。

  10. John 2018 年 7 月 25 日上午 3:11 #

    我看到您只使用准确率来确定要继续使用哪些模型子集。这是否足够,还是您会考虑精确率-召回率曲线或 ROC 曲线?此外,在选择要继续使用的模型的截止点时,是否有任何有用的方法,还是您只是选择表现最好的前 3 个?谢谢!

    • Jason Brownlee 2018 年 7 月 25 日上午 6:22 #

      您应该使用能捕捉到对您的项目很重要的度量。

  11. Mushtaq 2018 年 9 月 6 日下午 8:29 #

    如何使用 SMOTE 进行过采样,并用过采样数据进行抽查

  12. shadia 2019 年 11 月 1 日上午 5:19 #

    嗨,jason。感谢你的帖子,但我有点困惑。我想知道它们之间的区别
    评估机器学习算法的性能
    在 Python 中评估机器学习算法的指标
    抽查分类机器学习算法

    我正在尝试构建一个随机森林分类器
    我应该一起使用这些方法吗
    我可以在其中任何一个中使用随机森林分类器吗
    谢谢

  13. John 2020 年 9 月 11 日下午 8:08 #

    嗨 Jason,谢谢你的代码。
    我在使用 LDA 算法进行交叉验证时遇到了一个错误,而使用逻辑回归时没有遇到。

    TypeError: 传入了一个稀疏矩阵,但需要密集数据。请使用 X.toarray() 转换为密集 numpy 数组。

    我在 stackoverflow 上搜索了这个错误,他们推荐使用 X.todense()
    但是,既然我们有一个 OneHotEncoder 和模型组成的管道,我该如何应用这一步呢?

  14. ZHENYI JIA 2021 年 4 月 1 日上午 9:02 #

    太棒了!!我只是个初学者,这帮助太大了!!!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。