绘制随机森林回归多输出

Beginner

This tutorial is from open-source community. Access the source code

简介

本实验展示了如何使用多输出元估计器来执行多输出回归。我们使用了随机森林回归器,它原生支持多输出回归,因此可以对结果进行比较。本实验的目的是展示如何在 scikit-learn 中使用MultiOutputRegressor来执行多输出回归,并将结果与标准随机森林回归器进行比较。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

导入库

首先,我们需要导入必要的库。我们将使用numpymatplotlib以及 scikit-learn 中的RandomForestRegressortrain_test_splitMultiOutputRegressor

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.multioutput import MultiOutputRegressor

创建一个随机数据集

接下来,我们将创建一个随机数据集用于回归。我们将使用numpy创建一组 600 个介于 -100 和 100 之间的 x 值,并根据 x 值的正弦和余弦计算出相应的 y 值,再加上一些随机噪声。

rng = np.random.RandomState(1)
X = np.sort(200 * rng.rand(600, 1) - 100, axis=0)
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y += 0.5 - rng.rand(*y.shape)

将数据拆分为训练集和测试集

我们将使用 scikit-learn 的train_test_split函数把数据拆分为一个包含 400 个样本的训练集和一个包含 200 个样本的测试集。

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=400, test_size=200, random_state=4)

创建随机森林回归器

我们将使用 scikit-learn 的RandomForestRegressor创建一个最大深度为 30 且有 100 个估计器的随机森林回归器。

max_depth = 30
regr_rf = RandomForestRegressor(n_estimators=100, max_depth=max_depth, random_state=2)
regr_rf.fit(X_train, y_train)

创建多输出回归器

我们将使用随机森林回归器作为基础估计器来创建一个MultiOutputRegressor。我们将使用与步骤 4 中相同的参数。

regr_multirf = MultiOutputRegressor(RandomForestRegressor(n_estimators=100, max_depth=max_depth, random_state=0))
regr_multirf.fit(X_train, y_train)

对新数据进行预测

我们将使用随机森林回归器和多输出回归器对测试数据进行预测。

y_rf = regr_rf.predict(X_test)
y_multirf = regr_multirf.predict(X_test)

绘制结果

我们将绘制结果以比较两个回归器的性能。我们将使用matplotlib创建一个散点图,展示实际测试数据、随机森林回归器做出的预测以及多输出回归器做出的预测。

plt.figure()
s = 50
a = 0.4
plt.scatter(y_test[:, 0], y_test[:, 1], edgecolor="k", c="navy", s=s, marker="s", alpha=a, label="Data")
plt.scatter(y_rf[:, 0], y_rf[:, 1], edgecolor="k", c="c", s=s, marker="^", alpha=a, label="RF score=%.2f" % regr_rf.score(X_test, y_test))
plt.scatter(y_multirf[:, 0], y_multirf[:, 1], edgecolor="k", c="cornflowerblue", s=s, alpha=a, label="Multi RF score=%.2f" % regr_multirf.score(X_test, y_test))
plt.xlim([-6, 6])
plt.ylim([-6, 6])
plt.xlabel("target 1")
plt.ylabel("target 2")
plt.title("Comparing Random Forests and the Multi-Output Meta Estimator")
plt.legend()
plt.show()

总结

本实验展示了如何使用 scikit-learn 的MultiOutputRegressor来执行多输出回归。我们使用一个随机数据集,将多输出回归器的性能与标准随机森林回归器进行了比较。结果表明,多输出回归器的表现略优于随机森林回归器。