python嶺跡圖繪製函式

一眉师傅發表於2024-11-17

一.嶺跡圖是什麼?

嶺跡圖(Ridge Trace Plot)是一種視覺化工具,用於展示嶺迴歸中正則化引數($\alpha$)對迴歸係數的影響。它能幫助我們理解特徵的穩定性和正則化在控制模型複雜度中的作用。

二.什麼時候需要看嶺跡圖?

  1. 存在共線性特徵時

    • 當特徵間高度相關,普通最小二乘法(OLS)迴歸的係數會變得不穩定。
    • 嶺跡圖幫助選擇合適的正則化強度,緩解共線性問題。
  2. 模型複雜度調整時

    • 如果模型過擬合,可以透過嶺跡圖觀察較大的 $\alpha$ 是否能有效控制模型複雜度。
    • 如果模型欠擬合,則觀察適中的 $\alpha$ 是否能有效提高擬合能力。
  3. 特徵選擇或降維時

    • 嶺跡圖可幫助識別對模型貢獻較小的特徵,便於特徵選擇或進一步降維。
  4. 解釋非線性模型時

    • 儘管嶺跡圖主要用於線性模型,但也可以用於理解嶺迴歸對特定問題的建模方式。

三.嶺跡圖能說明什麼問題?

  1. 正則化的作用

    • $\alpha$ 控制模型的複雜度:小$\alpha$,模型複雜,可能過擬合;大$\alpha$,模型簡單,可能欠擬合。
    • 透過觀察嶺跡圖,可以選擇一個合適的 $\alpha$,在模型複雜度和擬合能力之間取得平衡。
  2. 特徵的穩定性

    • 穩定的特徵對預測更有意義,不易受共線性或噪聲影響。
    • 變化劇烈的特徵可能需要進一步處理,比如移除、歸一化或降維。
  3. 共線性問題

    • 如果某些係數在 $\alpha$ 較小時變得極大或波動劇烈,可能存在特徵共線性問題。
  4. 特徵重要性

    • 嶺跡圖可以直觀展示哪些特徵對預測目標最重要,以及它們的重要性如何隨正則化變化。

四.分析嶺跡圖

  1. $\alpha$ 較小時(接近左側)

    • 正則化強度較低,嶺迴歸趨近於普通最小二乘法(OLS)。
    • 係數可能波動較大,尤其在共線性特徵存在時,係數值可能很高甚至不穩定。
  2. $\alpha$ 增大時

    • 正則化逐漸加強,各特徵的係數被逐漸壓縮。
    • 特徵間的共線性被削弱,係數值趨於穩定。
  3. $\alpha$ 很大時(接近右側)

    • 強正則化將所有係數壓縮接近 0。
    • 模型變得過於簡單,可能導致欠擬合。

 特徵行為觀察

  • 穩定性:如果某條曲線隨著 $\alpha$ 增大仍保持較大絕對值,說明該特徵對目標變數的影響更顯著、更穩定。
  • 敏感性:某些曲線在 $\alpha$ 較小時變化劇烈,表明這些特徵可能高度共線或受噪聲影響。

五.輸出示例

  現象1:一條曲線始終接近 0

    該特徵對預測目標貢獻較小,可能是無關特徵。

  現象2:某些曲線在 $\alpha$ 較小時波動劇烈,但逐漸趨於穩定

    這些特徵可能存在共線性,但嶺迴歸緩解了問題。

  現象3:大部分曲線在 $\alpha$ 增大時趨近 0

    說明正則化削弱了所有特徵的重要性,$\alpha$ 太大可能導致欠擬合。

  透過觀察這些現象,可以有效調整模型引數和特徵選擇,從而構建更穩健的模型。

留到最後:python嶺跡圖函式程式碼

python嶺跡圖繪製函式
# 繪製嶺跡圖
def Ridge_Plot(x_train, y_train):
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.linear_model import Ridge

    # 確保 y_train 是一維陣列
    y_train = np.ravel(y_train)  # 自動將 (n, 1) 轉換為 (n,)

    # 定義正則化引數範圍
    alphas = np.logspace(-4, 4, 100)

    # 儲存係數
    coefs = []

    # 遍歷每個正則化引數,訓練嶺迴歸模型
    for alpha in alphas:
        ridge = Ridge(alpha=alpha)
        ridge.fit(x_train, y_train)
        coefs.append(ridge.coef_)

    # 轉換系數為陣列
    coefs = np.array(coefs)

    # 繪製嶺跡圖
    plt.figure(figsize=(10, 6))
    for i in range(x_train.shape[1]):
        plt.plot(alphas, coefs[:, i], label=f'Feature {i + 1}')
    plt.xscale('log')
    plt.xlabel('Regularization Parameter (alpha)')
    plt.ylabel('Coefficients')
    plt.title('Ridge Trace Plot')
    plt.axhline(0, color='black', linestyle='--', linewidth=0.7)
    plt.legend(loc='upper right', bbox_to_anchor=(1.2, 1), ncol=1)
    plt.tight_layout()
    plt.show()

Ridge_Plot(x_train=X_train,y_train=y_train)
View Code

值得注意的是,這裡順便學一個方法:

1.abs() #取絕對值

2.(22,1)型別資料與(22,)型別資料,

特性(22, 1)(22,)
維度 二維(矩陣) 一維(向量)
適用場景 矩陣運算、機器學習特徵輸入 陣列運算、資料表示
廣播行為 明確列方向 沒有方向,需要額外處理
相互轉換方法

.squeeze()

.rabel()

.reshape(-1)

.reshape(-1, 1)

選擇形狀時,要根據上下文需求(是否需要明確區分行列結構)和函式的要求(如線性模型對輸入特徵形狀的要求)來判斷使用哪種形式。  

相關文章