咱们一起来看看回归所有的内容~
线性回归绝对是我们大家最熟悉的一个算法模型。线性回归是一种用于建模和分析变量之间关系的统计方法,特别是用于预测一个变量(被称为因变量)与一个或多个自变量之间的关系。在简单线性回归中,只有一个自变量,而在多元线性回归中,有多个自变量。
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(100, 1)
Y = 4 + 3 * X + np.random.randn(100, 1)
# 使用最小二乘法计算斜率和截距
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(100, 1)
Y = 4 + 3 * X + np.random.randn(100, 1)
# 使用岭回归进行建模
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回归(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(100, 1)
Y = 4 + 3 * X + np.random.randn(100, 1)
# 使用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(80, 1), 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.0, 5.0, 0.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(80, 1), 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.0, 5.0, 0.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(80, 1), 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.0, 5.0, 0.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(100, 1)
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.0, 5.0, 0.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()
支持向量回归是一种通过映射输入空间到高维特征空间,找到最优超平面来进行回归的方法。它适用于复杂的非线性回归问题,但在大规模数据集上训练时间较长。在实际使用中,需要通过调整核函数和参数来优化模型。
神经网络回归是一种使用神经网络进行回归任务的方法。神经网络由多个神经元(或称为节点)组成,这些神经元通过层次结构连接在一起,每个连接都有一个权重。以下是神经网络回归的详细原理和核心公式。
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(100, 1)
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.0, 5.0, 0.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()
神经网络回归是一种通过构建多层神经元网络来捕捉复杂的非线性关系的方法。它在大规模数据集和复杂问题上表现良好,但需要较长的训练时间。在实际项目中,可以通过调整网络结构、激活函数和正则化等参数来优化模型。