分享

通透!十大回归模型最强总结!!

 dakawang 2024-03-05 发布于北京


哈喽,我是cos大壮~

前几天发布了关于分类算法的一些总结,不少人给予了反馈。

令我没想到的是,居然足足有一半的人想要看关于回归的总结,今天它来了!~

先来进行一个简单的介绍,回归算法的重要性体现在其能够建立特征与目标之间的关系模型,实现预测、关系分析和特征重要性评估等多方面的应用。通过回归分析,我们能够理解变量之间的趋势、检测异常值、为决策提供支持,并在时间序列中进行趋势分析,为数据科学和实际问题提供有力的工具。

老规矩大家伙如果觉得近期文章还不错!欢迎大家点个赞、转个发~

其次,咱们今天从下面 10 个方面,全面理解回归,全面熟悉回归的重要意义和所有的操作。

  • 线性回归
  • 岭回归
  • Lasso回归
  • 决策树回归
  • 随机森林回归
  • 梯度提升回归
  • 支持向量回归
  • XGBoost回归
  • LightGBM回归
  • 神经网络回归
图片

咱们一起来看看回归所有的内容~

线性回归

线性回归绝对是我们大家最熟悉的一个算法模型。线性回归是一种用于建模和分析变量之间关系的统计方法,特别是用于预测一个变量(被称为因变量)与一个或多个自变量之间的关系。在简单线性回归中,只有一个自变量,而在多元线性回归中,有多个自变量。

核心原理

1. 简单线性回归

在简单线性回归中,我们试图建立一个线性关系模型:

其中:

  •  是因变量(要预测的变量),
  •  是自变量(用于预测的变量),
  •  是截距项(模型在  时的取值),
  •  是斜率(表示  的变化对  的影响),
  •  是误差项。

我们的目标是找到最优的    来最小化误差项 

简单线性回归的最小二乘法

最小二乘法的目标是最小化残差平方和(Residual Sum of Squares,RSS)。我们定义残差为观测值与模型预测值之差,即 。最小二乘法的目标是最小化 

通过对      求偏导数,并令其等于零,可以得到最优解。

最终, 的最优解为:

其中    分别是    的均值。

 的最优解为:

2. 多元线性回归

在多元线性回归中,有多个自变量,模型的表达式为:

其中  是自变量的数量。

优缺点和适用场景

优点:

  • 简单易于理解和实现。
  • 在数据线性关系较强时表现良好。

缺点:

  • 对异常值和噪声敏感。
  • 仅能捕捉线性关系,无法处理非线性关系。

适用场景:

  • 数据呈现线性关系。
  • 对解释性要求较高的情况。

一个核心案例代码

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

# 生成示例数据
np.random.seed(0)
X = 2 * np.random.rand(1001)
Y = 4 + 3 * X + np.random.randn(1001)

# 使用最小二乘法计算斜率和截距
X_mean = np.mean(X)
Y_mean = np.mean(Y)
numerator = np.sum((X - X_mean) * (Y - Y_mean))
denominator = np.sum((X - X_mean)**2)
beta_1 = numerator / denominator
beta_0 = Y_mean - beta_1 * X_mean

# 使用sklearn进行线性回归
model = LinearRegression()
model.fit(X, Y)

# 绘制数据点和回归线
plt.scatter(X, Y, label='Data Points')
plt.plot(X, beta_0 + beta_1 * X, color='red', label='Regression Line (Manual)')
plt.plot(X, model.predict(X), color='green', linestyle='dashed', label='Regression Line (Sklearn)')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
图片

线性回归是一种简单而有效的建模方法,通过最小二乘法求解最优参数。然而,它对数据要求较高,对异常值和非线性关系敏感。适用于数据呈现线性关系、对解释性要求较高的场景。

岭回归

岭回归(Ridge Regression)是一种用于处理多重共线性问题的线性回归扩展。多重共线性指的是自变量之间存在高度相关性的情况,这会导致普通线性回归的参数估计不稳定。岭回归通过在损失函数中引入正则化项(L2范数)来解决这个问题。

核心原理

考虑岭回归的优化目标,我们的损失函数由最小二乘法的目标改变为:

其中:

  •  是因变量,
  •  是第  个自变量的第  个观测值,
  •  是第  个自变量的系数,
  •  是正则化参数,用于控制正则化项的影响。

最终,岭回归的优化目标是最小化 

推导岭回归的最小二乘法

通过对损失函数求偏导数,并令其等于零,我们可以得到岭回归的最优解。考虑损失函数中的正则化项,我们得到以下岭回归的闭式解:

其中  是自变量矩阵, 是因变量向量, 是单位矩阵。

优缺点和适用场景

优点:

  • 解决多重共线性问题,提高模型稳定性。
  • 可以处理高维数据,防止过拟合。

缺点:

  • 需要调整正则化参数 
  • 不适用于特征数量比样本数量大的情况。

适用场景:

  • 自变量之间存在高度相关性。
  • 高维数据集。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler

# 生成示例数据
np.random.seed(0)
X = 2 * np.random.rand(1001)
Y = 4 + 3 * X + np.random.randn(1001)

# 使用岭回归进行建模
alpha = 1.0
ridge_model = Ridge(alpha=alpha)
ridge_model.fit(X, Y)

# 绘制数据点和岭回归线
plt.scatter(X, Y, label='Data Points')
plt.plot(X, ridge_model.predict(X), color='red', label=f'Ridge Regression (alpha={alpha})')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
图片

岭回归是一种用于解决多重共线性问题的线性回归方法,通过引入正则化项提高模型稳定性。它适用于自变量之间存在高度相关性的情况,但需要调整正则化参数。在实际使用中,可以通过交叉验证等方法选择合适的 

Lasso回归

Lasso回归(Least Absolute Shrinkage and Selection Operator Regression)是一种用于处理多重共线性问题的线性回归方法。与岭回归类似,Lasso回归引入了正则化项,但使用的是L1范数,可以导致部分系数变为零,从而实现特征选择的效果。

核心原理

考虑Lasso回归的优化目标,我们的损失函数由最小二乘法的目标改变为:

其中:

  •  是因变量,
  •  是第  个自变量的第  个观测值,
  •  是第  个自变量的系数,
  •  是正则化参数,用于控制正则化项的影响。

最终,Lasso回归的优化目标是最小化 

推导Lasso回归的最小二乘法

通过对损失函数求偏导数,我们可以得到Lasso回归的最优解。考虑损失函数中的正则化项,我们得到以下Lasso回归的闭式解:

其中    的符号函数。由于  不是处处可导,我们可以使用次梯度来解决。

优缺点和适用场景

优点

  • 可以实现特征选择,将一些系数变为零。
  • 在高维数据集中表现较好。

缺点

  • 不适用于特征数量比样本数量大的情况。
  • 对于高度相关的变量,可能只选择其中之一。

适用场景

  • 数据集中存在多重共线性。
  • 希望通过模型进行特征选择。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

# 生成示例数据
np.random.seed(0)
X = 2 * np.random.rand(1001)
Y = 4 + 3 * X + np.random.randn(1001)

# 使用Lasso回归进行建模
alpha = 0.1
lasso_model = Lasso(alpha=alpha)
lasso_model.fit(X, Y)

# 绘制数据点和Lasso回归线
plt.scatter(X, Y, label='Data Points')
plt.plot(X, lasso_model.predict(X), color='red', label=f'Lasso Regression (alpha={alpha})')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
图片

Lasso回归是一种通过引入L1范数正则化项来处理多重共线性问题的线性回归方法。它在高维数据集中表现较好,并可以实现特征选择的效果。在实际的项目中,需要调整正则化参数 

决策树回归

决策树回归是一种基于树结构的回归模型,它通过对输入空间进行递归的划分,将每个划分区域内的样本的目标值取平均值作为预测值。以下是决策树回归的详细原理和核心公式。

核心原理

1. 决策树的建立

决策树的建立分为以下步骤:

  • 选择最佳的划分特征:通过计算每个特征的信息增益或均方误差等指标,选择最佳的特征来进行划分。
  • 划分数据集:根据选择的特征进行数据集的划分,形成子节点。
  • 递归地建立子树:对每个子节点递归地重复上述步骤,直到满足停止条件。

2. 决策树回归预测

对于新的输入样本,通过决策树的结构,从根节点开始逐级判断样本应该属于哪个叶子节点,然后将该叶子节点内训练样本的目标值作为预测值。

3. 决策树回归的核心公式

在决策树回归中,每个叶子节点的目标值  为该节点内训练样本的目标值的平均值。

其中  表示第  个叶子节点内的样本索引集合, 表示该叶子节点内的样本数量。

优缺点和适用场景

优点

  • 易于理解和解释,可视化效果好。
  • 能够处理非线性关系,对异常值和缺失值不敏感。

缺点

  • 容易过拟合,需要通过剪枝等手段进行优化。
  • 对输入数据的变化敏感,稳定性较差。

适用场景

  • 数据具有非线性关系。
  • 需要可解释性和可视化效果好的情况。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor

# 生成示例数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(801), axis=0)
y = np.sin(X).ravel() + np.random.randn(80) * 0.1

# 使用决策树回归进行建模
tree_model = DecisionTreeRegressor(max_depth=4)
tree_model.fit(X, y)

# 预测新数据点
X_test = np.arange(0.05.00.01)[:, np.newaxis]
y_pred = tree_model.predict(X_test)

# 绘制数据点和决策树回归曲线
plt.scatter(X, y, s=20, edgecolor='black', c='darkorange', label='data')
plt.plot(X_test, y_pred, color='cornflowerblue', label='prediction')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Decision Tree Regression')
plt.legend()
plt.show()
图片

决策树回归是一种基于树结构的回归模型,通过递归地划分输入空间来进行预测。它具有易解释性和可视化效果好的特点,适用于处理非线性关系的情况。然而,容易过拟合和对输入数据的变化敏感是其缺点,需要通过剪枝等方法进行优化。

随机森林回归

随机森林回归是一种基于决策树的集成学习算法,通过建立多个决策树并对其进行平均或投票来提高模型的泛化性能。以下是随机森林回归的详细原理和核心公式。

核心原理

1. 随机森林的建立

  • Bagging过程(自助采样): 对训练数据进行有放回的抽样,构建多个不同的训练数据集。

  • 构建决策树: 对每个数据集建立一个决策树,树的建立过程与普通决策树相似。

  • 随机特征选择: 在每个节点的分裂过程中,随机选择一部分特征进行考虑,而不是考虑所有特征。

2. 随机森林回归预测

对于回归问题,随机森林通过对每棵树的预测结果进行平均来得到最终的预测值。

其中  是森林中树的数量, 是第  棵树的预测值。

优缺点和适用场景

优点:

  • 提高模型泛化性能,减少过拟合。
  • 对高维数据和大规模数据表现较好。
  • 可以处理非线性关系和复杂的特征交互。

缺点:

  • 模型解释性较差。
  • 训练过程相对耗时。
  • 在某些数据集上可能过拟合。

适用场景:

  • 复杂的回归问题,特征维度较高的数据集。
  • 数据集中存在噪声和非线性关系。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor

# 生成示例数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(801), axis=0)
y = np.sin(X).ravel() + np.random.randn(80) * 0.1

# 使用随机森林回归进行建模
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X, y)

# 预测新数据点
X_test = np.arange(0.05.00.01)[:, np.newaxis]
y_pred = rf_model.predict(X_test)

# 绘制数据点和随机森林回归曲线
plt.scatter(X, y, s=20, edgecolor='black', c='darkorange', label='data')
plt.plot(X_test, y_pred, color='cornflowerblue', label='prediction')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Random Forest Regression')
plt.legend()
plt.show()
图片

随机森林回归是一种通过构建多个决策树并对其进行集成来提高泛化性能的方法。它适用于复杂的回归问题和高维数据集,具有较好的性能。然而,模型解释性相对较差。实际项目中,可以通过调整树的数量和其他参数来优化模型。

梯度提升回归

梯度提升回归(Gradient Boosting Regression)是一种集成学习方法,通过顺序地构建弱学习器,每个弱学习器修正前一个弱学习器的预测误差,从而得到累积的、更强大的预测模型。以下是梯度提升回归的详细原理和核心公式。

核心原理

1. 基本思想

梯度提升回归的基本思想是通过组合多个弱学习器(通常是决策树),每个学习器关注前一个学习器的预测误差,从而逐步减小模型在训练集上的残差。

2. 损失函数的定义

梯度提升的损失函数通常选择平方损失函数,即对于第  个样本,损失函数为:

3. 训练过程

对于第  轮的弱学习器 

  • 计算负梯度: ,即当前模型对于第  个样本的残差。

  • 拟合残差:学习一个新的弱学习器 ,使其拟合残差 

  • 更新模型:更新模型的预测值 ,其中  是学习率,控制每个弱学习器的权重。

4. 最终模型

最终的预测模型为累加的弱学习器:

优缺点和适用场景

优点

  • 可以处理复杂的非线性关系。
  • 在训练过程中逐步优化模型,逐渐减小残差。

缺点:

  • 训练时间相对较长,特别是在树的深度较大时。
  • 对异常值敏感。

适用场景:

  • 非线性回归问题。
  • 数据集中包含噪声和复杂的特征交互。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import GradientBoostingRegressor

# 生成示例数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(801), axis=0)
y = np.sin(X).ravel() + np.random.randn(80) * 0.1

# 使用梯度提升回归进行建模
gb_model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, random_state=42)
gb_model.fit(X, y)

# 预测新数据点
X_test = np.arange(0.05.00.01)[:, np.newaxis]
y_pred = gb_model.predict(X_test)

# 绘制数据点和梯度提升回归曲线
plt.scatter(X, y, s=20, edgecolor='black', c='darkorange', label='data')
plt.plot(X_test, y_pred, color='cornflowerblue', label='prediction')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Gradient Boosting Regression')
plt.legend()
plt.show()
图片

梯度提升回归是一种通过构建多个弱学习器,每个学习器关注前一个学习器的预测误差来提高模型性能的方法。它适用于复杂的非线性回归问题,但训练时间相对较长。在实际使用的时候,可以通过调整学习率和树的数量等参数来优化模型。

支持向量回归

支持向量回归(Support Vector Regression,SVR)是一种使用支持向量机(SVM)来进行回归的方法。SVR通过将输入空间映射到高维特征空间,并在高维空间中寻找最优超平面来进行回归。以下是支持向量回归的详细原理和核心公式。

核心原理

1. 基本思想

  • 与分类任务中的支持向量机类似,SVR也采用了核方法来将输入空间映射到高维特征空间。

  • SVR的目标是找到一个超平面,使得训练样本在该超平面上的映射值与目标值的差异最小化,并且同时保持误差在一定范围内。

2. 核心公式

SVR的基本公式可以表示为:

其中:

  •  是输入样本,
  •  是通过核函数将输入映射到高维特征空间的结果,
  •  是超平面的法向量,
  •  是截距。

SVR的优化目标是最小化损失函数

满足约束条件:

其中  是正则化参数, 是控制边界的松弛变量, 是对应于每个样本的松弛变量。

3. 高斯径向基核(RBF)

常用的核函数之一是高斯径向基核:

其中  是控制核函数宽度的参数。

优缺点和适用场景

优点:

  • 在高维空间中的表现较好,适用于复杂的非线性回归问题。
  • 通过调整核函数和参数,可以适应不同类型的数据分布。

缺点:

  • 对于大规模数据集,训练时间较长。
  • 对于输入数据的缩放和参数的选择敏感。

适用场景

  • 非线性回归问题,尤其是在输入空间映射到高维特征空间有意义的情况下。
  • 对模型的泛化性能要求较高的情况。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR

# 生成示例数据
np.random.seed(0)
X = 5 * np.random.rand(1001)
y = np.sin(X).ravel() + np.random.randn(100) * 0.1

# 使用支持向量回归进行建模
svr_model = SVR(kernel='rbf', C=100, epsilon=0.1, gamma='auto')
svr_model.fit(X, y)

# 预测新数据点
X_test = np.arange(0.05.00.01)[:, np.newaxis]
y_pred = svr_model.predict(X_test)

# 绘制数据点和支持向量回归曲线
plt.scatter(X, y, s=20, edgecolor='black', c='darkorange', label='data')
plt.plot(X_test, y_pred, color='cornflowerblue', label='prediction')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Support Vector Regression (RBF Kernel)')
plt.legend()
plt.show()
图片

支持向量回归是一种通过映射输入空间到高维特征空间,找到最优超平面来进行回归的方法。它适用于复杂的非线性回归问题,但在大规模数据集上训练时间较长。在实际使用中,需要通过调整核函数和参数来优化模型。

XGBoost回归

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升树的集成学习算法,被广泛应用于回归和分类问题。它的原理相对复杂,但核心思想是通过迭代训练多个弱学习器(决策树),每次迭代都根据上一轮的残差来拟合一个新的模型,并将这些弱学习器组合成一个强大的模型。

核心原理

XGBoost的目标是最小化目标函数,该目标函数由损失函数和正则化项组成:

其中, 是样本数量, 是真实标签, 是预测标签, 是树的数量, 是第  个树, 是树  的正则化项。

XGBoost的损失函数通常采用平方损失函数(对于回归问题),并加上正则化项,具体形式为:

其中, 是叶子节点的数量,   是正则化参数, 是叶子节点的分数。

XGBoost使用泰勒展开来近似损失函数,将其扩展为二阶泰勒展开式:

其中,   是损失函数的一阶和二阶梯度, 是第  个树对样本  的预测。

XGBoost的目标是最小化目标函数,采用贪婪算法逐步构建树模型,每一步都根据损失函数的近似进行拟合。具体步骤包括:

  1. 初始化:树的初始预测值为常数,使用负梯度的平均值。

  2. 迭代生长树:对于每一轮迭代,根据当前模型的预测值计算负梯度,并使用这些负梯度拟合一个回归树。然后,通过线性搜索确定最佳的叶子节点分数,以最小化目标函数。

  3. 正则化剪枝:根据正则化参数,对叶子节点进行剪枝,以防止过拟合。

  4. 更新预测值:将新树的预测值与之前的预测值相加,得到更新后的模型。

  5. 终止条件:根据设定的迭代次数或损失函数的变化程度确定是否终止迭代。

特点和适用场景

XGBoost具有以下特点:

  • 高效性:XGBoost使用了多种优化技术,如近似负梯度的计算、特征列排序等,使得训练速度快,内存占用低。
  • 鲁棒性:XGBoost对于缺失值的处理和异常值的鲁棒性较强,能够处理各种类型的数据。
  • 正则化:XGBoost支持正则化项,可以控制模型的复杂度,避免过拟合。
  • 灵活性:XGBoost支持多种损失函数、自定义评估指标和灵活的参数调整,适用于不同类型的回归问题。

适用场景包括:

  • 回归问题:XGBoost在预测数值型目标变量方面表现良好,适用于房价预测、股票价格预测等问题。
  • 分类问题:XGBoost也可以用于处理二分类和多分类问题,通常表现优异。

一个核心案例代码

import xgboost as xgb
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 加载数据
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建XGBoost回归模型
params = {
    'objective''reg:squarederror',  # 损失函数为平方损失函数
    'max_depth'3,  # 树的最大深度
    'learning_rate'0.1,  # 学习率
    'n_estimators'100  # 树的数量
}
model = xgb.XGBRegressor(**params)

# 拟合模型
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print('Mean Squared Error:', mse)

# 绘制特征重要性
xgb.plot_importance(model)
plt.show()
图片

XGBoost是一种高效、灵活且性能优异的集成学习算法,通过迭代训练多个决策树,并将它们组合成一个强大的模型。它具有高效性、鲁棒性、正则化和灵活性等特点,在回归和分类问题中广泛应用。通过调节参数和监控模型的性能,可以在实际问题中取得良好的预测效果。

LightGBM回归

LightGBM(Light Gradient Boosting Machine)是一种基于梯度提升树的集成学习算法,它与传统的梯度提升算法相比具有更高的效率和更快的训练速度。

核心原理

LightGBM的核心思想与XGBoost类似,都是通过迭代训练多个决策树,并将它们组合成一个强大的模型。与传统的梯度提升算法不同,LightGBM使用基于直方图的算法来加速训练过程。

直方图算法

LightGBM使用直方图算法来构建每棵树,主要包括以下步骤:

  1. 将数据划分为多个直方桶:LightGBM首先将特征值进行离散化,然后将每个特征的取值范围划分为若干个直方桶。

  2. 构建直方图:对于每个直方桶,统计落入该桶的样本的梯度之和和梯度的二阶导数之和,这些统计量称为直方图。这一步可以高效地并行计算,加速了训练过程。

  3. 根据直方图找到最佳划分点:根据直方图的信息,LightGBM选择最佳的划分点来构建决策树节点。

梯度单边采样

为了进一步提高训练速度,LightGBM引入了梯度单边采样(GOSS)和互斥特征捆绑(EFB)等技术。

LightGBM的目标函数

LightGBM的目标是最小化目标函数,它由损失函数和正则化项组成。对于回归问题,损失函数通常采用平方损失函数,形式为:

其中, 是样本数量, 是真实标签, 是预测标签, 是树的数量, 是第  个树, 是树  的正则化项。

特点和适用场景

LightGBM具有以下特点:

  • 高效性:采用基于直方图的算法和梯度单边采样技术,提高了训练速度,降低了内存消耗。
  • 高准确性:LightGBM能够处理大规模数据集,并在准确性上表现出色。
  • 支持并行化:LightGBM的算法可以高效地并行计算,利用多核CPU和GPU进行加速。
  • 鲁棒性:LightGBM对于缺失值和异常值具有较好的鲁棒性。

适用场景包括:

  • 大规模数据集:LightGBM适用于处理大规模数据集,如金融数据、电商数据等。
  • 需要高效训练的场景:对于需要快速训练模型的场景,如在线预测、实时推荐等,LightGBM是一个很好的选择。

Python代码和图形

以下是使用LightGBM进行回归任务的简单示例代码:

import lightgbm as lgb
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 加载数据
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 转换数据为LightGBM数据格式
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test)

# 设置参数
params = {
    'objective''regression',  # 损失函数为回归
    'metric''l2',  # 使用均方误差作为评估指标
    'num_leaves'31,  # 树的最大叶子节点数
    'learning_rate'0.1,  # 学习率
    'feature_fraction'0.8,  # 每次迭代使用的特征比例
    'bagging_fraction'0.8,  # 每次迭代使用的样本比例
    'bagging_freq'5  # bagging的频率
}

# 训练模型
model = lgb.train(params, train_data, valid_sets=[test_data], num_boost_round=100, early_stopping_rounds=10)

# 预测
y_pred = model.predict(X_test, num_iteration=model.best_iteration)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print('Mean Squared Error:', mse)

# 绘制特征重要性
lgb.plot_importance(model)
plt.show()
图片

LightGBM是一种高效、准确且易于使用的机器学习算法,适用于大规模数据集和需要高效训练的场景。它利用基于直方图的算法和梯度单边采样技术,提高了训练速度,同时保持了模型的准确性。

神经网络回归

神经网络回归是一种使用神经网络进行回归任务的方法。神经网络由多个神经元(或称为节点)组成,这些神经元通过层次结构连接在一起,每个连接都有一个权重。以下是神经网络回归的详细原理和核心公式。

核心原理

1. 基本结构

  • 输入层: 接受输入特征的层。

  • 隐藏层: 由多个神经元组成,通过权重连接构建神经网络的核心。

  • 输出层: 输出回归问题的预测值。

2. 激活函数

神经网络中的每个神经元通常都会使用激活函数来引入非线性性质,常用的激活函数包括 Sigmoid、ReLU、Tanh 等。

3. 前向传播

神经网络的前向传播过程是通过输入层到输出层的一系列计算,其中每个神经元都计算其输入的加权和,并通过激活函数得到输出。

其中  是神经元的输出,  是权重,  是输入特征,  是偏置项,  是激活函数。

4. 损失函数

神经网络回归的损失函数通常选择均方误差(Mean Squared Error,MSE):

其中  是实际值,  是预测值,  是样本数量。

5. 反向传播

通过反向传播算法,根据损失函数对模型参数进行梯度下降优化。通过链式法则,计算每个参数对损失函数的梯度,然后更新参数。

其中  是神经元的输入。

优缺点和适用场景

优点:

  • 能够捕捉复杂的非线性关系。
  • 在大规模数据集上表现良好。

缺点:

  • 训练时间较长,需要大量的数据。
  • 对于过拟合敏感,需要适当的正则化。

适用场景:

  • 复杂的非线性回归问题。
  • 大规模数据集,充足的计算资源。

一个核心案例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPRegressor

# 生成示例数据
np.random.seed(0)
X = 5 * np.random.rand(1001)
y = np.sin(X).ravel() + np.random.randn(100) * 0.1

# 使用神经网络回归进行建模
nn_model = MLPRegressor(hidden_layer_sizes=(100,), activation='relu', max_iter=1000, random_state=42)
nn_model.fit(X, y)

# 预测新数据点
X_test = np.arange(0.05.00.01)[:, np.newaxis]
y_pred = nn_model.predict(X_test)

# 绘制数据点和神经网络回归曲线
plt.scatter(X, y, s=20, edgecolor='black', c='darkorange', label='data')
plt.plot(X_test, y_pred, color='cornflowerblue', label='prediction')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Neural Network Regression')
plt.legend()
plt.show()
图片

神经网络回归是一种通过构建多层神经元网络来捕捉复杂的非线性关系的方法。它在大规模数据集和复杂问题上表现良好,但需要较长的训练时间。在实际项目中,可以通过调整网络结构、激活函数和正则化等参数来优化模型。

最后

喜欢本文的朋友可以收藏、点赞、转发起来!

关注本号,带来更多算法干货实例,提升工作学习效率!

最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多