基于sklearn框架实现线性回归,多项式回归和支持向量机的项目实战


前言

在本实验中,您实现了多个简单机器学习的回归算法。 尽管它很简单,但是该算法非常强大,可以满足您的许多机器学习需求。 因此,研究人员想出各种技巧使其更有效也就不足为奇了。 在本实验中,我们将研究其中的一些。 但是,让我们首先修改基本模型。


提示:以下是本篇文章正文内容,下面案例可供参考

一、 Vanilla linear regression

为了重现性,让我们设置随机生成器的种子:

import numpy as np

# make numpy randomisation predictable
np.random.seed(0)

然后,让我们导入scikit库中包含的波士顿房价数据集:

from sklearn.datasets import load_boston

# load dataset
boston = load_boston()

并将数据集分为两部分:80%训练集和20%测试集。

# partition the dataset into training and test sets
rnd_indices = np.random.permutation(boston.data.shape[0])
train_size = int(boston.data.shape[0] * 0.8)
train_indices = rnd_indices[:train_size]
test_indices = rnd_indices[train_size:]

train_data = boston.data[train_indices, :]
test_data = boston.data[test_indices, :]
train_target = boston.target[train_indices]
test_target = boston.target[test_indices]

最后,是时候训练我们的线性回归模型了:

from sklearn.linear_model import LinearRegression

# fit a linear regressor
lin_reg = LinearRegression()
lin_reg.fit(train_data, train_target)

修改以下代码以同时打印训练和测试RMSE。

train_predict = lin_reg.predict(train_data)
train_rmse = np.sqrt(((train_target - train_predict) ** 2).mean())
print(train_rmse)

特征放缩

我们研究的第一个技巧是数据清理技术,这是一个很普遍的技术。 在将训练集提供给您喜欢的机器算法之前,最好对输入特征进行标准化。 这意味着对其进行缩放,以使它们的值或多或少地落在同一范围内。 scikit库提供两种不同的缩放方法:最小-最大缩放和标准缩放。

让我们尝试选择标准的缩放方法并编写一些示例代码:

scaler = StandardScaler()
scaler.fit(train_data)
scaled_train_data = scaler.transform(train_data)
scaled_test_data = scaler.transform(test_data)

正则化线性模型
机器学习算法受噪声和离群值的影响。 最重要的是,我们正在使用的模型可能对于眼前的问题过于强大,最终过度拟合。 为了避免这种情况,我们可以限制学习努力的结果,并避免为模型的权重选择极端值。 这称为正则化,可在ML频谱中找到许多应用程序。

在这里,我们看一下线性模型的两种选择:岭回归和套索回归。

用scikit编码它们非常容易。 这是一个例子:

# fit a ridge regressor
alpha_ridge = 1
ridge_reg = Ridge(alpha_ridge, solver="cholesky")
ridge_reg.fit(train_data, train_target)

# fit a lasso regressor
alpha_lasso = 1
lasso_reg = Lasso(alpha_lasso)
lasso_reg.fit(train_data, train_target)

二、Support Vector Machines (for regression)

支持向量机(SVM)不仅可以用于分类,还可以用于回归! 此外,它们已经提供了一种隐式方式,可通过更改边距epsilon的宽度来规范化结果。

练习4.1。 修改以下代码,以在波士顿房价数据集上训练SVM回归器。 打印培训并测试RMSE。

# fit a support vector machine regressor
epsilon_svm = 1
svm_reg = LinearSVR(epsilon_svm)
svm_reg.fit(train_data, train_target)

三,Polynomial regression

线性回归很好,但有时数据集需要非线性模型。 在这方面,机器学习文献提供了相当多的非线性回归算法。 这里我们看一个最简单的多项式回归。

在实现算法之前,让我们创建一个综合数据集:

n = 100
data = 12 * np.random.rand(n, 1) - 3.9
target = 0.09 * (data**3) + 0.3 * (data**2) - 4.1 * data - 2.4 + 4.79 * np.random.randn(n, 1)

多项式回归背后的想法是扩大输入要素的数量。 我们通过采用现有的并相互相乘来做到这一点。 更正式地说,我们为给定的输入特征创建任意数量的多项式。

scikit包允许我们用以下几行代码来实现:

# fit a quadratic regressor
poly_features = PolynomialFeatures(degree=2, include_bias=False)
poly_train_data = poly_features.fit_transform(train_data)
lin_reg = LinearRegression()
lin_reg.fit(poly_train_data, train_target)

上面的代码创建二次特征,即二阶多项式。 如果需要更强大的模型,可以选择更高的学位。 当然,这将创建越来越多特征,可能使我们的模型过拟合。

最后,我们可以修改SVM代码以进行多项式回归。 注意,SVM将常规特征作为输入,并使用多项式内核对其进行操作:

svm_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_reg.fit(train_data, np.ravel(train_target))

提示:您可以修改下面的代码并打印四个单独的图。

plt.figure()
plt.plot(train_data, train_target, "*", train_data, lin_train_predict, ".", test_data, test_target, "*", test_data, lin_test_predict, ".")

猜你喜欢

转载自blog.csdn.net/qq_39297053/article/details/109232227