机器学习中的升维技术:从概念到实践
机器学习中的升维技术:从概念到实践
升维(Polynomial Regression)是机器学习中一种重要的技术手段,主要用于解决数据的非线性关系问题。通过将低维数据映射到高维空间,可以更有效地进行数据分类和预测。本文将从概念、目的和具体实现三个方面详细介绍升维技术,并通过代码演示其在实际应用中的效果。
一、升维
1. 概念
在低维空间中,我们往往难以对混合在一起的数据进行有效分类。即使强行拟合,最终训练的模型也可能出现过拟合现象,导致结果不尽如人意。这时,我们可以通过某些算法将样本点投射到更高维度,以此来分开混合在一起的样本点。例如,可以将二维点群通过自生坐标(x1,y1)相乘(x1*y1)作为纵轴方向的分量,从而将点投射到三维空间中。这样,我们就可以用一个平面来划分样本点。
其中,SVM(支持向量机)算法就很好地利用了升维的特性。
2. 目的
升维的主要目的是为了解决欠拟合问题,提高模型的预测准确率。当数据维度不足时,模型考虑的因素就会减少,导致预测结果不够精确。通过升维,可以增加模型的表达能力,使其更好地拟合数据。
3. 多项式回归
多项式回归是升维的一种具体实现方式,它通常被视作机器学习中的数据预处理手段。其主要目的是通过组合已有的维度来拓展新的维度。当数据呈现非线性关系时,继续使用多元线性回归模型的效果往往不佳。对此,我们有两种应对方法:
- 使用非线性算法,如回归树、神经网络等
- 将数据转换为线性关系
升维就是将数据从非线性关系转变为线性关系的有效手段。假设数据集有两个维度x1和x2,使用多元线性回归时模型为y = w1x1 + w2x2。当使用二阶多项式升维后,数据集将从原来的x1和x2拓展为x1、x2、x1^2、x2^2和x1*x2五个维度,同时将非线性数据转化为线性数据。
二、代码演示
下面通过一个具体的代码示例来演示升维技术的应用:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
np.random.seed(42) # 固定随机种子,便于测试算法
m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)
# 分割数据集为训练集和测试集
X_train = X[:80]
y_train = y[:80]
X_test = X[80:]
y_test = y[80:]
plt.plot(X, y, 'b.')
d = {1: 'g-', 2: 'r+', 10: 'y*'} # 键代表提升的维度,值为图像颜色
for i in d:
poly_features = PolynomialFeatures(degree=i, include_bias=True) # 将特征值升维
X_poly_train = poly_features.fit_transform(X_train)
X_poly_test = poly_features.fit_transform(X_test)
lin_reg = LinearRegression(fit_intercept=False)
lin_reg.fit(X_poly_train, y_train)
print("{}-Dimension:".format(i))
print("bias:", lin_reg.intercept_)
print("w:", lin_reg.coef_)
y_train_predict = lin_reg.predict(X_poly_train)
y_test_predict = lin_reg.predict(X_poly_test)
plt.plot(X_poly_train[:, 1], y_train_predict, d[i]) # 为了可视化,选取一个维度
print("Train_MSE:", mean_squared_error(y_train, y_train_predict))
print("Test_MSE:", mean_squared_error(y_test, y_test_predict))
print("Distance:", mean_squared_error(y_test, y_test_predict) - mean_squared_error(y_train, y_train_predict))
print("---------------" * 10)
plt.show()
运行结果:
由于代码中将偏置项设置为0,因此bias为0。可以看到,随着维度的增加,权重w从一维拓展为二维。观察结果可以发现,随着维度的上升,模型从欠拟合逐渐过渡到合适拟合,最终可能过拟合。下图直观展示了不同维度下的拟合效果:
由图可知,红色的曲线(二阶多项式)拟合效果最好,而棕黄色的曲线(十阶多项式)则出现了过拟合现象。