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

在 Python 中使用 scikit-learn 抽查回归机器学习算法
照片由 frankieleon 拍摄,保留部分权利。
算法概述
我们将查看 7 种分类算法,您可以在您的数据集上进行抽样检查。
4 种线性机器学习算法
- 线性回归
- 岭回归
- LASSO 线性回归
- 弹性网络回归
3 种非线性机器学习算法
- K-最近邻
- 分类与回归树
- 支持向量机
每个示例都将在 Boston 房价数据集上进行演示。这是一个回归问题,所有属性都是数值型(更新:点击此处下载数据)。
每个示例都是完整且独立的。这意味着您可以将其复制粘贴到您自己的项目中并立即开始使用。
使用 10 折交叉验证的测试工具用于演示如何抽样检查每个机器学习算法,并使用均方误差度量来指示算法性能。请注意,均方误差值为负(已反转)。这是所使用的 cross_val_score() 函数的一个怪癖,它要求所有算法指标按升序排序(值越大越好)。
这些示例假定您了解每种机器学习算法以及如何使用它们。我们不会深入探讨每种算法的 API 或参数化。
需要 Python 机器学习方面的帮助吗?
参加我为期 2 周的免费电子邮件课程,探索数据准备、算法等等(附带代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
线性机器学习算法
本节提供了如何使用 Python 和 scikit-learn 中 4 种不同线性机器学习算法进行回归的示例。
1. 线性回归
线性回归假设输入变量服从高斯分布。还假设输入变量与输出变量相关,并且它们之间没有高度相关(一个称为共线性的问题)。
您可以使用 LinearRegression 类构建线性回归模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 线性回归 import pandas from sklearn import model_selection 来自 sklearn.linear_model 导入 LinearRegression url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) 模型 = LinearRegression() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-34.7052559445 |
2. 岭回归
岭回归是线性回归的扩展,其中损失函数被修改为最小化模型的复杂性,复杂性以系数值的平方和(也称为 L2 范数)衡量。
您可以使用 Ridge 类构建岭回归模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 岭回归 import pandas from sklearn import model_selection from sklearn.linear_model import Ridge url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) model = Ridge() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-34.0782462093 |
3. LASSO 回归
最小绝对收缩和选择算子(简称 LASSO)是线性回归的一种修改,类似于岭回归,其中损失函数被修改为最小化模型的复杂性,复杂性以系数值的绝对值之和(也称为 L1 范数)衡量。
您可以使用 Lasso 类构建 LASSO 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Lasso 回归 import pandas from sklearn import model_selection 来自 sklearn.linear_model 导入 Lasso url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) 模型 = Lasso() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-34.4640845883 |
4. ElasticNet 回归
ElasticNet 是一种正则化回归形式,结合了岭回归和 LASSO 回归的特性。它通过使用 L2 范数(系数值的平方和)和 L1 范数(系数值的绝对值和)对模型进行惩罚,从而最小化回归模型的复杂性(回归系数的幅度和数量)。
您可以使用 ElasticNet 类构建 ElasticNet 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ElasticNet 回归 import pandas from sklearn import model_selection 来自 sklearn.linear_model 导入 ElasticNet url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) 模型 = ElasticNet() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-31.1645737142 |
非线性机器学习算法
本节提供了如何在 Python 和 scikit-learn 中使用 3 种不同的非线性机器学习算法进行回归的示例。
1. K 近邻
K 近邻(或 KNN)为新的数据实例在训练数据集中定位 K 个最相似的实例。从 K 个邻居中,将平均或中位输出变量作为预测。值得注意的是所使用的距离度量(`metric` 参数)。默认使用闵可夫斯基距离,它是欧几里德距离(当所有输入具有相同比例时使用)和曼哈顿距离(当输入变量的比例不同时使用)的泛化。
您可以使用 KNeighborsRegressor 类构建用于回归的 KNN 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# KNN 回归 import pandas from sklearn import model_selection from sklearn.neighbors import KNeighborsRegressor url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) model = KNeighborsRegressor() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-107.28683898 |
2. 分类与回归树
决策树或分类与回归树(简称 CART)使用训练数据选择最佳分裂点来最小化成本度量。回归决策树的默认成本度量是均方误差,在 criterion 参数中指定。
您可以使用 DecisionTreeRegressor 类创建用于回归的 CART 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 决策树回归 import pandas from sklearn import model_selection 来自 sklearn.tree 导入 DecisionTreeRegressor url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) 模型 = DecisionTreeRegressor() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-35.4906027451 |
3. 支持向量机
支持向量机 (SVM) 最初是为二元分类而开发的。该技术已扩展到预测实值问题,称为支持向量回归 (SVR)。与分类示例一样,SVR 构建在 LIBSVM 库之上。
您可以使用 SVR 类创建用于回归的 SVM 模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# SVM 回归 import pandas from sklearn import model_selection 来自 sklearn.svm 导入 SVR url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data" 名称 = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] 数据框 = pandas.read_csv(url, delim_whitespace=True, names=names) array = dataframe.values X = 数组[:,0:13] Y = 数组[:,13] seed = 7 k折 = 模型选择.KFold(n_splits=10, random_state=种子) 模型 = SVR() scoring = 'neg_mean_squared_error' 结果 = 模型选择.cross_val_score(模型, X, Y, cv=kfold, scoring=scoring) 打印(结果.平均值()) |
**注意**:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能会有所不同。考虑多次运行示例并比较平均结果。
运行示例提供均方误差的估计。
1 |
-91.0478243332 |
总结
在这篇文章中,您发现了使用 Python 和 scikit-learn 进行回归的机器学习示例。
具体来说,您学习了
4 种线性机器学习算法
- 线性回归
- 岭回归
- LASSO 线性回归
- 弹性网络回归
3 种非线性机器学习算法
- K-最近邻
- 分类与回归树
- 支持向量机
您对回归机器学习算法或此文章有任何疑问吗?请在评论中提出您的问题,我将尽力回答。
你好,Jason。
当我运行 [LinearRegression, mean_squared_error] 时,我收到一条消息,说:“Scoring method mean_squared_error 在 0.18 版本中已更名为 neg_mean_squared_error,并将在 0.20 版本中删除。”
爱与和平,
Joe
是的,我需要更新 sklearn v0.18 的示例。
你好,Jason。
这是我得到的值。
评分:neg_mean_squared_error
数据集组 模型 值
———- ——– ——– ——-
波士顿 线性 LinRegr -34.705
波士顿 线性 Ridge -34.078
波士顿 线性 Lasso -34.464
波士顿 线性 ElastN -31.165
波士顿 非线性 KNRegr -107.287
波士顿 Clas+Tr DecTrRg -36.348
波士顿 SpVMs SVR -91.048
感谢您的一切。
爱与和平,
Joe
由于我们有多种回归算法,所以我的问题是,如果我们想抽样检查我们必须用于解决问题的准确算法,那么在对问题进行预测之前是否需要逐一检查所有算法,或者您是否知道有什么最佳替代方案可以解决这个线性工作(任何快速准确的方法来识别问题的准确算法)?
在进行抽样检查时,我们将逐个评估数据上的每种算法。
你好 Jason,
我已经得到了上述问题的这些解决方案:-
1. KNRegressor:平均值为 -107.286839,标准差为 79.839530。
2. RANSAC(鲁棒性回归):平均值为 -213.964101,标准差为 354.784695
所以,我的问题是,我应该考虑 KNregressor 还是 RANSAC,尽管我在 RANSAC 中得到了巨大的标准差,但我也得到了大的均方误差(负值),这表明性能更好?
算法选择实际上取决于您项目的目标。
你好 Jason
多任务 Lasso 和 Elastic net 之间有什么区别,两者都使用 L1/L2 进行正则化?以及何时使用多任务 Lasso 或 Elastic Net 及其好处?
我不了解多任务,但根据记忆,Lasso 使用 L1,Ridge 使用 L2,Elastic Net 同时使用 L1 和 L2。
你好 Joson
如何在 model_selection.cross_val_score 中设置超参数?
在 KNN 的给定示例中,我希望传递超参数 k 值,但无法做到。
您能帮我解决这个问题吗?
您首先配置模型,例如在定义模型时。
我遵循您的教程并阅读有关机器学习的部分。实际上,我正在研究遗传编程。您知道是否有关于遗传编程的材料和教程。我在您的页面和材料中找到了很多,这帮助我学习了机器学习。我关注了 ANN,但我正在研究 GP。
这可能是一个很好的起点
https://amzn.to/2TarBAE
谢谢你!我已经仔细阅读了你提到的那本书。我已经掌握了 GP 的一些基本理论和原理。我想知道是否有其他材料,比如我们在 ANN 中使用的框架。其他机器学习模型中的开源框架让我们很容易进行工作。我很少找到这样的框架可以让我构建和使用 GP 模型。
抱歉,我不知道有好的现代遗传编程库。