问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

机器学习模型——非线性回归

创作时间:
作者:
@小白创作中心

机器学习模型——非线性回归

引用
CSDN
1.
https://blog.csdn.net/qq_60688380/article/details/136968451

在机器学习中,非线性回归问题是一个常见的挑战。本文将介绍如何通过升维技术将非线性问题转换为线性问题,从而提高模型的预测能力。我们将通过多项式回归、深度学习中的噪音分离、矩阵乘法等方法,结合具体的Python代码示例,展示升维技术在处理非线性数据时的应用。

处理的思路:

将非线性问题转换为线性问题

方法:

升维

升维是一种常用的处理非线性问题的方法,它通过将原始数据从低维空间映射到高维空间来增强模型的表达能力。以下是升维的一些具体原理和方法:

  1. 多项式回归:这是一种常见的升维方法,通过将已有的特征进行相乘(包括特征与自身相乘),从而生成新的特征维度。例如,在一元多项式回归中,如果因变量y与自变量x的关系是非线性的,可以通过引入x的平方项、立方项等来构建新的特征,使得模型能够捕捉到数据的非线性关系。

  2. 分离噪音与有用信息:在深度学习中,升维还可以帮助分离噪音和有用的信息。通过增加维度,网络可以学习到不同特征的权重,从而提高有用信息的权重,降低噪音的权重,这有助于提取数据中的关键特征。

  3. 矩阵乘法:在某些情况下,如Embedding层,升维是通过矩阵乘法来实现的。这种方法可以将低维数据映射到高维空间,可能会放大某些特征或者将笼统的特征分开,从而改善模型的性能。

  4. 解决欠拟合问题:升维的一个主要目的是解决模型的欠拟合问题,即当模型因为考虑的因素较少而无法准确预测时,通过增加特征的复杂度来提高模型的准确率。

  5. 保持一致性:在进行升维操作时,需要确保对训练集、测试集和验证集的数据都进行相同的升维处理,以保持数据的一致性和模型的准确性。

升维里的degree设置的不易过大,否则容易造成维度灾难。

import numpy as np
import pandas as pd
# 数据范围  -3 3
X = 6 * np.random.random(100) - 3
y = 2 * X ** 2 + X + 3 + 5 * np.random.rand(100)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X.reshape(-1, 1), y)
X_line = np.linspace(-3, 3, 5)
y_line = lr.predict(X_line.reshape(-1, 1))
import matplotlib.pyplot as plt
plt.scatter(X, y)
plt.plot(X_line, y_line, c='r')
plt.show()  

我们可以看出,二维数据用一维直线很难去很好的拟合。所以我们进行升维

import numpy as np
import pandas as pd
# 数据范围  -3 3
X = 6 * np.random.random(100) - 3
y = 2 * X ** 2 + X + 3 + 5 * np.random.rand(100)
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X.reshape(-1, 1))
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_poly, y)
lst = [[1],
       [3],
       [5]]
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
ret = poly.fit_transform(lst)
print(ret)
# 从这个例子中我们可以看出,coef里的结果第一个时x的系数,第二个是x^2的系数
# 绘制折线图
X_line = np.linspace(-3, 3, 100)
print(lr.coef_)    # 系数
print(lr.intercept_)  # 偏置
y_line = X_line * lr.coef_[0] + X_line ** 2 * lr.coef_[1] + lr.intercept_   #用公式进行输出y_line的值,
import matplotlib.pyplot as plt
plt.scatter(X, y)
plt.plot(X_line, y_line, c='r')
plt.show()
  

升维后,拟合的线与原数据比较符合

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号