咱們今天討論的10種回歸類算法有:

接下來,咱們從原理、推導(dǎo)、優(yōu)缺點,并且使用一個不同的數(shù)據(jù)集進行詳細(xì)的分析,和大家聊聊~

1. 線性回歸 (Linear Regression)

原理

線性回歸是一種統(tǒng)計方法,用于描述一個或多個自變量與因變量之間的線性關(guān)系。目標(biāo)是找到最佳擬合線(最小化誤差平方和),從而預(yù)測連續(xù)目標(biāo)變量的值。假設(shè)給定的自變量X 與因變量 y存在線性關(guān)系,模型形式如下:

核心公式

1. 模型形式

2. 損失函數(shù)

線性回歸通過最小化均方誤差(MSE)來擬合模型:

3. 最小二乘法求解

這就是線性回歸模型的最優(yōu)參數(shù)解。

優(yōu)缺點

優(yōu)點

缺點

適用場景

線性回歸適用于以下場景:

核心案例

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

# 加載加利福尼亞房價數(shù)據(jù)集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = pd.Series(california.target, name='MedHouseVal')

# 數(shù)據(jù)集概覽
print(X.describe())

# 數(shù)據(jù)預(yù)處理(特征縮放)
X = (X - X.mean()) / X.std()

# 數(shù)據(jù)可視化:相關(guān)性矩陣
plt.figure(figsize=(10, 8))
sns.heatmap(X.corr(), annot=True, cmap='coolwarm')
plt.title("Feature Correlation Matrix", fontsize=16)
plt.show()

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建線性回歸模型
model = LinearRegression()
model.fit(X_train, y_train)

# 進行預(yù)測
y_pred = model.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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. 數(shù)據(jù)預(yù)處理:由于特征可能具有不同的量綱,對數(shù)據(jù)進行了標(biāo)準(zhǔn)化處理,以便模型更好地收斂。

2. 數(shù)據(jù)可視化:通過相關(guān)性矩陣,展示了各特征之間的相關(guān)性,這有助于理解特征之間的關(guān)系及其對目標(biāo)變量的影響。

3. 實際值 vs 預(yù)測值散點圖:展示了模型預(yù)測值與實際值的對比。理想情況下,散點應(yīng)集中在對角線附近。

4. 殘差圖:殘差圖展示了預(yù)測值與實際值之間的差異(殘差)。如果殘差分布均勻,說明模型的假設(shè)是合理的。

5. 性能指標(biāo):MSE(均方誤差)和R2分?jǐn)?shù)衡量模型的預(yù)測能力。

2. 嶺回歸 (Ridge Regression)

原理

嶺回歸是線性回歸的擴展,主要用于解決線性回歸中可能出現(xiàn)的多重共線性問題。當(dāng)輸入特征之間高度相關(guān)時,線性回歸的回歸系數(shù)可能會變得非常不穩(wěn)定。嶺回歸通過在損失函數(shù)中加入正則化項來懲罰回歸系數(shù)的大小,從而控制模型的復(fù)雜度,穩(wěn)定模型的系數(shù)。

核心公式

1. 模型形式

嶺回歸在線性回歸的損失函數(shù)中加入了一個正則化項(L2正則化):

2. 損失函數(shù)的推導(dǎo)

嶺回歸的目標(biāo)是最小化加權(quán)后的損失函數(shù)。通過對損失函數(shù)求導(dǎo)并令其為零,可以得到最優(yōu)的回歸系數(shù):

優(yōu)缺點

優(yōu)點

缺點

適用場景

核心案例

我們將使用糖尿病數(shù)據(jù)集(Diabetes Dataset)來演示嶺回歸的實現(xiàn)。糖尿病數(shù)據(jù)集是一個中等規(guī)模的數(shù)據(jù)集,包含多個生理特征和一年后疾病進展的測量值,非常適合用于回歸模型的訓(xùn)練和評估。

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

# 加載糖尿病數(shù)據(jù)集
diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = pd.Series(diabetes.target, name='DiseaseProgression')

# 數(shù)據(jù)集概覽
print(X.describe())

# 數(shù)據(jù)預(yù)處理(標(biāo)準(zhǔn)化)
X = (X - X.mean()) / X.std()

# 數(shù)據(jù)可視化:相關(guān)性矩陣
plt.figure(figsize=(10, 8))
sns.heatmap(X.corr(), annot=True, cmap='viridis')
plt.title("Feature Correlation Matrix", fontsize=16)
plt.show()

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 設(shè)置正則化參數(shù)
alpha = 1.0

# 創(chuàng)建嶺回歸模型
ridge_model = Ridge(alpha=alpha)
ridge_model.fit(X_train, y_train)

# 進行預(yù)測
y_pred = ridge_model.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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}')

# 嶺回歸系數(shù)
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. 數(shù)據(jù)預(yù)處理:對特征進行標(biāo)準(zhǔn)化處理,以確保模型的收斂性和性能。

2. 數(shù)據(jù)可視化

3. 性能指標(biāo)

3. 套索回歸 (Lasso Regression)

原理

套索回歸(Lasso,即Least Absolute Shrinkage and Selection Operator)是線性回歸的擴展,通過在損失函數(shù)中引入 L1 正則化項來約束回歸系數(shù)。L1 正則化的一個顯著特點是可以將一些回歸系數(shù)縮減為零,從而實現(xiàn)特征選擇。這使得套索回歸特別適用于高維數(shù)據(jù),能夠自動篩選出對預(yù)測最重要的特征。

核心公式

1. 模型形式

套索回歸的損失函數(shù)為:

2. 推導(dǎo)

套索回歸的推導(dǎo)涉及到 L1 正則化項的引入,相對于嶺回歸的 L2 正則化,L1 正則化可以產(chǎn)生稀疏解,即某些回歸系數(shù)可能被壓縮到零。這種稀疏性使得 Lasso 具有自動特征選擇的功能。

在數(shù)值優(yōu)化過程中,Lasso 回歸的解可以通過坐標(biāo)下降法等優(yōu)化算法得到。其核心思想是逐步優(yōu)化每個參數(shù),最終收斂到最優(yōu)解。

優(yōu)缺點

優(yōu)點

缺點

適用場景

套索回歸適用于以下場景:

核心案例

我們將使用糖尿病數(shù)據(jù)集(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

# 加載糖尿病數(shù)據(jù)集
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')

# 數(shù)據(jù)標(biāo)準(zhǔn)化
X = (X - X.mean()) / X.std()

# 數(shù)據(jù)可視化:相關(guān)性矩陣
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ùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建套索回歸模型
lasso_model = Lasso(alpha=0.1)
lasso_model.fit(X_train, y_train)

# 進行預(yù)測
y_pred = lasso_model.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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()

# 套索回歸系數(shù)
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. 噪聲特征的引入:我們?yōu)樘悄虿?shù)據(jù)集添加了一些無意義的噪聲特征,以展示套索回歸的特征選擇能力。

2. 套索回歸系數(shù)圖:展示了每個特征的回歸系數(shù)值,理想情況下,Lasso 會將無意義的噪聲特征系數(shù)縮減為零。

3. 性能指標(biāo)

4. 彈性網(wǎng)絡(luò)回歸 (Elastic Net Regression)

原理

彈性網(wǎng)絡(luò)回歸結(jié)合了 L1 和 L2 正則化,通過在損失函數(shù)中同時引入兩者的正則化項來約束模型。彈性網(wǎng)絡(luò)可以看作是嶺回歸和套索回歸的結(jié)合,既能處理高維數(shù)據(jù),也能進行特征選擇。

核心公式

1. 模型形式

彈性網(wǎng)絡(luò)回歸的損失函數(shù)為:

2. 推導(dǎo)

彈性網(wǎng)絡(luò)回歸的推導(dǎo)涉及到同時優(yōu)化 L1 和 L2 正則化項,最終的解可以通過坐標(biāo)下降法等優(yōu)化算法獲得。彈性網(wǎng)絡(luò)通過結(jié)合 L1 的稀疏性和 L2 的平滑性,提供了對高維和稀疏數(shù)據(jù)的強大處理能力。

優(yōu)缺點

優(yōu)點

缺點

適用場景

核心案例

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

# 生成虛擬數(shù)據(jù)集
n_samples = 1000
n_features = 10
X, y = make_regression(n_samples=n_samples, n_features=n_features, noise=0.1, random_state=42)

# 轉(zhuǎn)換為 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']

# 數(shù)據(jù)標(biāo)準(zhǔn)化
X = (X - X.mean()) / X.std()

# 數(shù)據(jù)可視化:相關(guān)性矩陣
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ùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建彈性網(wǎng)絡(luò)回歸模型
elastic_net_model = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net_model.fit(X_train, y_train)

# 進行預(yù)測
y_pred = elastic_net_model.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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()

# 彈性網(wǎng)絡(luò)回歸系數(shù)
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 來模擬高共線性場景,以展示彈性網(wǎng)絡(luò)處理共線性問題的能力。

2. 彈性網(wǎng)絡(luò)回歸系數(shù)圖:展示了每個特征的回歸系數(shù)值,觀察 L1 和 L2 正則化共同作用的結(jié)果。

3. 性能指標(biāo)

5. 邏輯回歸 (Logistic Regression)

原理

邏輯回歸用于處理二分類問題,通過將線性回歸的輸出轉(zhuǎn)換為概率值來進行分類。其核心思想是使用邏輯函數(shù)(sigmoid函數(shù))將線性模型的輸出映射到0和1之間,以預(yù)測二分類標(biāo)簽。

核心公式

1. 邏輯回歸模型

2. 推導(dǎo)

邏輯回歸通過最大化似然函數(shù)(MLE)來估計回歸系數(shù)。似然函數(shù)表示為:

通過對數(shù)變換得到對數(shù)似然函數(shù),然后對其求導(dǎo)并最大化,即可得到最優(yōu)的回歸系數(shù)。

優(yōu)缺點

優(yōu)點

缺點

適用場景

邏輯回歸適用于以下場景:

核心案例

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

# 加載乳腺癌數(shù)據(jù)集
cancer = load_breast_cancer()
X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
y = pd.Series(cancer.target, name='CancerType')

# 數(shù)據(jù)標(biāo)準(zhǔn)化
X = (X - X.mean()) / X.std()

# 數(shù)據(jù)可視化:相關(guān)性矩陣
plt.figure(figsize=(12, 10))
sns.heatmap(X.corr(), annot=False, cmap='coolwarm')
plt.title("Feature Correlation Matrix", fontsize=16)
plt.show()

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建邏輯回歸模型
log_reg = LogisticRegression(max_iter=10000)
log_reg.fit(X_train, y_train)

# 進行預(yù)測
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()

# 特征系數(shù)
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. 混淆矩陣:可視化模型在測試集上的表現(xiàn),展示了真實標(biāo)簽與預(yù)測標(biāo)簽的分布。

2. ROC曲線:展示了模型的診斷能力,曲線下面積(AUC)用于衡量分類器的優(yōu)劣。

3. 特征系數(shù)圖:展示了每個特征對分類結(jié)果的影響。

6. 支持向量回歸 (SVR)

原理

支持向量回歸(SVR)是一種擴展到回歸任務(wù)的支持向量機(SVM)。它的目標(biāo)是找到一個能夠最大限度地擬合訓(xùn)練數(shù)據(jù)的回歸超平面,同時保持模型的復(fù)雜度盡可能小。SVR 通過在誤差范圍內(nèi)(即“ε-不敏感”區(qū)域)不對數(shù)據(jù)點施加懲罰,從而控制模型的泛化能力。

核心公式

1. SVR 模型

2. 推導(dǎo)

SVR 的目標(biāo)是最大化支持向量間的間隔,同時在 ε-不敏感帶寬內(nèi)最小化誤差。通過引入拉格朗日乘子法,SVR 的優(yōu)化問題可以轉(zhuǎn)化為二次規(guī)劃問題,最終解通過拉格朗日乘子和核函數(shù)獲得。

優(yōu)缺點

優(yōu)點

缺點

適用場景

支持向量回歸適用于以下場景:

核心案例

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

# 生成虛擬數(shù)據(jù)集
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)

# 創(chuàng)建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] # 我們預(yù)測 Heating Load

# 數(shù)據(jù)標(biāo)準(zhǔn)化
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ùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=42)

# 創(chuàng)建支持向量回歸模型
svr = SVR(kernel='rbf', C=100, epsilon=0.1)
svr.fit(X_train, y_train)

# 進行預(yù)測
y_pred = svr.predict(X_test)

# 逆標(biāo)準(zhǔn)化
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 預(yù)測值散點圖
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 預(yù)測值:展示模型在測試集上的預(yù)測效果,通過對比實際值和預(yù)測值觀察模型的擬合效果。

2. 殘差圖:展示模型預(yù)測的殘差分布,檢查是否存在系統(tǒng)性偏差。

3. 性能指標(biāo)

7. 決策樹回歸 (Decision Tree Regression)

原理

決策樹回歸是使用樹狀模型進行回歸任務(wù)的算法。它通過不斷將數(shù)據(jù)集劃分成更小的子集,并在葉子節(jié)點上做出預(yù)測。決策樹的劃分基于對特征的某種度量,如均方誤差(MSE),以最小化葉子節(jié)點的誤差為目標(biāo)。

核心公式

1. 劃分標(biāo)準(zhǔn)

2. 推導(dǎo)

決策樹從根節(jié)點開始,迭代地選擇最佳特征進行數(shù)據(jù)劃分,直到滿足終止條件(如最大深度、最小樣本數(shù))。劃分過程中,通過選擇使 MSE 最小的特征及其閾值來決定數(shù)據(jù)的分裂方式。

優(yōu)缺點

優(yōu)點

缺點

適用場景

決策樹回歸適用于以下場景:

核心案例

我們使用紅酒質(zhì)量數(shù)據(jù)集(Wine Quality Dataset),以展示決策樹回歸在實際應(yīng)用中的表現(xiàn)。

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

# 加載紅酒質(zhì)量數(shù)據(jù)集
wine = load_wine()
X = pd.DataFrame(wine.data, columns=wine.feature_names)
y = pd.Series(wine.target, name='Quality')

# 數(shù)據(jù)標(biāo)準(zhǔn)化
X = (X - X.mean()) / X.std()

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建決策樹回歸模型
dt_regressor = DecisionTreeRegressor(max_depth=5, random_state=42)
dt_regressor.fit(X_train, y_train)

# 進行預(yù)測
y_pred = dt_regressor.predict(X_test)

# 決策樹結(jié)構(gòu)
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 預(yù)測值散點圖
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. 決策樹結(jié)構(gòu)可視化:展示了決策樹的完整結(jié)構(gòu),每個節(jié)點顯示了劃分特征及其閾值。

2. 實際值 vs 預(yù)測值:通過對比實際值和預(yù)測值,觀察模型的擬合效果。

3. 性能指標(biāo)

8. 隨機森林回歸 (Random Forest Regression)

原理

隨機森林回歸是通過集成多棵決策樹來進行回歸任務(wù)的算法。每棵樹都是從數(shù)據(jù)的不同子集和特征子集上訓(xùn)練而成的,最終的預(yù)測結(jié)果通過這些樹的平均值來給出。這種集成方法有效地降低了單棵決策樹的過擬合風(fēng)險,并提高了模型的穩(wěn)定性和泛化能力。

核心公式

1. 隨機森林模型

隨機森林由多棵決策樹組成,假設(shè)我們有 棵樹,每棵樹對輸入特征 給出一個預(yù)測 ,則隨機森林的預(yù)測結(jié)果為這些樹的平均值:

2. 推導(dǎo)

隨機森林通過“自助法”(Bootstrap)生成訓(xùn)練集的不同子集,并在這些子集上訓(xùn)練決策樹。同時,在每棵樹的構(gòu)建過程中,隨機選擇特征子集以進行節(jié)點劃分。最終,通過對所有樹的預(yù)測結(jié)果進行平均化來獲得最終預(yù)測。

優(yōu)缺點

優(yōu)點

缺點

適用場景

隨機森林回歸適用于以下場景:

核心案例

我們使用加利福尼亞房價數(shù)據(jù)集(California Housing Dataset),以展示隨機森林回歸在實際應(yīng)用中的表現(xiàn)。

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

# 加載加州房價數(shù)據(jù)集
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='Price')

# 數(shù)據(jù)標(biāo)準(zhǔn)化
X = (X - X.mean()) / X.std()

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建隨機森林回歸模型
rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)
rf_regressor.fit(X_train, y_train)

# 進行預(yù)測
y_pred = rf_regressor.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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 預(yù)測值:通過對比實際值和預(yù)測值,觀察模型的擬合效果。

2. 特征重要性:展示了模型中不同特征的重要性得分,用于評估哪些特征對預(yù)測結(jié)果影響最大。

3. 性能指標(biāo)

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

原理

梯度提升回歸(Gradient Boosting Regression)是一種集成學(xué)習(xí)方法,通過組合多個弱學(xué)習(xí)器(通常是決策樹)來構(gòu)建一個強學(xué)習(xí)器。每個學(xué)習(xí)器在前一個學(xué)習(xí)器的基礎(chǔ)上進行改進,逐步減少預(yù)測誤差。算法通過最小化損失函數(shù)來更新模型參數(shù),從而提高預(yù)測性能。

核心公式

1. 梯度提升模型

2. 推導(dǎo)

優(yōu)缺點

優(yōu)點

缺點

適用場景

核心案例

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

# 加載加州房價數(shù)據(jù)集
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='Price')

# 數(shù)據(jù)標(biāo)準(zhǔn)化
X = (X - X.mean()) / X.std()

# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 創(chuàng)建梯度提升回歸模型
gb_regressor = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
gb_regressor.fit(X_train, y_train)

# 進行預(yù)測
y_pred = gb_regressor.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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 預(yù)測值展示模型預(yù)測效果的散點圖。如果模型效果良好,散點圖中的點應(yīng)集中在對角線附近。

2. 特征重要性:展示各特征對模型預(yù)測的相對重要性。重要性高的特征對預(yù)測結(jié)果的貢獻較大。

3. 性能指標(biāo)

10. 貝葉斯回歸 (Bayesian Regression)

原理

貝葉斯回歸是一種基于貝葉斯統(tǒng)計方法的回歸模型,通過引入先驗分布和后驗分布來進行回歸分析。貝葉斯回歸的核心思想是使用概率分布來描述回歸系數(shù)的不確定性,而不是僅僅給出一個點估計值。

核心公式

1. 貝葉斯回歸模型

2. 先驗分布

3. 后驗分布

4. 推導(dǎo)

優(yōu)缺點

優(yōu)點

缺點

適用場景

核心案例

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

# 加載數(shù)據(jù)
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='Price')

# 數(shù)據(jù)標(biāo)準(zhǔn)化
scaler_X = StandardScaler()
X_scaled = scaler_X.fit_transform(X)

# 劃分?jǐn)?shù)據(jù)集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 創(chuàng)建貝葉斯回歸模型
bayesian_regressor = BayesianRidge()
bayesian_regressor.fit(X_train, y_train)

# 進行預(yù)測
y_pred = bayesian_regressor.predict(X_test)

# 實際值 vs 預(yù)測值散點圖
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 預(yù)測值:展示貝葉斯回歸模型的預(yù)測效果。如果模型效果良好,散點圖中的點應(yīng)集中在對角線附近,表明預(yù)測值接近實際值。

2. 性能指標(biāo)

文章轉(zhuǎn)自微信公眾號@深夜努力寫Python

上一篇:

突破最強算法模型,Transformer ?。?/h5>

下一篇:

通透!十大時間序列模型 最強總結(jié) ??!
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費