
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
咱們今天討論的10種回歸類算法有:
接下來,咱們從原理、推導、優缺點,并且使用一個不同的數據集進行詳細的分析,和大家聊聊~
線性回歸是一種統計方法,用于描述一個或多個自變量與因變量之間的線性關系。目標是找到最佳擬合線(最小化誤差平方和),從而預測連續目標變量的值。假設給定的自變量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分數衡量模型的預測能力。
嶺回歸是線性回歸的擴展,主要用于解決線性回歸中可能出現的多重共線性問題。當輸入特征之間高度相關時,線性回歸的回歸系數可能會變得非常不穩定。嶺回歸通過在損失函數中加入正則化項來懲罰回歸系數的大小,從而控制模型的復雜度,穩定模型的系數。
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. 性能指標:
套索回歸(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. 性能指標:
彈性網絡回歸結合了 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. 性能指標:
邏輯回歸用于處理二分類問題,通過將線性回歸的輸出轉換為概率值來進行分類。其核心思想是使用邏輯函數(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. 特征系數圖:展示了每個特征對分類結果的影響。
支持向量回歸(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. 性能指標:
決策樹回歸是使用樹狀模型進行回歸任務的算法。它通過不斷將數據集劃分成更小的子集,并在葉子節點上做出預測。決策樹的劃分基于對特征的某種度量,如均方誤差(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. 性能指標:
隨機森林回歸是通過集成多棵決策樹來進行回歸任務的算法。每棵樹都是從數據的不同子集和特征子集上訓練而成的,最終的預測結果通過這些樹的平均值來給出。這種集成方法有效地降低了單棵決策樹的過擬合風險,并提高了模型的穩定性和泛化能力。
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. 性能指標:
梯度提升回歸(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. 性能指標:
貝葉斯回歸是一種基于貝葉斯統計方法的回歸模型,通過引入先驗分布和后驗分布來進行回歸分析。貝葉斯回歸的核心思想是使用概率分布來描述回歸系數的不確定性,而不是僅僅給出一個點估計值。
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. 性能指標: