机器学习:升维(Polynomial Regression)

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

环境: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五个维度,同时将非线性数据转化为线性数据。

二,代码演示

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)#将特征值升维,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从一维拓展为二维。后面同理可得。

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

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

相关推荐
编程迪9 分钟前
自研PHP版本AI口播数字人系统源码适配支持公众号H5小程序
人工智能·数字人系统源码·口播数字人·数字人小程序·数字人开源
yangjiwei020710 分钟前
数据结构-排序
数据结构·python
Anna_Tong13 分钟前
人工智能的视觉天赋:一文读懂卷积神经网络
人工智能·神经网络·cnn
秋天下着雨22 分钟前
apifox调用jar程序
java·python·jar
bs_10124 分钟前
【保姆式】python调用api通过机器人发送文件到飞书指定群聊
python·机器人·飞书
ZHOU_WUYI35 分钟前
adb 安装教程
人工智能·adb
Redamancy_Xun1 小时前
软件老化分析
python·程序人生·安全威胁分析·可信计算技术·安全架构
weixin_443042651 小时前
信息系统管理师试题-转型升级
人工智能·信息系统项目管理师
geovindu1 小时前
python: Oracle Stored Procedure query table
数据库·python·mysql·postgresql·oracle·sqlserver·mssql
NiNg_1_2341 小时前
Python中SKlearn的K-means使用详解
python·kmeans·sklearn