所有文章 > AI驱动 > 突破最强算法模型,回归算法!!!

突破最强算法模型,回归算法!!!

# 处理非线性关系

1. 多项式回归

多项式回归通过引入原始特征的高次幂,将线性模型扩展到非线性关系。

例如,对于一个特征 ,多项式回归可以考虑添加 、 等项。

对于一元多项式回归(二次多项式):

对于多元多项式回归:

关键有3点

  1. 防止过拟合: 高次项的引入可能导致过拟合,因此需要谨慎选择多项式的次数。
  2. 选择最佳次数: 可以使用交叉验证或学习曲线来选择最合适的多项式次数。
  3. 特征缩放: 在使用多项式回归前,通常需要进行特征缩放,确保不同特征的尺度一致。

2. 变换方法(对数变换等)

变换方法通过对原始数据进行某种数学变换,使数据更符合线性关系。对数变换是其中一种常见的方法,尤其适用于数据呈指数增长的情况。

对数变换:

关键有2点:

  1. 对数变换的条件: 适用于正数数据,特别是在数据存在指数增长趋势时。
  2. 恢复变换后的预测值: 对数变换后的预测值需要通过指数函数进行逆变换,以获得原始的预测值。 

注意点和一些建议:

  1. 探索性数据分析(EDA): 在应用多项式回归或变换方法前,进行探索性数据分析以了解数据的分布和特性。
  2. 尝试不同方法: 在处理非线性关系时,尝试多项式回归和变换方法,并根据模型性能选择最适合的方法。
  3. 注意异常值: 非线性关系的发现可能受到异常值的影响,因此在进行建模前要处理异常值。
  4. 模型评估: 使用适当的评估指标(如均方误差、R平方等)来评估模型性能,确保选择的方法在测试数据上也表现良好。

总体而言,当数据关系非线性时,多项式回归和变换方法是常见的处理手段,但在使用它们时需要谨慎选择并进行适当的模型评估。

如果有问题,评论区可以继续探讨~

# 区分L1和L2正则化

下面聊一聊,大家一起深入了解它们的区别和对回归模型的影响。

1. 区别

a. 正则化项的形式:

  • L1正则化(LASSO): 使用的是模型参数的绝对值之和(L1范数)作为正则化项。

L2正则化(岭回归): 使用的是模型参数的平方和的平方根(L2范数)作为正则化项。

b. 特征选择:

  • L1正则化(LASSO): 具有特征选择的效果,可以使得某些模型参数变为零,实现稀疏性,即减少不重要的特征。
  • L2正则化(岭回归): 一般不会将模型参数压缩到零,对所有特征都进行缩放。

c. 解的稳定性:

  • L1正则化(LASSO): 在某些情况下,可能导致解不稳定,因为正则化项的形状使得某些参数在特定条件下可能变为零。
  • L2正则化(岭回归): 通常对参数施加平滑约束,更容易得到稳定的解。

2. 影响回归模型的方式

a. 参数收缩:

  • L1正则化(LASSO): 可以将某些模型参数缩小到零,实现特征选择,剔除不重要的特征,从而降低模型复杂度。
  • L2正则化(岭回归): 缩小了所有模型参数,但很少使其变为零。通过减小参数的幅度,岭回归有助于处理共线性问题。

b. 模型复杂度:

  • L1正则化(LASSO): 更倾向于生成稀疏模型,适用于特征较多,但只有少数对目标变量有显著影响的情况。
  • L2正则化(岭回归): 平滑参数,有助于处理多重共线性,适用于特征间关联较强的情况。

3. 注意点和一些建议

  1. 超参数调整: 选择合适的正则化强度参数((\lambda))很重要,通常通过交叉验证来确定。
  2. 问题特征: 根据问题特征的性质选择正则化方法。如果认为只有少数特征对问题有贡献,可以考虑使用L1正则化(LASSO)。
  3. 综合考虑: 有时候,也可以同时使用L1和L2正则化,称为弹性网络(Elastic Net),以综合利用它们的优势。

总的来说,L1和L2正则化是在回归模型中用于控制模型复杂度的有效手段,选择取决于具体问题和数据的性质。

# 学习曲线和验证曲线的解读

下面我会分别介绍学习曲线验证曲线,并说明它们能告诉我们的信息以及如何根据它们来调整模型参数。

学习曲线

学习曲线(Learning Curve)是一种用于分析模型性能的图表,它展示了训练数据大小与模型性能之间的关系。通常,学习曲线会随着训练数据量的增加而变化。学习曲线的两个关键指标是训练集上的性能和验证集上的性能。

学习曲线能告诉我们的信息:

  • 欠拟合: 如果训练集和验证集上的性能都很差,那么可能是模型过于简单,无法捕捉数据的复杂性。
  • 过拟合: 如果训练集上的性能很好,但验证集上的性能较差,那么可能是模型过于复杂,学习到了训练集的噪声。
  • 合适的模型复杂度: 当训练集和验证集上的性能趋于稳定且收敛时,可以认为找到了合适的模型复杂度。

如何根据学习曲线调整模型参数:

  • 欠拟合时: 可以尝试增加模型复杂度,如增加多项式特征、使用更复杂的模型等。
  • 过拟合时: 可以尝试减少模型复杂度,如减少特征数量、增加正则化、采用更简单的模型等。

验证曲线

验证曲线(Validation Curve)是一种图表,用于分析模型性能与某一参数(例如正则化参数、模型复杂度等)之间的关系。通过在不同参数取值下评估模型的性能,我们可以找到最优的参数取值。

验证曲线能告诉我们的信息:

  • 最优参数取值: 通过观察验证曲线的变化趋势,我们可以确定哪个参数值对模型性能有最大的提升。
  • 过拟合和欠拟合: 验证曲线也可以用于检测过拟合和欠拟合,如果验证集上的性能在某些参数值下出现较大的波动,可能是因为模型处于过拟合或欠拟合状态。

如何根据验证曲线调整模型参数:

  • 选择最优参数: 根据验证曲线的趋势,选择能够使验证集性能最优的参数取值。
  • 调整模型复杂度: 如果验证曲线显示出模型过拟合或欠拟合,可以相应地调整模型复杂度或正则化参数。

这里,用代码演示了使用学习曲线和验证曲线来评估回归模型,并调整模型参数,可以作为参考~

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import learning_curve, validation_curve

# 生成随机回归数据
X, y = make_regression(n_samples=1000, n_features=20, noise=0.2, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义线性回归模型
estimator = LinearRegression()

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=None, train_sizes=np.linspace(.1, 1.0, 5)):
plt.figure()
plt.title(title)
if ylim is not None:
plt.ylim(*ylim)
plt.xlabel("Training examples")
plt.ylabel("Score")
train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
plt.grid()

plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
train_scores_mean + train_scores_std, alpha=0.1,
color="r")
plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
test_scores_mean + test_scores_std, alpha=0.1, color="g")
plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
label="Training score")
plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
label="Cross-validation score")

plt.legend(loc="best")
return plt

def plot_validation_curve(estimator, title, X, y, param_name, param_range, cv=None, scoring=None):
train_scores, test_scores = validation_curve(
estimator, X, y, param_name=param_name, param_range=param_range,
cv=cv, scoring=scoring)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)

plt.title(title)
plt.xlabel(param_name)
plt.ylabel("Score")
plt.ylim(0.0, 1.1)
lw = 2
plt.plot(param_range, train_scores_mean, label="Training score",
color="darkorange", lw=lw)
plt.fill_between(param_range, train_scores_mean - train_scores_std,
train_scores_mean + train_scores_std, alpha=0.2,
color="darkorange", lw=lw)
plt.plot(param_range, test_scores_mean, label="Cross-validation score",
color="navy", lw=lw)
plt.fill_between(param_range, test_scores_mean - test_scores_std,
test_scores_mean + test_scores_std, alpha=0.2,
color="navy", lw=lw)
plt.legend(loc="best")
return plt

# 使用示例
plot_learning_curve(estimator, "Learning Curve", X_train, y_train, cv=5)
plt.show()

在这段代码中,我们首先定义了一个线性回归模型 LinearRegression(),然后将其传递给了 plot_learning_curve 函数。这样就可以成功绘制学习曲线了。

# 非线性回归模型的例子

下面我介绍几种常见的非线性回归模型,并与线性回归进行对比。这样可以更容易理解。

1. 多项式回归

多项式回归是一种将自变量的高次项加入模型的方法,例如:

这与线性回归的不同之处在于,自变量  的幂次不仅限于一次。通过增加高次项,模型能够更好地拟合非线性关系。

2. 指数回归

指数回归是一种通过指数函数来建模的方法,例如:

这种模型表达了因变量随自变量呈指数增长或指数衰减的趋势。

3. 对数回归

对数回归是一种通过对自变量或因变量取对数来建模的方法,例如:

或者

这种方法适用于当数据呈现出指数增长或衰减的趋势时。

4. 广义可加模型(Generalized Additive Models, GAM)

GAM 是一种更一般化的非线性回归模型,它使用非线性函数来拟合每个自变量,例如:

这里的  是非线性函数,可以是平滑的样条函数或其他灵活的函数形式。

这些非线性回归模型与线性回归的主要不同之处在于它们允许了更加灵活的自变量和因变量之间的关系。线性回归假设了自变量和因变量之间的关系是线性的,而非线性回归模型通过引入非线性函数来更好地拟合真实世界中更为复杂的数据关系。这使得非线性模型能够更准确地描述数据,但也可能导致更复杂的模型结构和更难以解释的结果。

下面是一个使用多项式回归的代码~

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 生成带噪声的非线性数据
np.random.seed(0)
X = np.linspace(-3, 3, 100)
y = 2 * X**3 - 3 * X**2 + 4 * X - 5 + np.random.normal(0, 10, 100)

# 将 X 转换成矩阵形式
X = X[:, np.newaxis]

# 使用多项式特征进行变换
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)

# 构建并拟合多项式回归模型
model = LinearRegression()
model.fit(X_poly, y)

# 绘制原始数据和拟合曲线
plt.scatter(X, y, color='blue')
plt.plot(X, model.predict(X_poly), color='red')
plt.title('Polynomial Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

这段代码使用了 PolynomialFeatures 来对自变量进行多项式特征变换,然后使用 LinearRegression 拟合多项式回归模型,并绘制了原始数据和拟合曲线的图像。

如果有问题,随时再反馈~

# 自相关性

今天先聊聊自相关性。时间序列数据中的自相关指的是数据中同一变量在不同时间点之间的相关性。换句话说,它衡量了时间序列中一个时间点的观测值与另一个时间点的观测值之间的相关程度。自相关通常在时间序列数据分析中被用来检测数据中的周期性或趋势性。

如果数据存在自相关,会对回归模型造成一些影响。具体来说,自相关可能导致模型中的残差(预测值与实际值之间的差异)不再独立,从而违反了线性回归模型的基本假设之一,即残差之间相互独立。这会导致模型的系数估计不准确,使得模型预测能力下降,同时可能增加对时间序列中随机波动的敏感性。

在检测和处理自相关性方面,通常有 4 种方法:

1. 自相关函数(ACF)和偏自相关函数(PACF):通过绘制数据的自相关函数图和偏自相关函数图,可以直观地查看时间序列数据中自相关的模式。ACF和PACF可以帮助确定时间序列中的阶数,从而选择合适的自回归(AR)和移动平均(MA)模型

2. 差分法(Differencing):通过对时间序列数据进行一阶或多阶差分,可以消除或减弱数据中的自相关性。差分法的基本思想是通过计算相邻时间点之间的差异来去除趋势和季节性,从而使得数据更加平稳。

3. 自回归移动平均模型(ARMA):ARMA模型是一种结合了自回归和移动平均的模型,可以用来建模时间序列数据中的自相关性。通过拟合ARMA模型,可以估计出数据中的自相关结构,并进一步进行预测。

4. 自回归积分移动平均模型(ARIMA):ARIMA模型在ARMA的基础上引入了差分法,可以处理非平稳的时间序列数据。ARIMA模型可以有效地消除数据中的自相关性,并提高模型的准确性。

下面,咱们实现一个利用差分法来处理自相关性的代码~

import torch
import numpy as np
import matplotlib.pyplot as plt

# 生成示例时间序列数据
np.random.seed(0)
n = 100
t = np.arange(n)
y = 0.5 * t + 0.3 * np.sin(0.1 * t) + np.random.normal(0, 1, n)

# 绘制原始时间序列图
plt.figure(figsize=(10, 4))
plt.plot(t, y, label='Original Time Series')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Original Time Series Data')
plt.legend()
plt.grid(True)
plt.show()

# 计算一阶差分
diff_y = np.diff(y)

# 绘制一阶差分后的时间序列图
plt.figure(figsize=(10, 4))
plt.plot(t[1:], diff_y, label='First Difference')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('First Difference Time Series Data')
plt.legend()
plt.grid(True)
plt.show()

在上面的示例中,我们首先生成了一个示例的时间序列数据。

然后计算了这个时间序列数据的一阶差分,并绘制了原始时间序列数据和一阶差分后的时间序列数据。通过一阶差分,我们可以看到原始数据中的趋势和季节性被去除,从而减弱了数据中的自相关性。

本文章转载微信公众号@深夜努力写Python