抽查是发现哪些算法在您的机器学习问题上表现良好的一种方法。
您无法事先知道哪些算法最适合您的问题。您必须尝试多种方法,并专注于那些被证明最有前途的方法。
在这篇文章中,您将发现 6 种机器学习算法,您可以使用它们在 Python 中通过 scikit-learn 抽查您的分类问题。
使用我的新书《使用 Python 进行机器学习掌握》**启动您的项目**,包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。
- 2017年1月更新:更新以反映 scikit-learn 0.18 版本中的 API 变化。
- **2018 年 3 月更新**:添加了下载数据集的备用链接,因为原始链接似乎已被删除。

在 Python 中使用 scikit-learn 抽查分类机器学习算法
图片由 Masahiro Ihara 拍摄,保留部分权利
算法抽查
您无法事先知道哪种算法最适合您的数据集。
您必须通过试错来发现一些在您的问题上表现良好的算法,然后您可以加倍投入并进一步调整它们。我将这个过程称为抽查。
问题不是
我应该在我的数据集上使用哪种算法?
而是
我应该在我的数据集上抽查哪些算法?
您可以猜测哪些算法可能在您的数据集上表现良好,这可能是一个很好的起点。
我建议尝试多种算法,看看哪些擅长从您的数据中找出结构。
- 尝试混合算法表示(例如实例和树)。
- 尝试混合学习算法(例如,用于学习相同类型表示的不同算法)。
- 尝试混合建模类型(例如线性和非线性函数或参数和非参数)。
让我们具体一点。在下一节中,我们将介绍您可以在 Python 中用于下一个机器学习项目进行抽查的算法。
算法概述
我们将介绍 6 种分类算法,您可以在您的数据集上进行抽查。
2 种线性机器学习算法
- 逻辑回归
- 线性判别分析
4 种非线性机器学习算法
- K-最近邻
- 朴素贝叶斯
- 分类与回归树
- 支持向量机
每个示例都在 Pima Indians 糖尿病发作数据集上进行演示。这是一个二元分类问题,所有属性都是数值型。
你可以在此处了解更多关于此数据集的信息:
每个示例都是完整且独立的。这意味着您可以将其复制并粘贴到您自己的项目中并立即开始使用。
使用 10 折交叉验证的测试工具用于演示如何抽查每个机器学习算法,并使用平均准确率度量来指示算法性能。
这些示例假设您了解每种机器学习算法及其使用方法。我们不会深入探讨每个算法的 API 或参数化。
需要 Python 机器学习方面的帮助吗?
参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
线性机器学习算法
本节演示了如何使用两种线性机器学习算法的最小示例:逻辑回归和线性判别分析。
1. 逻辑回归
逻辑回归假定数值输入变量服从高斯分布,并且可以建模二元分类问题。
您可以使用 LogisticRegression 类构建逻辑回归模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 逻辑回归分类 import pandas from sklearn import model_selection from sklearn.linear_model import LogisticRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] seed = 7 kfold = model_selection.KFold(n_splits=10, random_state=seed) model = LogisticRegression() results = model_selection.cross_val_score(model, X, Y, cv=kfold) print(results.mean()) |
注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。
运行示例会打印平均估计准确率。
1 |
0.76951469583 |
2. 线性判别分析
线性判别分析(LDA)是一种用于二元和多类分类的统计技术。它也假定数值输入变量服从高斯分布。
您可以使用 LinearDiscriminantAnalysis 类构建 LDA 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# LDA 分类 import pandas from sklearn import model_selection from sklearn.discriminant_analysis import LinearDiscriminantAnalysis url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] seed = 7 kfold = model_selection.KFold(n_splits=10, random_state=seed) model = LinearDiscriminantAnalysis() results = model_selection.cross_val_score(model, X, Y, cv=kfold) print(results.mean()) |
注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。
运行示例会打印平均估计准确率。
1 |
0.773462064252 |
非线性机器学习算法
本节演示了如何使用 4 种非线性机器学习算法的最小示例。
1. K-近邻
K-近邻(或 KNN)使用距离度量来查找训练数据中与新实例最相似的 K 个实例,并将这些近邻的平均结果作为预测。
您可以使用 KNeighborsClassifier 类构建 KNN 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# KNN 分类 import pandas from sklearn import model_selection from sklearn.neighbors import KNeighborsClassifier url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] random_state = 7 kfold = model_selection.KFold(n_splits=10, random_state=seed) model = KNeighborsClassifier() results = model_selection.cross_val_score(model, X, Y, cv=kfold) print(results.mean()) |
注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。
运行示例会打印平均估计准确率。
1 |
0.726555023923 |
2. 朴素贝叶斯
朴素贝叶斯计算每个类别的概率以及给定每个输入值的每个类别的条件概率。这些概率针对新数据进行估计并相乘,假设它们都是独立的(一个简单或朴素的假设)。
处理实值数据时,假定高斯分布以便使用高斯概率密度函数轻松估计输入变量的概率。
您可以使用 GaussianNB 类构建朴素贝叶斯模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 高斯朴素贝叶斯分类 import pandas from sklearn import model_selection from sklearn.naive_bayes import GaussianNB url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] seed = 7 kfold = model_selection.KFold(n_splits=10, random_state=seed) model = GaussianNB() results = model_selection.cross_val_score(model, X, Y, cv=kfold) print(results.mean()) |
注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。
运行示例会打印平均估计准确率。
1 |
0.75517771702 |
3. 分类与回归树
分类与回归树(CART 或决策树)从训练数据构建二叉树。通过评估训练数据中的每个属性和每个属性的每个值,以贪婪的方式选择分割点,以最小化成本函数(例如 基尼系数)。
您可以使用 DecisionTreeClassifier 类构建 CART 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# CART 分类 import pandas from sklearn import model_selection from sklearn.tree import DecisionTreeClassifier url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] seed = 7 kfold = model_selection.KFold(n_splits=10, random_state=seed) model = DecisionTreeClassifier() results = model_selection.cross_val_score(model, X, Y, cv=kfold) print(results.mean()) |
注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。
运行示例会打印平均估计准确率。
1 |
0.692600820232 |
4. 支持向量机
支持向量机(或 SVM)旨在找到一条最能分隔两个类别的线。最接近这条最能分隔类别的线的数据实例被称为支持向量,并影响线的放置位置。SVM 已扩展到支持多个类别。
特别重要的是通过核参数使用不同的核函数。默认情况下使用强大的径向基函数。
您可以使用 SVC 类构建 SVM 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# SVM 分类 import pandas from sklearn import model_selection from sklearn.svm import SVC url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = pandas.read_csv(url, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] seed = 7 kfold = model_selection.KFold(n_splits=10, random_state=seed) model = SVC() results = model_selection.cross_val_score(model, X, Y, cv=kfold) print(results.mean()) |
注意:由于算法或评估过程的随机性,或数值精度差异,您的结果可能会有所不同。考虑运行示例几次并比较平均结果。
运行示例会打印平均估计准确率。
1 |
0.651025290499 |
总结
在这篇文章中,您发现了 6 种机器学习算法,您可以使用它们在 Python 中通过 scikit-learn 抽查您的分类问题。
具体来说,您学会了如何抽查
2 种线性机器学习算法
- 逻辑回归
- 线性判别分析
4 种非线性机器学习算法
- K-最近邻
- 朴素贝叶斯
- 分类与回归树
- 支持向量机
您对抽查机器学习算法或本文有任何疑问吗?请在下面的评论区提出您的问题,我将尽力回答。
我在阅读文档时很容易遗漏东西,所以我显然错过了可以用 sklearn 来做这个。
这太棒了。谢谢你
不客气,vachar。
如何使用随机森林进行预测?我正在进行我的毕业设计,使用机器学习和随机森林,但遇到问题。您能提供一个方法吗?
是的,在所有训练数据上拟合模型,然后调用 y=model.predict(X) 来预测新的输入数据。
在使用抽查算法构建模型时,您也使用了交叉验证,不是吗?
我们是否需要在 X 和 Y 上计算交叉验证分数,还是在 X_train 和 y_train 上计算?
在进行训练集-测试集分割后,我们是否也可以进行交叉验证?
您可以在训练集上执行交叉验证,并将测试集保留为验证集
https://machinelearning.org.cn/difference-test-validation-datasets/
感谢 Jason 的回复。所以,如果我做了训练-测试分割,那么我会在 X_Train 和 Y_train 上进行交叉验证。
如果我不分割数据集,我会在 X 和 Y 上进行交叉验证,不是吗?
正确。
非常感谢你,Jason。
不客气,Jeff。
嗨,Jason,我正在尝试在我的数据集上运行一些这些模型,但我收到“ValueError: could not convert string to float:”的错误,与我的对象数据类型的属性相关,有没有简单的解决方法?谢谢。
也许可以确认您已将数据加载为数值类型,如果不是,请将其转换为数值类型。
我有一个更具方法论的问题。
浏览社交媒体、网站、职位描述等,似乎数据科学家应该理解哪种算法(通常是方法)可以应用于哪种问题。这很公平,但这与抽查方法有点不同吗?
我的意思是,抽查有点像把所有东西都扔进去,然后看看什么有效。那么基本原理和严谨性呢?这种严谨性甚至与业务问题相关吗?
感谢您的关注
我们无法通过实验预先知道哪种算法对给定数据集来说是好的或最好的。这难以处理。同样,如何最好地为问题配置算法也难以处理。
我认为职位描述意味着你需要知道哪些算法可以用于分类、回归、聚类、时间序列等。
我总是得到 0.0
我尝试了这篇文章中的所有代码
只更改了 url 和 name
还调整了 x 和 y 以适应我的数据
这是我的数据
https://raw.githubusercontent.com/Yazeedot/yazeedot.github.io/master/assets/survey.csv
在处理新的预测建模问题时,我推荐这个过程
https://machinelearning.org.cn/start-here/#process
你好,
KNN 中未定义 seed
这是伪随机数生成器的种子。
您可以在此处了解更多关于 Python 中随机数的信息
https://machinelearning.org.cn/introduction-to-random-number-generators-for-machine-learning/
感谢您的邮件和课程……我短时间内学到了很多东西……我最喜欢您的每日指南。由于有很多东西要阅读,您的课程让我对 Python 和 ML 概念充满信心。
谢谢!祝贺您完成了课程。
我看到您只使用准确率来确定要继续使用哪些模型子集。这是否足够,还是您会考虑精确率-召回率曲线或 ROC 曲线?此外,在选择要继续使用的模型的截止点时,是否有任何有用的方法,还是您只是选择表现最好的前 3 个?谢谢!
您应该使用能捕捉到对您的项目很重要的度量。
如何使用 SMOTE 进行过采样,并用过采样数据进行抽查
我希望涵盖这个话题。
嗨,jason。感谢你的帖子,但我有点困惑。我想知道它们之间的区别
评估机器学习算法的性能
在 Python 中评估机器学习算法的指标
抽查分类机器学习算法
我正在尝试构建一个随机森林分类器
我应该一起使用这些方法吗
我可以在其中任何一个中使用随机森林分类器吗
谢谢
或许可以试试看?
嗨 Jason,谢谢你的代码。
我在使用 LDA 算法进行交叉验证时遇到了一个错误,而使用逻辑回归时没有遇到。
TypeError: 传入了一个稀疏矩阵,但需要密集数据。请使用 X.toarray() 转换为密集 numpy 数组。
我在 stackoverflow 上搜索了这个错误,他们推荐使用 X.todense()
但是,既然我们有一个 OneHotEncoder 和模型组成的管道,我该如何应用这一步呢?
听到这个消息很遗憾,也许这些提示会有帮助
https://machinelearning.org.cn/faq/single-faq/why-does-the-code-in-the-tutorial-not-work-for-me
太棒了!!我只是个初学者,这帮助太大了!!!
谢谢,很高兴听到这个!