所有文章 > AI驱动 > 十大回归算法模型 最强总结 !!

十大回归算法模型 最强总结 !!

在之前总结过很多回归算法的原理和案例,今儿对之前的内容进行了优化,大家一起来看~

首先,回归算法在数据分析中至关重要,因为它们帮助我们预测连续变量并量化变量间的关系。通过建模复杂的依赖关系,回归算法为决策提供了科学依据,从而支持业务优化和战略规划。它们在金融、医疗、市场营销等领域的应用,使得数据驱动的决策变得更加精准和可靠。

咱们今天讨论的10种回归类算法有:

  • 线性回归
  • 岭回归
  • 套索回归
  • 弹性网络
  • 多项式回归
  • 支持向量回归
  • 决策树回归
  • 随机森林回归
  • 梯度提升回归
  • 贝叶斯回归

接下来,咱们从原理、推导、优缺点,并且使用一个不同的数据集进行详细的分析,和大家聊聊~

1. 线性回归 (Linear Regression)

原理

线性回归是一种统计方法,用于描述一个或多个自变量与因变量之间的线性关系。目标是找到最佳拟合线(最小化误差平方和),从而预测连续目标变量的值。假设给定的自变量X 与因变量 y存在线性关系,模型形式如下:

核心公式

1. 模型形式

2. 损失函数

线性回归通过最小化均方误差(MSE)来拟合模型:

3. 最小二乘法求解

这就是线性回归模型的最优参数解。

优缺点

优点

  • 易理解:公式简单,易于解释系数对预测结果的影响。
  • 计算效率高:训练和预测速度快,适合大规模数据集。
  • 可解释性强:每个特征的权重(系数)明确指出了其对结果的影响。

缺点

  • 对线性假设依赖强:仅能捕捉线性关系,无法处理复杂的非线性数据。
  • 对异常值敏感:异常值可能会显著影响回归系数。
  • 多重共线性问题:当输入特征高度相关时,回归系数可能不稳定。

适用场景

线性回归适用于以下场景:

  • 线性关系数据:当因变量与自变量之间存在线性关系时。
  • 简单解释:需要对特征对结果的影响有明确解释。
  • 快速原型:用作更复杂模型的基准。

核心案例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import fetch_california_housing

# 加载加利福尼亚房价数据集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = pd.Series(california.target, name='MedHouseVal')

# 数据集概览
print(X.describe())

# 数据预处理(特征缩放)
X = (X - X.mean()) / X.std()

# 数据可视化:相关性矩阵
plt.figure(figsize=(10, 8))
sns.heatmap(X.corr(), annot=True, cmap='coolwarm')
plt.title("Feature Correlation Matrix", fontsize=16)
plt.show()

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

# 创建线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 进行预测
y_pred = model.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="blue", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 残差图
plt.figure(figsize=(10, 6))
sns.residplot(x=y_test, y=y_pred, lowess=True, color="green", line_kws={'color': 'red', 'lw': 2})
plt.title("Residual Plot", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Residuals", fontsize=14)
plt.grid(True)
plt.show()

# 输出模型性能
print(f'Mean Squared Error: {mean_squared_error(y_test, y_pred):.2f}')
print(f'R^2 Score: {r2_score(y_test, y_pred):.2f}')

1. 数据预处理:由于特征可能具有不同的量纲,对数据进行了标准化处理,以便模型更好地收敛。

2. 数据可视化:通过相关性矩阵,展示了各特征之间的相关性,这有助于理解特征之间的关系及其对目标变量的影响。

3. 实际值 vs 预测值散点图:展示了模型预测值与实际值的对比。理想情况下,散点应集中在对角线附近。

4. 残差图:残差图展示了预测值与实际值之间的差异(残差)。如果残差分布均匀,说明模型的假设是合理的。

5. 性能指标:MSE(均方误差)和R²分数衡量模型的预测能力。

2. 岭回归 (Ridge Regression)

原理

岭回归是线性回归的扩展,主要用于解决线性回归中可能出现的多重共线性问题。当输入特征之间高度相关时,线性回归的回归系数可能会变得非常不稳定。岭回归通过在损失函数中加入正则化项来惩罚回归系数的大小,从而控制模型的复杂度,稳定模型的系数。

核心公式

1. 模型形式

岭回归在线性回归的损失函数中加入了一个正则化项(L2正则化):

2. 损失函数的推导

岭回归的目标是最小化加权后的损失函数。通过对损失函数求导并令其为零,可以得到最优的回归系数:

优缺点

优点

  • 解决多重共线性问题:通过引入正则化,减小特征间的多重共线性对模型稳定性的影响。
  • 防止过拟合:正则化项控制模型复杂度,避免模型过于依赖训练数据,从而提高泛化能力。
  • 适用于高维数据:在特征数多于样本数时(高维数据),岭回归比普通线性回归更稳定。

缺点

  • 难以解释:由于引入了正则化项,模型的系数不再代表各个特征对目标变量的直接影响,解释性下降。
  • 正则化参数选择复杂:需要通过交叉验证等方法选择合适的正则化参数 ,增加了模型的复杂性。

适用场景

  • 多重共线性:当数据中存在高度相关的特征时,岭回归可以通过引入正则化来稳定模型。
  • 高维数据:当特征数远多于样本数时,岭回归可以有效防止过拟合。
  • 需要平衡偏差和方差:在模型复杂度和预测准确性之间寻求平衡。

核心案例

我们将使用糖尿病数据集(Diabetes Dataset)来演示岭回归的实现。糖尿病数据集是一个中等规模的数据集,包含多个生理特征和一年后疾病进展的测量值,非常适合用于回归模型的训练和评估。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import load_diabetes

# 加载糖尿病数据集
diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = pd.Series(diabetes.target, name='DiseaseProgression')

# 数据集概览
print(X.describe())

# 数据预处理(标准化)
X = (X - X.mean()) / X.std()

# 数据可视化:相关性矩阵
plt.figure(figsize=(10, 8))
sns.heatmap(X.corr(), annot=True, cmap='viridis')
plt.title("Feature Correlation Matrix", fontsize=16)
plt.show()

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

# 设置正则化参数
alpha = 1.0

# 创建岭回归模型
ridge_model = Ridge(alpha=alpha)
ridge_model.fit(X_train, y_train)

# 进行预测
y_pred = ridge_model.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="blue", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values (Ridge Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 残差图
plt.figure(figsize=(10, 6))
sns.residplot(x=y_test, y=y_pred, lowess=True, color="purple", line_kws={'color': 'red', 'lw': 2})
plt.title("Residual Plot (Ridge Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Residuals", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

# 岭回归系数
plt.figure(figsize=(10, 6))
coefficients = pd.Series(ridge_model.coef_, index=X.columns)
coefficients.plot(kind='bar', color='teal')
plt.title("Ridge Regression Coefficients", fontsize=16)
plt.xlabel("Features", fontsize=14)
plt.ylabel("Coefficient Value", fontsize=14)
plt.grid(True)
plt.show()

1. 数据预处理:对特征进行标准化处理,以确保模型的收敛性和性能。

2. 数据可视化

  • 相关性矩阵:展示了特征之间的相关性,有助于理解多重共线性问题。
  • 实际值 vs 预测值散点图:用于直观评估模型的预测能力。
  • 残差图:展示了预测值与实际值之间的差异(残差),用于判断模型的拟合质量。
  • 岭回归系数图:展示了每个特征的回归系数值,可以直观地看到正则化对特征系数的影响。

3. 性能指标

  • MSE(均方误差):用于评估模型的平均预测误差。
  • R²分数:用于衡量模型对数据的解释能力,接近1表示模型效果好。

3. 套索回归 (Lasso Regression)

原理

套索回归(Lasso,即Least Absolute Shrinkage and Selection Operator)是线性回归的扩展,通过在损失函数中引入 L1 正则化项来约束回归系数。L1 正则化的一个显著特点是可以将一些回归系数缩减为零,从而实现特征选择。这使得套索回归特别适用于高维数据,能够自动筛选出对预测最重要的特征。

核心公式

1. 模型形式

套索回归的损失函数为:

2. 推导

套索回归的推导涉及到 L1 正则化项的引入,相对于岭回归的 L2 正则化,L1 正则化可以产生稀疏解,即某些回归系数可能被压缩到零。这种稀疏性使得 Lasso 具有自动特征选择的功能。

在数值优化过程中,Lasso 回归的解可以通过坐标下降法等优化算法得到。其核心思想是逐步优化每个参数,最终收敛到最优解。

优缺点

优点

  • 特征选择:L1 正则化使得套索回归可以自动选择特征,筛选出对模型最有贡献的特征。
  • 处理高维数据:适用于特征数量多于样本数的场景,通过稀疏化减小模型复杂度。
  • 防止过拟合:通过正则化控制模型复杂度,减少过拟合风险。

缺点

  • 难以处理高共线性数据:当特征高度相关时,Lasso 可能会随机选择其中一个特征,忽略其他。
  • 正则化参数的选择:需要仔细调整 值,通常通过交叉验证进行选择。

适用场景

套索回归适用于以下场景:

  • 高维数据分析:当特征数量多于样本数时,Lasso 可自动选择特征,适用于基因数据、文本数据等。
  • 特征筛选:需要从大量特征中筛选出最重要的几个特征时。

核心案例

我们将使用糖尿病数据集(Diabetes Dataset),但是通过引入额外的噪声特征来演示套索回归的特征选择能力。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import load_diabetes

# 加载糖尿病数据集
diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)

# 添加噪声特征
np.random.seed(42)
noise = np.random.randn(X.shape[0], 10)
X_noise = pd.DataFrame(noise, columns=[f'Noise_{i}' for i in range(10)])
X = pd.concat([X, X_noise], axis=1)

y = pd.Series(diabetes.target, name='DiseaseProgression')

# 数据标准化
X = (X - X.mean()) / X.std()

# 数据可视化:相关性矩阵
plt.figure(figsize=(12, 10))
sns.heatmap(X.corr(), annot=False, cmap='coolwarm')
plt.title("Feature Correlation Matrix (Including Noise)", fontsize=16)
plt.show()

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

# 创建套索回归模型
lasso_model = Lasso(alpha=0.1)
lasso_model.fit(X_train, y_train)

# 进行预测
y_pred = lasso_model.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="blue", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values (Lasso Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 残差图
plt.figure(figsize=(10, 6))
sns.residplot(x=y_test, y=y_pred, lowess=True, color="purple", line_kws={'color': 'red', 'lw': 2})
plt.title("Residual Plot (Lasso Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Residuals", fontsize=14)
plt.grid(True)
plt.show()

# 套索回归系数
plt.figure(figsize=(10, 6))
coefficients = pd.Series(lasso_model.coef_, index=X.columns)
coefficients.plot(kind='bar', color='coral')
plt.title("Lasso Regression Coefficients", fontsize=16)
plt.xlabel("Features", fontsize=14)
plt.ylabel("Coefficient Value", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 噪声特征的引入:我们为糖尿病数据集添加了一些无意义的噪声特征,以展示套索回归的特征选择能力。

2. 套索回归系数图:展示了每个特征的回归系数值,理想情况下,Lasso 会将无意义的噪声特征系数缩减为零。

3. 性能指标

  • MSE(均方误差):用于评估模型的平均预测误差。
  • R²分数:用于衡量模型对数据的解释能力,接近1表示模型效果好。

4. 弹性网络回归 (Elastic Net Regression)

原理

弹性网络回归结合了 L1 和 L2 正则化,通过在损失函数中同时引入两者的正则化项来约束模型。弹性网络可以看作是岭回归和套索回归的结合,既能处理高维数据,也能进行特征选择。

核心公式

1. 模型形式

弹性网络回归的损失函数为:

2. 推导

弹性网络回归的推导涉及到同时优化 L1 和 L2 正则化项,最终的解可以通过坐标下降法等优化算法获得。弹性网络通过结合 L1 的稀疏性和 L2 的平滑性,提供了对高维和稀疏数据的强大处理能力。

优缺点

优点

缺点

  • 参数调整复杂:需要同时调整两个正则化参数,模型调优过程较为复杂。
  • 对模型可解释性影响较大:引入两个正则化项后,模型的可解释性进一步下降。

适用场景

  • 高维数据分析:当特征数量多于样本数时,弹性网络可以有效处理。
  • 特征筛选与共线性问题共存:当需要同时处理特征选择和共线性问题时。

核心案例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import make_regression

# 生成虚拟数据集
n_samples = 1000
n_features = 10
X, y = make_regression(n_samples=n_samples, n_features=n_features, noise=0.1, random_state=42)

# 转换为 DataFrame
X = pd.DataFrame(X, columns=[f'Feature_{i}' for i in range(n_features)])
y = pd.Series(y, name='Price')

# 人为引入高共线性特征
X['Feature_10'] = X['Feature_0'] * X['Feature_1']

# 数据标准化
X = (X - X.mean()) / X.std()

# 数据可视化:相关性矩阵
plt.figure(figsize=(12, 10))
sns.heatmap(X.corr(), annot=False, cmap='coolwarm')
plt.title("Feature Correlation Matrix (Including High Collinearity)", fontsize=16)
plt.show()

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

# 创建弹性网络回归模型
elastic_net_model = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net_model.fit(X_train, y_train)

# 进行预测
y_pred = elastic_net_model.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="blue", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values (Elastic Net Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 残差图
plt.figure(figsize=(10, 6))
sns.residplot(x=y_test, y=y_pred, lowess=True, color="purple", line_kws={'color': 'red', 'lw': 2})
plt.title("Residual Plot (Elastic Net Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Residuals", fontsize=14)
plt.grid(True)
plt.show()

# 弹性网络回归系数
plt.figure(figsize=(10, 6))
coefficients = pd.Series(elastic_net_model.coef_, index=X.columns)
coefficients.plot(kind='bar', color='cyan')
plt.title("Elastic Net Regression Coefficients", fontsize=16)
plt.xlabel("Features", fontsize=14)
plt.ylabel("Coefficient Value", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 高共线性特征的引入:通过生成一个新的特征 TAX_RM 来模拟高共线性场景,以展示弹性网络处理共线性问题的能力。

2. 弹性网络回归系数图:展示了每个特征的回归系数值,观察 L1 和 L2 正则化共同作用的结果。

3. 性能指标

  • MSE(均方误差):用于评估模型的平均预测误差。
  • R²分数:用于衡量模型对数据的解释能力,接近1表示模型效果好。

5. 逻辑回归 (Logistic Regression)

原理

逻辑回归用于处理二分类问题,通过将线性回归的输出转换为概率值来进行分类。其核心思想是使用逻辑函数(sigmoid函数)将线性模型的输出映射到0和1之间,以预测二分类标签。

核心公式

1. 逻辑回归模型

2. 推导

逻辑回归通过最大化似然函数(MLE)来估计回归系数。似然函数表示为:

通过对数变换得到对数似然函数,然后对其求导并最大化,即可得到最优的回归系数。

优缺点

优点

  • 概率输出:可以提供分类的概率估计,而不仅仅是分类结果。
  • 易于解释:回归系数可以解释为特征对分类结果的影响。
  • 简单有效:在线性可分的情况下表现良好。

缺点

  • 线性假设:假设特征与目标变量之间存在线性关系,不适用于非线性数据。
  • 无法处理多分类问题:原生的逻辑回归仅适用于二分类问题,需扩展至多分类。

适用场景

逻辑回归适用于以下场景:

  • 二分类问题:如垃圾邮件识别、疾病诊断(如是否患病)等。
  • 需要概率估计:如评估某事件发生的概率。

核心案例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report, roc_curve, roc_auc_score
from sklearn.datasets import load_breast_cancer

# 加载乳腺癌数据集
cancer = load_breast_cancer()
X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
y = pd.Series(cancer.target, name='CancerType')

# 数据标准化
X = (X - X.mean()) / X.std()

# 数据可视化:相关性矩阵
plt.figure(figsize=(12, 10))
sns.heatmap(X.corr(), annot=False, cmap='coolwarm')
plt.title("Feature Correlation Matrix", fontsize=16)
plt.show()

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

# 创建逻辑回归模型
log_reg = LogisticRegression(max_iter=10000)
log_reg.fit(X_train, y_train)

# 进行预测
y_pred = log_reg.predict(X_test)
y_pred_prob = log_reg.predict_proba(X_test)[:, 1]

# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title("Confusion Matrix", fontsize=16)
plt.xlabel("Predicted Label", fontsize=14)
plt.ylabel("True Label", fontsize=14)
plt.show()

# ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_prob)
roc_auc = roc_auc_score(y_test, y_pred_prob)

plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, color='blue', label=f'ROC Curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='red', linestyle='--')
plt.title("ROC Curve", fontsize=16)
plt.xlabel("False Positive Rate", fontsize=14)
plt.ylabel("True Positive Rate", fontsize=14)
plt.legend(loc="lower right")
plt.grid(True)
plt.show()

# 特征系数
plt.figure(figsize=(10, 6))
coefficients = pd.Series(log_reg.coef_[0], index=X.columns)
coefficients.plot(kind='bar', color='magenta')
plt.title("Logistic Regression Coefficients", fontsize=16)
plt.xlabel("Features", fontsize=14)
plt.ylabel("Coefficient Value", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能报告
print(classification_report(y_test, y_pred))

1. 混淆矩阵:可视化模型在测试集上的表现,展示了真实标签与预测标签的分布。

2. ROC曲线:展示了模型的诊断能力,曲线下面积(AUC)用于衡量分类器的优劣。

3. 特征系数图:展示了每个特征对分类结果的影响。

6. 支持向量回归 (SVR)

原理

支持向量回归(SVR)是一种扩展到回归任务的支持向量机(SVM)。它的目标是找到一个能够最大限度地拟合训练数据的回归超平面,同时保持模型的复杂度尽可能小。SVR 通过在误差范围内(即“ε-不敏感”区域)不对数据点施加惩罚,从而控制模型的泛化能力。

核心公式

1. SVR 模型

2. 推导

SVR 的目标是最大化支持向量间的间隔,同时在 ε-不敏感带宽内最小化误差。通过引入拉格朗日乘子法,SVR 的优化问题可以转化为二次规划问题,最终解通过拉格朗日乘子和核函数获得。

优缺点

优点

  • 强大的泛化能力:通过 ε-不敏感区域,SVR 能有效控制模型的复杂度,防止过拟合。
  • 非线性扩展:借助核技巧,SVR 能处理非线性数据。
  • 鲁棒性:对异常值具有一定的鲁棒性。

缺点

  • 计算复杂度高:由于二次规划的计算复杂度,SVR 在大数据集上训练时间较长。
  • 参数调优复杂:需要仔细调节 C 和 ε 参数,以找到最优解。

适用场景

支持向量回归适用于以下场景:

  • 复杂关系的回归任务:适用于非线性关系的数据。
  • 需要高泛化能力的场景:如金融时间序列预测、天气预测等。

核心案例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import make_regression

# 生成虚拟数据集
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)

# 创建DataFrame
data = pd.DataFrame(X, columns=[f'Feature_{i}' for i in range(X.shape[1])])
data['Heating Load'] = y

X = data.iloc[:, :-1]
y = data.iloc[:, -1] # 我们预测 Heating Load

# 数据标准化
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X_scaled = scaler_X.fit_transform(X)
y_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).flatten()

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

# 创建支持向量回归模型
svr = SVR(kernel='rbf', C=100, epsilon=0.1)
svr.fit(X_train, y_train)

# 进行预测
y_pred = svr.predict(X_test)

# 逆标准化
y_test_inv = scaler_y.inverse_transform(y_test.reshape(-1, 1)).flatten()
y_pred_inv = scaler_y.inverse_transform(y_pred.reshape(-1, 1)).flatten()

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test_inv, y=y_pred_inv, color="green", s=60, edgecolor="black")
plt.plot([min(y_test_inv), max(y_test_inv)], [min(y_test_inv), max(y_test_inv)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values (SVR)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 残差图
plt.figure(figsize=(10, 6))
sns.residplot(x=y_test_inv, y=y_pred_inv, lowess=True, color="orange", line_kws={'color': 'red', 'lw': 2})
plt.title("Residual Plot (SVR)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Residuals", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test_inv, y_pred_inv)
r2 = r2_score(y_test_inv, y_pred_inv)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 实际值 vs 预测值:展示模型在测试集上的预测效果,通过对比实际值和预测值观察模型的拟合效果。

2. 残差图:展示模型预测的残差分布,检查是否存在系统性偏差。

3. 性能指标

  • MSE:均方误差,衡量预测值与实际值的平均偏差。
  • R²分数:衡量模型的解释能力,值越接近1说明模型效果越好。

7. 决策树回归 (Decision Tree Regression)

原理

决策树回归是使用树状模型进行回归任务的算法。它通过不断将数据集划分成更小的子集,并在叶子节点上做出预测。决策树的划分基于对特征的某种度量,如均方误差(MSE),以最小化叶子节点的误差为目标。

核心公式

1. 划分标准

2. 推导

决策树从根节点开始,迭代地选择最佳特征进行数据划分,直到满足终止条件(如最大深度、最小样本数)。划分过程中,通过选择使 MSE 最小的特征及其阈值来决定数据的分裂方式。

优缺点

优点

  • 易于解释:决策树结构直观易懂,便于解释模型的预测过程。
  • 无需特征缩放:对数据的尺度和分布不敏感。
  • 能够捕捉非线性关系:能够处理复杂的非线性数据。

缺点

  • 易过拟合:决策树容易生成复杂的树结构,导致过拟合。
  • 不稳定性:对数据的微小变化非常敏感,可能会生成截然不同的树结构。

适用场景

决策树回归适用于以下场景:

  • 直观的模型解释需求:如商业决策支持场景。
  • 非线性数据集:能够处理非线性特征之间的复杂关系。

核心案例

我们使用红酒质量数据集(Wine Quality Dataset),以展示决策树回归在实际应用中的表现。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import load_wine

# 加载红酒质量数据集
wine = load_wine()
X = pd.DataFrame(wine.data, columns=wine.feature_names)
y = pd.Series(wine.target, name='Quality')

# 数据标准化
X = (X - X.mean()) / X.std()

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

# 创建决策树回归模型
dt_regressor = DecisionTreeRegressor(max_depth=5, random_state=42)
dt_regressor.fit(X_train, y_train)

# 进行预测
y_pred = dt_regressor.predict(X_test)

# 决策树结构
from sklearn.tree import plot_tree

plt.figure(figsize=(20, 10))
plot_tree(dt_regressor, feature_names=X.columns, filled=True, rounded=True)
plt.title("Decision Tree Structure", fontsize=16)
plt.show()

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="red", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='blue', linewidth=2)
plt.title("Actual vs Predicted Values (Decision Tree Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 决策树结构可视化:展示了决策树的完整结构,每个节点显示了划分特征及其阈值。

2. 实际值 vs 预测值:通过对比实际值和预测值,观察模型的拟合效果。

3. 性能指标

  • MSE:衡量模型预测的平均误差。
  • R²分数:评估模型对数据的解释能力。

8. 随机森林回归 (Random Forest Regression)

原理

随机森林回归是通过集成多棵决策树来进行回归任务的算法。每棵树都是从数据的不同子集和特征子集上训练而成的,最终的预测结果通过这些树的平均值来给出。这种集成方法有效地降低了单棵决策树的过拟合风险,并提高了模型的稳定性和泛化能力。

核心公式

1. 随机森林模型

随机森林由多棵决策树组成,假设我们有 棵树,每棵树对输入特征 给出一个预测 ,则随机森林的预测结果为这些树的平均值:

2. 推导

随机森林通过“自助法”(Bootstrap)生成训练集的不同子集,并在这些子集上训练决策树。同时,在每棵树的构建过程中,随机选择特征子集以进行节点划分。最终,通过对所有树的预测结果进行平均化来获得最终预测。

优缺点

优点

  • 高准确度:通过集成学习方法,随机森林通常比单个决策树具有更高的预测准确度。
  • 防止过拟合:通过对多个子集和特征进行训练,降低了模型的过拟合风险。
  • 可处理高维数据:适用于高维特征的数据集。

缺点

  • 计算开销大:训练多个决策树需要较高的计算成本,尤其在数据集较大时。
  • 可解释性差:由于是集成模型,难以解释单个预测的逻辑。

适用场景

随机森林回归适用于以下场景:

  • 复杂回归任务:特别是在数据具有大量特征且存在噪声的情况下。
  • 需要稳健预测的场景:如经济预测、气候预测等。

核心案例

我们使用加利福尼亚房价数据集(California Housing Dataset),以展示随机森林回归在实际应用中的表现。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import fetch_california_housing

# 加载加州房价数据集
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='Price')

# 数据标准化
X = (X - X.mean()) / X.std()

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

# 创建随机森林回归模型
rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)
rf_regressor.fit(X_train, y_train)

# 进行预测
y_pred = rf_regressor.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="purple", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='orange', linewidth=2)
plt.title("Actual vs Predicted Values (Random Forest Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 特征重要性
plt.figure(figsize=(12, 8))
importances = pd.Series(rf_regressor.feature_importances_, index=X.columns)
importances.sort_values().plot(kind='barh', color='teal')
plt.title("Feature Importances (Random Forest Regression)", fontsize=16)
plt.xlabel("Importance Score", fontsize=14)
plt.ylabel("Features", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 实际值 vs 预测值:通过对比实际值和预测值,观察模型的拟合效果。

2. 特征重要性:展示了模型中不同特征的重要性得分,用于评估哪些特征对预测结果影响最大。

3. 性能指标

  • MSE:衡量模型预测的平均误差。
  • R²分数:评估模型对数据的解释能力。

9. 梯度提升回归 (Gradient Boosting Regression)

原理

梯度提升回归(Gradient Boosting Regression)是一种集成学习方法,通过组合多个弱学习器(通常是决策树)来构建一个强学习器。每个学习器在前一个学习器的基础上进行改进,逐步减少预测误差。算法通过最小化损失函数来更新模型参数,从而提高预测性能。

核心公式

1. 梯度提升模型

2. 推导

优缺点

优点

  • 高精度:梯度提升通常能显著提高模型的预测精度,尤其在复杂数据集上。
  • 自动处理特征交互:能够有效捕捉特征间的复杂交互关系。
  • 鲁棒性强:对异常值和噪声具有一定的鲁棒性,因为每一步都尝试减少模型的误差。

缺点

  • 训练时间长:由于需要逐步添加多棵树,训练时间较长,特别是在数据量较大时。
  • 超参数调优复杂:需要调节学习率、树的数量、树的深度等多个超参数。
  • 容易过拟合:如果树的数量过多或学习率过高,模型可能会过拟合训练数据。

适用场景

  • 需要高预测精度的任务:如金融风险评估、市场预测、疾病预测等。
  • 复杂的回归问题:数据具有复杂的非线性关系时。

核心案例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import fetch_california_housing

# 加载加州房价数据集
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='Price')

# 数据标准化
X = (X - X.mean()) / X.std()

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

# 创建梯度提升回归模型
gb_regressor = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
gb_regressor.fit(X_train, y_train)

# 进行预测
y_pred = gb_regressor.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="green", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values (Gradient Boosting Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 特征重要性
plt.figure(figsize=(12, 8))
importances = pd.Series(gb_regressor.feature_importances_, index=X.columns)
importances.sort_values().plot(kind='barh', color='orange')
plt.title("Feature Importances (Gradient Boosting Regression)", fontsize=16)
plt.xlabel("Importance Score", fontsize=14)
plt.ylabel("Features", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 实际值 vs 预测值展示模型预测效果的散点图。如果模型效果良好,散点图中的点应集中在对角线附近。

2. 特征重要性:展示各特征对模型预测的相对重要性。重要性高的特征对预测结果的贡献较大。

3. 性能指标

  • MSE:均方误差,用于衡量预测值与真实值之间的平均误差。
  • R²分数:决定系数,用于评估模型对数据的解释能力。R²值越接近1,模型的解释能力越强。

10. 贝叶斯回归 (Bayesian Regression)

原理

贝叶斯回归是一种基于贝叶斯统计方法的回归模型,通过引入先验分布和后验分布来进行回归分析。贝叶斯回归的核心思想是使用概率分布来描述回归系数的不确定性,而不是仅仅给出一个点估计值。

核心公式

1. 贝叶斯回归模型

2. 先验分布

3. 后验分布

4. 推导

优缺点

优点

  • 不确定性建模:能够提供参数的不确定性估计,而不仅仅是点估计。
  • 自然的正则化:通过先验分布可以自动进行参数的正则化,防止过拟合。
  • 适应性强:可以处理小样本数据和高维数据。

缺点

  • 计算复杂:贝叶斯推断通常需要计算后验分布,可能涉及复杂的积分计算和优化过程。
  • 对先验依赖性:结果可能对先验分布的选择较为敏感,选择不当可能影响结果。

适用场景

  • 需要不确定性估计的任务:如金融建模、医学预测等。
  • 小样本或高维数据:贝叶斯回归适用于数据量较少或特征维度较高的情况。

核心案例

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import BayesianRidge

# 加载数据
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='Price')

# 数据标准化
scaler_X = StandardScaler()
X_scaled = scaler_X.fit_transform(X)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 创建贝叶斯回归模型
bayesian_regressor = BayesianRidge()
bayesian_regressor.fit(X_train, y_train)

# 进行预测
y_pred = bayesian_regressor.predict(X_test)

# 实际值 vs 预测值散点图
plt.figure(figsize=(10, 6))
sns.scatterplot(x=y_test, y=y_pred, color="cyan", s=60, edgecolor="black")
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', linewidth=2)
plt.title("Actual vs Predicted Values (Bayesian Regression)", fontsize=16)
plt.xlabel("Actual Values", fontsize=14)
plt.ylabel("Predicted Values", fontsize=14)
plt.grid(True)
plt.show()

# 模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')

1. 实际值 vs 预测值:展示贝叶斯回归模型的预测效果。如果模型效果良好,散点图中的点应集中在对角线附近,表明预测值接近实际值。

2. 性能指标

  • MSE:均方误差,用于衡量模型的预测误差。
  • R²分数:决定系数,用于评估模型对数据的解释能力。R²值越接近1,模型的解释能力越强。

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