多输出回归是指在给出输入示例的情况下涉及预测两个或多个数值的回归问题。
一个示例可能是在给定输入的情况下预测坐标,例如预测x和y值。另一个示例是多步时间序列预测,其中涉及预测给定变量的多个未来时间序列。
许多机器学习算法都是为预测单个数值而设计的,简称为回归。一些算法确实支持内在的多输出回归,例如线性回归和决策树。还有一些特殊的解决方法模型,可用于包装和使用那些本来不支持预测多个输出的算法。
在本教程中,你将发现如何开发用于多输出回归的机器学习模型。
完成本教程后,你将知道:
- 机器学习中的多输出回归问题。
- 如何开发本质上支持多输出回归的机器学习模型。
- 如何开发包装器模型,以允许固有的不支持多输出的算法用于多输出回归。
教程概述
本教程分为三个部分:
1.多输出回归问题
(1)检查 Scikit-learn 版本
(2)多输出回归测试问题
2.固有的多输出回归算法
(1)用于多输出回归的线性回归
(2)多输出回归的k最近邻
(3)多输出回归的随机森林
(4)使用交叉验证评估多输出回归
3.包装器多输出回归算法
(1)每个输出的单独模型(MultiOutputRegressor)
(2)每个输出的链接模型(RegressorChain)
多输出回归问题
回归是指涉及预测数值的预测建模问题。
例如,预测大小,重量,数量,销售数量和点击次数是回归问题。通常,在给定输入变量的情况下预测单个数值。
一些回归问题需要预测两个或多个数值。例如,预测x和y坐标。
这些问题称为多输出回归或多输出回归。
回归:预测给定输入的单个数字输出。多输出 回归:根据输入预测两个或多个数字输出。在多输出回归中,通常,输出依赖于输入并且彼此依赖。这意味着输出经常不是彼此独立的,可能需要一个模型来预测两个输出在一起或每个输出取决于其他输出。
多步时间序列预测可以被认为是一种多输出回归的类型,其中预测了一系列未来值,并且每个预测值都取决于该序列中的先前值。
有多种处理多输出回归的策略,我们将在本教程中探讨其中的一些策略。
1.检查 Scikit-learn 版本
首先,确认你已安装了 scikit-learn 库的最新版本。
在本教程中探索的某些模型需要该库的最新版本。
你可以使用以下代码示例检查库的版本:
# check scikit-learn versionimport sklearnprint(sklearn.__version__)
运行该示例代码将可以看到该库的版本。
0.22.1
2.多输出回归测试问题
我们可以定义一个测试问题,以用来演示不同的建模策略。
我们将使用make_regression()函数为多输出回归创建测试数据集。我们将生成具有10个输入功能的1,000个示例,其中五个将是多余的,另外五个将提供信息。该问题将需要预测两个数值。
- 问题输入:10个数字变量。
- 问题输出:2个数字变量。
下面的示例生成数据集并总结形状。
# example of multioutput regression test problemfrom sklearn.datasets import make_regression# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# summarize datasetprint(X.shape, y.shape)
运行示例将创建数据集,并汇总数据集的输入和输出元素的形状以进行建模,从而确认所选的配置。
(1000, 10) (1000, 2)
接下来,让我们看看直接对这个问题建模。
固有的多输出回归算法
一些回归机器学习算法直接支持多个输出。
这包括在scikit-learn库中实现的大多数流行的机器学习算法,例如:
- 线性回归
- K邻近回归
- 决策树回归
- 随机森林回归
让我们看一些具体的例子。
1.用于多输出回归的线性回归
下面的示例在多输出回归数据集中拟合线性回归模型,然后使用拟合模型进行单个预测。
# linear regression for multioutput regressionfrom sklearn.datasets import make_regressionfrom sklearn.linear_model import LinearRegression# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = LinearRegression()# fit modelmodel.fit(X, y)# make a predictiondata_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]yhat = model.predict(data_in)# summarize predictionprint(yhat[0])
运行示例适合模型,然后对一个输入进行预测,确认模型预测了两个必需值。
[-93.147146 23.26985013]
2.多输出回归的K邻近回归
下面的示例在多输出回归数据集上拟合k邻近模型,然后使用拟合模型进行单个预测。
# k-nearest neighbors for multioutput regressionfrom sklearn.datasets import make_regressionfrom sklearn.neighbors import KNeighborsRegressor# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = KNeighborsRegressor()# fit modelmodel.fit(X, y)# make a predictiondata_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]yhat = model.predict(data_in)# summarize predictionprint(yhat[0])
运行示例适合模型,然后对一个输入进行预测,确认模型预测了两个必需值。
[-109.74862659 0.38754079]
3.多输出回归的随机森林
下面的示例在多输出回归数据集中拟合随机森林模型,然后使用拟合模型进行单个预测。
# random forest for multioutput regressionfrom sklearn.datasets import make_regressionfrom sklearn.ensemble import RandomForestRegressor# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = RandomForestRegressor()# fit modelmodel.fit(X, y)# make a predictiondata_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]yhat = model.predict(data_in)# summarize predictionprint(yhat[0])
运行示例适合模型,然后对一个输入进行预测,确认模型预测了两个必需值。
[-76.79505796 27.16551641]
4.使用交叉验证评估多输出回归
我们可能要使用k折交叉验证来评估多输出回归。
这可以通过与评估任何其他机器学习模型相同的方式来实现。
我们将使用带有三个重复的10倍交叉验证对测试问题拟合并评估决策树回归模型。我们将使用平均绝对误差(MAE)性能指标作为得分。
下面列出了完整的示例。
# evaluate multioutput regression model with k-fold cross-validationfrom numpy import absolutefrom numpy import meanfrom numpy import stdfrom sklearn.datasets import make_regressionfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import RepeatedKFold# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = DecisionTreeRegressor()# evaluate modelcv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)n_scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1, error_score='raise')# summarize performancen_scores = absolute(n_scores)print('Result: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
运行示例将评估决策树模型的性能,以对测试问题进行多输出回归。报告了所有折叠和所有重复计算的MAE的均值和标准差。
重要的是,在两个输出变量之间报告错误,而不是为每个输出变量报告单独的错误评分。
Result: 51.659 (3.455)
包装器多输出回归算法
并非所有回归算法都支持多输出回归。
支持向量机就是一个例子,尽管对于回归而言,它被称为支持向量回归或SVR。
该算法不支持回归问题的多个输出,并且会引发错误。我们可以通过下面列出的示例进行演示。
# failure of support vector regression for multioutput regressionfrom sklearn.datasets import make_regressionfrom sklearn.svm import LinearSVR# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = LinearSVR()# fit modelmodel.fit(X, y)
运行示例将报告一条错误消息,指示该模型不支持多输出回归。
ValueError: bad input shape (1000, 2)
为了将诸如SVR的算法用于多输出回归,我们可以采用两种解决方法。
他们将为每个输出创建一个单独的模型,并为每个输出创建一个线性的模型序列,其中每个模型的输出取决于先前模型的输出。
scikit-learn库支持这两种情况。
1.每个输出的单独模型(MultiOutputRegressor)
我们可以为问题的每个输出创建一个单独的模型。
假设输出彼此独立,这可能不是正确的假设。然而,这种方法可以对一系列问题提供令人惊讶的有效预测,并且至少值得作为性能基准进行尝试。
你永远不会知道。实际上,针对您问题的输出可能基本上是独立的,即使不是完全独立的,这种策略也可以帮助您找到答案。
MultiOutputRegressor类支持此方法,该类采用回归模型作为参数。然后,它将为问题中的每个输出创建提供的模型的一个实例。
下面的示例演示了如何将MultiOutputRegressor类与线性SVR一起用于测试问题。
# example of linear SVR with the MultiOutputRegressor wrapper for multioutput regressionfrom sklearn.datasets import make_regressionfrom sklearn.multioutput import MultiOutputRegressorfrom sklearn.svm import LinearSVR# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = LinearSVR()wrapper = MultiOutputRegressor(model)# fit modelwrapper.fit(X, y)# make a predictiondata_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]yhat = wrapper.predict(data_in)# summarize predictionprint(yhat[0])
运行示例,使用MultiOutputRegressor包装器类为问题中的每个输出分别安装了LinearSVR。
然后可以将该包装器直接用于对新数据进行预测,从而确认支持多个输出。
[-93.147146 23.26985013]
2.每个输出的链接模型(RegressorChain)
将单输出回归模型用于多输出回归的另一种方法是创建线性模型序列。
序列中的第一个模型使用输入并预测一个输出。第二模型使用第一模型的输入和输出进行预测;第三个模型使用前两个模型的输入和输出进行预测,依此类推。
可以使用scikit-learn库中的RegressorChain类来实现。
模型的顺序可以基于数据集中输出的顺序(默认),也可以通过“ order ”参数指定。例如,order = [0,1]将首先预测第0个输出,然后是第一个输出,而order = [1,0]将首先预测我们测试中的最后一个输出变量,然后是第一个输出变量。
下面使用的示例中的RegressorChain与默认输出以适合于多输出回归测试问题的线性SVR。
# example of fitting a chain of linear SVR for multioutput regressionfrom sklearn.datasets import make_regressionfrom sklearn.multioutput import RegressorChainfrom sklearn.svm import LinearSVR# create datasetsX, y = make_regression(n_samples=1000, n_features=10, n_informative=5, n_targets=2, random_state=1)# define modelmodel = LinearSVR()wrapper = RegressorChain(model)# fit modelwrapper.fit(X, y)# make a predictiondata_in = [[-2.02220122, 0.31563495, 0.82797464, -0.30620401, 0.16003707, -1.44411381, 0.87616892, -0.50446586, 0.23009474, 0.76201118]]yhat = wrapper.predict(data_in)# summarize predictionprint(yhat[0])
首先运行示例,首先使用线性SVR预测第一输出变量,然后使用第一模型的输入和输出拟合第二线性SVR预测第二输出变量。这些模型适合整个数据集。
然后,模型的拟合链直接用于对新测试实例进行预测,从而预测所需的两个输出变量。
[-93.147146 23.26938475]
总结
在本文中,我们可以学习到如何开发用于多输出回归的机器学习模型。如果你还在发愁一些机器学习回归算法中,只能输出单一数值,不妨学习本文中列出的一些方法!如果你喜欢本文,可以转发、收藏、加关注~
原文链接:https://machinelearningmastery.com/multi-output-regression-models-with-python/
翻译:未艾信息:www.weainfo.net
--END--
欢迎大家关注我们的公众号:为AI呐喊(weainahan)