机器学习:升维(Polynomial Regression)

发布于:2024-04-30 ⋅ 阅读:(43) ⋅ 点赞:(0)

本篇文章包含升维的基本概念以及代码演示部分

环境:Pycharm

 一,升维

1.概念

在低纬度中,我们难以对混合在一起的数据进行分类,即使强硬地去拟合,最终训练的模型也会出现过拟合,不尽人意。这时,我们可以通过某些算法将样本点投射到更高维度以此分开混合在一起的样本点。例如将二维的点群通过自生坐标(x1,y1)相乘x1*y1作为纵轴方向的分量。如此我们将点投射到三维空间中,从而我们可以用一个平面来划分样本点。

其中,SVM算法就利用了升维的特性。

2.目的

升维的目的时为了解决欠拟合问题的,也就是为了提高模型的准确率为目的。当维度不够时,说白了就是对于预测结果考虑的因素少,结果自然而然不够精确。

3.多项式回归

多项式回归时升维的一种,它可以算是机器学习中的一种算法,不过和归一化一样一般算作数据预处理手段,他的目的就是将已有的维度进行组合来拓展维度。

当数据呈现非线性关系,即y不随x线性变化时,继续使用多元线性回归模型效果难堪,对此我们有两种对应方法:

(1)使用非线性算法,比如回归树,神经网络等

(2)将数据变成线性关系

 而升维就是将数据从非线性关系转变为线性关系的手段。

假设数据集有两个维度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)#将特征值升维,degree代表提升维度,include_bias添加偏置
    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()

 运行结果

因为代码中我们将偏置置零,bias为0。

可以看到,w从一维拓展为二维。后面同理可得。

 

观察可得,随着维度上升,模型从欠拟合到合适拟合再到过拟合,下图可视化后更加明显。

 

由图可知,红色的曲线拟合得最好,而棕黄色的曲线过拟合。 


网站公告

今日签到

点亮在社区的每一天
去签到