昨天发布了关于分类算法的一些总结,不少人给予了反馈。
令我没想到的是,居然足足有一半的人想要看关于回归的总结,今天它来了!~
先来进行一个简单的介绍,回归算法的重要性体现在其能够建立特征与目标之间的关系模型,实现预测、关系分析和特征重要性评估等多方面的应用。通过回归分析,我们能够理解变量之间的趋势、检测异常值、为决策提供支持,并在时间序列中进行趋势分析,为数据科学和实际问题提供有力的工具。
老规矩:大家伙如果觉得近期文章还不错!欢迎大家点个赞、转个发,让更多的朋友看到。
其次,咱们今天从下面8个方面,全面理解回归,全面熟悉回归的重要意义和所有的操作。
线性回归
岭回归
Lasso回归
决策树回归
随机森林回归
梯度提升回归
支持向量回归
神经网络回归
咱们一起来看看回归所有的内容~
线性回归绝对是我们大家最熟悉的一个算法模型。线性回归是一种用于建模和分析变量之间关系的统计方法,特别是用于预测一个变量(被称为因变量)与一个或多个自变量之间的关系。在简单线性回归中,只有一个自变量,而在多元线性回归中,有多个自变量。
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范数,可以导致部分系数变为零,从而实现特征选择的效果。
优点
可以实现特征选择,将一些系数变为零。
在高维数据集中表现较好。
缺点
不适用于特征数量比样本数量大的情况。
对于高度相关的变量,可能只选择其中之一。
适用场景
数据集中存在多重共线性。
希望通过模型进行特征选择。
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)是一种集成学习方法,通过顺序地构建弱学习器,每个弱学习器修正前一个弱学习器的预测误差,从而得到累积的、更强大的预测模型。以下是梯度提升回归的详细原理和核心公式。
基本思想
梯度提升回归的基本思想是通过组合多个弱学习器(通常是决策树),每个学习器关注前一个学习器的预测误差,从而逐步减小模型在训练集上的残差。
优点:
可以处理复杂的非线性关系。
在训练过程中逐步优化模型,逐渐减小残差。
缺点:
训练时间相对较长,特别是在树的深度较大时。
对异常值敏感。
适用场景:
非线性回归问题。
数据集中包含噪声和复杂的特征交互。
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通过将输入空间映射到高维特征空间,并在高维空间中寻找最优超平面来进行回归。以下是支持向量回归的详细原理和核心公式。
基本思想
与分类任务中的支持向量机类似,SVR也采用了核方法来将输入空间映射到高维特征空间。
SVR的目标是找到一个超平面,使得训练样本在该超平面上的映射值与目标值的差异最小化,并且同时保持误差在一定范围内。
优点:
在高维空间中的表现较好,适用于复杂的非线性回归问题。
通过调整核函数和参数,可以适应不同类型的数据分布。
缺点:
对于大规模数据集,训练时间较长。
对于输入数据的缩放和参数的选择敏感。
适用场景:
非线性回归问题,尤其是在输入空间映射到高维特征空间有意义的情况下。
对模型的泛化性能要求较高的情况。
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()
支持向量回归是一种通过映射输入空间到高维特征空间,找到最优超平面来进行回归的方法。它适用于复杂的非线性回归问题,但在大规模数据集上训练时间较长。在实际使用中,需要通过调整核函数和参数来优化模型。
神经网络回归是一种使用神经网络进行回归任务的方法。神经网络由多个神经元(或称为节点)组成,这些神经元通过层次结构连接在一起,每个连接都有一个权重。以下是神经网络回归的详细原理和核心公式。
优点:
能够捕捉复杂的非线性关系。
在大规模数据集上表现良好。
缺点:
训练时间较长,需要大量的数据。
对于过拟合敏感,需要适当的正则化。
适用场景:
复杂的非线性回归问题。
大规模数据集,充足的计算资源。
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()
神经网络回归是一种通过构建多层神经元网络来捕捉复杂的非线性关系的方法。它在大规模数据集和复杂问题上表现良好,但需要较长的训练时间。在实际项目中,可以通过调整网络结构、激活函数和正则化等参数来优化模型。