机器学习中的升维技术:从概念到实践
机器学习中的升维技术:从概念到实践
升维(Polynomial Regression)是机器学习中一种重要的技术手段,主要用于解决数据呈现非线性关系时的拟合问题。通过将低维数据映射到高维空间,可以更有效地分离混合在一起的样本点,从而提高模型的准确率。本文将详细介绍升维的基本概念,并通过Python代码演示如何实现多项式回归,帮助读者理解这一技术的核心原理和应用场景。
一、升维的基本概念
1. 概念
在低维空间中,我们往往难以对混合在一起的数据进行有效分类。即使强行拟合,最终训练出的模型也可能出现过拟合现象,导致效果不尽如人意。这时,我们可以通过某些算法将样本点投射到更高维度,以此来分开混合在一起的样本点。例如,可以将二维点群通过自生坐标(x1,y1)相乘(x1*y1)作为纵轴方向的分量,从而将点投射到三维空间中。这样,我们就可以用一个平面来划分样本点。
其中,SVM(支持向量机)算法就巧妙地利用了升维的特性。
2. 目的
升维的主要目的是为了解决欠拟合问题,即为了提高模型的预测准确率。当数据维度不足时,模型考虑的因素就会减少,导致预测结果不够精确。通过升维,我们可以增加模型考虑的因素,从而提高预测精度。
3. 多项式回归
多项式回归是升维的一种具体实现方式,它在机器学习中常被用作数据预处理手段。其核心思想是将已有的维度进行组合,以拓展新的维度。当数据呈现非线性关系,即y不随x线性变化时,继续使用多元线性回归模型的效果往往不尽如人意。对此,我们有两种应对方法:
- 使用非线性算法,比如回归树、神经网络等
- 将数据转换为线性关系
而升维就是将数据从非线性关系转变为线性关系的有效手段。假设数据集有两个维度x1和x2,使用多元线性回归模型时,表达式为y=w1x1+w2x2。当使用二阶多项式升维后,数据集将从原来的x1和x2拓展为x1、x2、x1^2、x2^2和x1*x2五个维度,同时将非线性数据转化为线性数据。
二、代码演示
下面通过Python代码演示如何实现多项式回归:
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从一维扩展到二维,以此类推。
观察结果可以发现,随着维度的增加,模型从欠拟合逐渐过渡到合适拟合,最终可能过度拟合。下图直观展示了不同维度下的拟合效果:
由图可知,红色曲线(二次多项式)的拟合效果最佳,而黄色曲线(十次多项式)则出现了明显的过拟合现象。