主页 > 电脑硬件  > 

回归算法模型总结

回归算法模型总结

回归算法在数据分析中至关重要,因为它们帮助我们预测连续变量并量化变量间的关系。通过建模复杂的依赖关系,回归算法为决策提供了科学依据,从而支持业务优化和战略规划。

线性回归

岭回归

套索回归

弹性网络

多项式回归

支持向量回归

决策树回归

随机森林回归

梯度提升回归

贝叶斯回归

1. 线性回归 (Linear Regression) 原理

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

核心公式

1. 模型形式:

 

 

优点:

易理解:公式简单,易于解释系数对预测结果的影响。

计算效率高:训练和预测速度快,适合大规模数据集。

可解释性强:每个特征的权重(系数)明确指出了其对结果的影响。

缺点:

对线性假设依赖强:仅能捕捉线性关系,无法处理复杂的非线性数据。

对异常值敏感:异常值可能会显著影响回归系数。

多重共线性问题:当输入特征高度相关时,回归系数可能不稳定。

适用场景

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

线性关系数据:当因变量与自变量之间存在线性关系时。

简单解释:需要对特征对结果的影响有明确解释。

快速原型:用作更复杂模型的基准。

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 的平滑性,提供了对高维和稀疏数据的强大处理能力。

优缺点

优点:

综合特征选择与共线性处理:同时具备 Lasso 的特征选择能力和 Ridge 处理多重共线性的能力。

灵活性:可以通过调整来控制 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 模型:

 

优点:

强大的泛化能力:通过 ε-不敏感区域,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. 划分标准:

决策树的每一次划分都基于最小化某个目标,例如均方误差(MSE):

 

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}') 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. 梯度提升模型:

 

优点:

高精度:梯度提升通常能显著提高模型的预测精度,尤其在复杂数据集上。

自动处理特征交互:能够有效捕捉特征间的复杂交互关系。

鲁棒性强:对异常值和噪声具有一定的鲁棒性,因为每一步都尝试减少模型的误差。

缺点:

训练时间长:由于需要逐步添加多棵树,训练时间较长,特别是在数据量较大时。

超参数调优复杂:需要调节学习率、树的数量、树的深度等多个超参数。

容易过拟合:如果树的数量过多或学习率过高,模型可能会过拟合训练数据。

适用场景

需要高预测精度的任务:如金融风险评估、市场预测、疾病预测等。

复杂的回归问题:数据具有复杂的非线性关系时。

核心案例

 

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}') 10. 贝叶斯回归 (Bayesian Regression) 原理

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

核心公式

1. 贝叶斯回归模型:

 

优点:

不确定性建模:能够提供参数的不确定性估计,而不仅仅是点估计。

自然的正则化:通过先验分布可以自动进行参数的正则化,防止过拟合。

适应性强:可以处理小样本数据和高维数据。

缺点:

计算复杂:贝叶斯推断通常需要计算后验分布,可能涉及复杂的积分计算和优化过程。

对先验依赖性:结果可能对先验分布的选择较为敏感,选择不当可能影响结果。

适用场景

需要不确定性估计的任务:如金融建模、医学预测等。

小样本或高维数据:贝叶斯回归适用于数据量较少或特征维度较高的情况。

核心案例 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}')

 

 

标签:

回归算法模型总结由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“回归算法模型总结