咱們今天討論的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(均方誤差)和R2分數衡量模型的預測能力。

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. 數據可視化

3. 性能指標

3. 套索回歸 (Lasso Regression)

原理

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

核心公式

1. 模型形式

套索回歸的損失函數為:

2. 推導

套索回歸的推導涉及到 L1 正則化項的引入,相對于嶺回歸的 L2 正則化,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. 性能指標

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. 性能指標

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 的優化問題可以轉化為二次規劃問題,最終解通過拉格朗日乘子和核函數獲得。

優缺點

優點

缺點

適用場景

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

核心案例

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. 性能指標

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. 性能指標

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. 性能指標

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. 性能指標

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. 性能指標

文章轉自微信公眾號@深夜努力寫Python

上一篇:

突破最強算法模型,Transformer !!

下一篇:

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

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

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

#AI深度推理大模型API

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

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