返回文章列表

線性迴歸模型深度剖析與基函式應用

本文深入探討線性迴歸模型的數學基礎,並延伸至基函式的應用,涵蓋多項式及高斯基函式等方法。此外,文章也探討了模型過擬合的議題,並介紹 Ridge Regression 與 Lasso Regression 等正則化技術來解決此問題,提供程式碼範例與圖表說明,讓讀者能深入理解基函式如何提升線性迴歸模型的效能與應用

機器學習 資料科學

線性迴歸模型作為機器學習的基礎模型,在預測連續型變數方面扮演著重要角色。然而,真實世界的資料往往呈現非線性關係,此時,基函式的引入便能有效提升模型的效能。透過基函式,我們可以將原始資料對映到高維空間,使線性模型得以捕捉資料中的非線性模式。本文除了介紹多項式基函式外,也深入探討了高斯基函式的應用,並以實際程式碼示範如何使用 Scikit-learn 建立根據基函式的線性迴歸模型。此外,針對模型複雜度可能導致的過擬合問題,本文也介紹了 Ridge Regression 和 Lasso Regression 等正則化技術,並說明如何調整引數以平衡模型的複雜度和泛化能力。

線性迴歸模型深度剖析

線性迴歸是一種廣泛使用的統計模型,尤其是在預測連續性目標變數時。它是一種簡單而有效的模型,可以快速地對資料進行擬合,並且易於解釋。在本章中,我們將深入探討線性迴歸模型的數學基礎,並探索如何將其擴充套件到更複雜的模式。

線性迴歸的數學基礎

線性迴歸模型可以用以下方程式表示:

y = ax + b

其中,a 是斜率,b 是截距。這個模型假設資料點之間存線上性關係,並且可以用一條直線來描述。

簡單線性迴歸

讓我們從最簡單的線性迴歸模型開始,即直線擬合。假設我們有一組資料點,如下圖所示:

import numpy as np
import matplotlib.pyplot as plt

# 生成隨機資料
rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = 2 * x - 5 + rng.randn(50)

# 繪製資料點
plt.scatter(x, y)

這些資料點散佈在一條線上,具有斜率 2 和截距 -5。現在,我們可以使用 Scikit-Learn 的 LinearRegression 估算器來擬合這些資料點,並構建最佳擬合線,如下圖所示:

from sklearn.linear_model import LinearRegression

# 建立 LinearRegression 估算器
model = LinearRegression(fit_intercept=True)

# 將資料轉換為二維陣列
x_2d = x[:, np.newaxis]

# 對資料進行擬合
model.fit(x_2d, y)

# 繪製最佳擬合線
plt.plot(x, model.predict(x_2d))

線性迴歸的優點

線性迴歸模型有許多優點,包括:

  • 簡單易懂:線性迴歸模型非常簡單易懂,易於解釋和理解。
  • 快速擬合:線性迴歸模型可以快速地對資料進行擬合。
  • 廣泛應用:線性迴歸模型在各個領域中都有廣泛的應用,包括預測、分類別和特徵選擇等。

線性迴歸的擴充套件

雖然簡單線性迴歸模型非常有用,但它也有一些限制。例如,它假設資料點之間存線上性關係,但在實際中,資料點之間的關係可能是非線性的。為了克服這些限制,我們可以將線性迴歸模型擴充套件到更複雜的模式,例如多元線性迴歸、羅吉斯迴歸和支援向量機等。

內容解密:

在上面的程式碼中,我們使用了 Scikit-Learn 的 LinearRegression 估算器來擬合資料點。這個估算器使用了普通最小平方法(OLS)來計算最佳擬合線的引數。OLS 法是最常用的線性迴歸演算法,它透過最小化殘差平方和來計算最佳擬合線的引數。

圖表翻譯:

上面的圖表展示了簡單線性迴歸模型的效果。左圖顯示了原始資料點,右圖顯示了最佳擬合線。從圖表中可以看出,最佳擬合線能夠很好地描述資料點之間的關係。

在這個流程圖中,資料點首先被輸入到 LinearRegression 估算器中,然後估算器計算出最佳擬合線的引數,最後使用最佳擬合線進行預測。

線性迴歸模型的應用

在上一節中,我們簡要介紹了線性迴歸模型的基本概念。在這一節中,我們將更深入地探討線性迴歸模型的應用,特別是在多維度資料的情況下。

首先,讓我們回顧一下線性迴歸模型的基本形式:

y = a0 + a1x1 + a2x2 + ……

其中,y是預測值,x1、x2等是特徵變數,a0、a1、a2等是模型引數。

在Scikit-Learn中,線性迴歸模型可以使用LinearRegression類別來實作。下面是一個簡單的例子:

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 生成隨機資料
np.random.seed(0)
x = np.random.rand(100, 1)
y = 2 * x + 1 + np.random.randn(100, 1) / 1.5

# 建立線性迴歸模型
model = LinearRegression()

# 訓練模型
model.fit(x, y)

# 預測
xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

# 繪製結果
plt.scatter(x, y)
plt.plot(xfit, yfit)
plt.show()

print("模型截距:", model.intercept_)
print("模型斜率:", model.coef_)

在這個例子中,我們生成了一些隨機資料,並使用LinearRegression類別建立了一個線性迴歸模型。然後,我們訓練了模型,並使用模型預測了一些新的資料。最後,我們繪製了原始資料和預測結果。

多維度線性迴歸

在多維度資料的情況下,線性迴歸模型可以被擴充套件為:

y = a0 + a1x1 + a2x2 + ……

其中,y是預測值,x1、x2等是特徵變數,a0、a1、a2等是模型引數。

在Scikit-Learn中,多維度線性迴歸模型可以使用LinearRegression類別來實作。下面是一個簡單的例子:

import numpy as np
from sklearn.linear_model import LinearRegression

# 生成隨機資料
np.random.seed(0)
X = 10 * np.random.rand(100, 3)
y = 0.5 + np.dot(X, [1.5, -2., 1.])

# 建立線性迴歸模型
model = LinearRegression()

# 訓練模型
model.fit(X, y)

print("模型截距:", model.intercept_)
print("模型係數:", model.coef_)

在這個例子中,我們生成了一些隨機資料,並使用LinearRegression類別建立了一個多維度線性迴歸模型。然後,我們訓練了模型,並列印預出了模型的截距和係數。

基礎函式迴歸分析

基礎函式迴歸是一種強大的工具,能夠將線性迴歸擴充套件到非線性關係中。其核心思想是對原始資料進行變換,以便線性迴歸模型能夠捕捉到非線性的模式。

基礎函式變換

給定一個單一維度的輸入變數 $x$,我們可以透過基礎函式 $f_n(x)$ 將其變換為多維度的特徵空間。在這個空間中,線性迴歸模型可以被應用來捕捉非線性的關係。

例如,如果我們選擇基礎函式 $f_n(x) = x^n$,則模型變成了一個多項式迴歸:

$$y = a_0 + a_1x + a_2x^2 + a_3x^3 + \cdots$$

這種方法可以被延伸到其他型別的基礎函式,例如三角函式、指數函式等,以便捕捉不同型別的非線性關係。

實際應用

基礎函式迴歸在許多實際應用中被廣泛使用,例如預測股票價格、氣象預報等。在這些應用中,資料往往呈現非線性的模式,而基礎函式迴歸提供了一種有效的方法來捕捉這些模式。

程式碼實作示例

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 生成示例資料
np.random.seed(0)
x = np.random.rand(100, 1)
y = 3 + 2 * x + 0.5 * x**2 + np.random.randn(100, 1) / 1.5

# 建立基礎函式迴歸模型
poly_features = PolynomialFeatures(degree=2)
x_poly = poly_features.fit_transform(x)

# 線性迴歸模型
model = LinearRegression()
model.fit(x_poly, y)

# 預測
y_pred = model.predict(x_poly)

print("係數:", model.coef_)
print("截距:", model.intercept_)

內容解密:

在上述程式碼中,我們首先生成了一些示例資料,其中 $y$ 是一個二次函式的形式。然後,我們建立了一個基礎函式迴歸模型,使用 PolynomialFeatures 類別將原始資料變換為多項式特徵空間。接著,我們使用 LinearRegression 類別建立了一個線性迴歸模型,並對其進行訓練。最後,我們使用訓練好的模型進行預測,並輸出係數和截距。

圖表翻譯:

在這個圖表中,我們展示了基礎函式迴歸的流程。首先,我們生成一些示例資料。接著,我們對資料進行基礎函式變換,以便捕捉非線性的模式。然後,我們建立了一個線性迴歸模型,並對其進行訓練。最後,我們使用訓練好的模型進行預測,並輸出結果。

多項式基礎函式與高維線性模型

多項式基礎函式是一種將原始資料投影到高維空間的方法,使得複雜的非線性關係可以被線性模型所適應。這個過程涉及到將原始的一維資料轉換為高維資料,以便線性模型可以更好地適應資料。

多項式投影

給定一個一維陣列 x,我們可以將其投影到高維空間中,形成一個新的陣列,其中每個元素是原始陣列元素的不同次方。例如,對於一個三次多項式投影,我們會得到:

x = np.array([2, 3, 4])
poly = PolynomialFeatures(3, include_bias=False)
poly.fit_transform(x[:, None])

輸出結果為:

array([[ 2.,  4.,  8.],
       [ 3.,  9., 27.],
       [ 4., 16., 64.]])

這個轉換過程使得原始的一維陣列變成了三維陣列,每個元素代表著原始值的不同次方。

使用管道進行多項式模型構建

為了構建一個高維線性模型,我們可以使用 Scikit-learn 的 make_pipeline 函式來建立一個管道,將多項式轉換和線性迴歸結合起來。例如,建立一個 7 次多項式模型的管道:

from sklearn.pipeline import make_pipeline
poly_model = make_pipeline(PolynomialFeatures(7), LinearRegression())

這個管道可以用於適應複雜的非線性關係,例如帶有噪聲的正弦波:

rng = np.random.RandomState(1)
x = 10 * rng.rand(50)
y = np.sin(x) + 0.1 * rng.randn(50)
poly_model.fit(x[:, np.newaxis], y)

透過這種方式,我們可以使用線性模型來適應複雜的非線性關係,並且得到更好的預測結果。

內容解密:

多項式基礎函式是一種強大的工具,可以用於將原始資料投影到高維空間中,使得複雜的非線性關係可以被線性模型所適應。透過使用 Scikit-learn 的 PolynomialFeatures 類別和 make_pipeline 函式,我們可以輕鬆地構建高維線性模型,並且使用它們來適應複雜的非線性關係。

圖表翻譯:

以下是使用多項式基礎函式和高維線性模型適應帶有噪聲的正弦波的示例圖表: 這個圖表展示了使用多項式基礎函式和高維線性模型來適應複雜非線性關係的過程。首先,原始資料被轉換到高維空間中,然後使用高維線性模型來適應複雜的關係,最終得到預測結果。

非線性資料的多項式與高斯基函式擬合

在前面的範例中,我們使用線性模型和多項式基函式來擬合非線性資料。然而,除了多項式基函式外,還有其他基函式可以用於擬合非線性資料,例如高斯基函式。

多項式基函式擬合

首先,讓我們回顧一下多項式基函式的擬合過程。假設我們有一組非線性資料點 $(x, y)$,我們可以使用多項式基函式來擬合這些資料點。多項式基函式是指一組多項式函式的集合,例如 $x^2$、$x^3$ 等。

import numpy as np
import matplotlib.pyplot as plt

# 生成非線性資料點
x = np.linspace(-10, 10, 100)
y = np.sin(x) + 0.5 * np.random.randn(100)

# 使用多項式基函式擬合資料點
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline

poly_model = make_pipeline(PolynomialFeatures(degree=7), LinearRegression())
poly_model.fit(x[:, np.newaxis], y)

xfit = np.linspace(-10, 10, 1000)
yfit = poly_model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit)
plt.show()

高斯基函式擬合

除了多項式基函式外,高斯基函式也是常用的基函式之一。高斯基函式是指一組高斯分佈函式的集合,例如 $\exp(-\frac{(x-\mu)^2}{2\sigma^2})$ 等。

# 定義高斯基函式類別
from sklearn.base import BaseEstimator, TransformerMixin
class GaussianFeatures(BaseEstimator, TransformerMixin):
    """均勻間隔的高斯基函式"""

    def __init__(self, N, width_factor=2.0):
        self.N = N
        self.width_factor = width_factor

    @staticmethod
    def _gauss_basis(x, y, width, axis=None):
        arg = (x - y) / width
        return np.exp(-0.5 * np.sum(arg ** 2, axis))

    def fit(self, X, y=None):
        # 建立 N 個中心點,均勻分佈在資料範圍內
        self.centers_ = np.linspace(X.min(), X.max(), self.N)
        self.width_ = self.width_factor * (self.centers_[1] - self.centers_[0])
        return self

    def transform(self, X):
        return self._gauss_basis(X[:, :, np.newaxis], self.centers_, self.width_, axis=1)

# 使用高斯基函式擬合資料點
gauss_model = make_pipeline(GaussianFeatures(20), LinearRegression())
gauss_model.fit(x[:, np.newaxis], y)

yfit = gauss_model.predict(xfit[:, np.newaxis])

plt.scatter(x, y)
plt.plot(xfit, yfit)
plt.show()

圖表翻譯:

上述程式碼使用高斯基函式來擬合非線性資料點。圖表中,實際資料點以藍色圓點表示,紅色曲線表示使用高斯基函式擬合的結果。高斯基函式可以提供更好的擬合效果,尤其是在資料點分佈不均勻的情況下。

內容解密:

在上述程式碼中,我們定義了一個高斯基函式類別 GaussianFeatures,它繼承自 BaseEstimatorTransformerMixin。這個類別包含了 _gauss_basis 方法,該方法計算高斯基函式的值。fit 方法用於計算高斯基函式的中心點和寬度,而 transform 方法則用於將輸入資料轉換為高斯基函式的輸出。最後,我們使用 make_pipeline 函式將高斯基函式類別和線性迴歸模型結合起來,形成了一個完整的模型。

根據基函式的線性迴歸模型

在前面的章節中,我們討論了線性迴歸模型及其應用。在這個章節中,我們將探討如何使用基函式(basis functions)來增強線性迴歸模型的能力。

基函式是一種將原始資料轉換為更高維度空間的方法,從而使得模型能夠學習到更加複雜的關係。下面是使用高斯基函式(Gaussian basis functions)來進行線性迴歸的範例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import GaussianFeatures

# 生成示範資料
x = np.linspace(0, 10, 100)
y = np.sin(x) + 0.1 * np.random.randn(100)

# 定義高斯基函式轉換器
gaussian_features = GaussianFeatures()

# 定義線性迴歸模型
linear_regression = LinearRegression()

# 建立管道模型
model = make_pipeline(gaussian_features, linear_regression)

# 訓練模型
model.fit(x[:, np.newaxis], y)

# 預測結果
xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

# 繪製結果
plt.scatter(x, y)
plt.plot(xfit, yfit)
plt.xlim(0, 10)
plt.show()

規範化(Regularization)

當我們引入基函式到線性迴歸模型中時,模型的複雜度會大大增加,從而可能導致過度擬合(overfitting)。為了避免過度擬合,我們可以使用規範化技術來限制模型的複雜度。

規範化是一種透過在損失函式中新增一個額外的項來限制模型引數的大小,從而避免過度擬合的方法。常見的規範化方法包括L1規範化和L2規範化。

高斯基函式過度擬合的例子

下面是使用高斯基函式進行線性迴歸的過度擬合例子:

# 定義高斯基函式轉換器
gaussian_features = GaussianFeatures(30)

# 定義線性迴歸模型
linear_regression = LinearRegression()

# 建立管道模型
model = make_pipeline(gaussian_features, linear_regression)

# 訓練模型
model.fit(x[:, np.newaxis], y)

# 預測結果
xfit = np.linspace(0, 10, 1000)
yfit = model.predict(xfit[:, np.newaxis])

# 繪製結果
plt.scatter(x, y)
plt.plot(xfit, yfit)
plt.xlim(0, 10)
plt.ylim(-1.5, 1.5)
plt.show()

這個例子中,我們使用了30個高斯基函式來進行線性迴歸,結果模型出現了過度擬合的情況。

圖表翻譯:

上述程式碼生成的圖表展示了使用高斯基函式進行線性迴歸的過度擬合情況。圖表中,藍色點代表原始資料,紅色曲線代表模型預測結果。由於模型過度擬合了資料,導致預測結果出現了非常大的波動。

基函式係數繪製

為了更好地理解基函式的作用,我們可以繪製基函式係數與其位置的關係。下面是基函式係數繪製的範例:

def basis_plot(model, title=None):
    fig, ax = plt.subplots(2, sharex=True)
    model.fit(x[:, np.newaxis], y)
    ax[0].scatter(x, y)
    ax[0].plot(xfit, model.predict(xfit[:, np.newaxis]))
    ax[0].set(xlabel='x', ylabel='y', ylim=(-1.5, 1.5))
    if title:
        ax[0].set_title(title)
    ax[1].plot(model.steps[0][1].centers_, model.steps[0][1].weights_)
    return fig

basis_plot(model)
plt.show()

這個範例中,我們定義了一個函式basis_plot來繪製基函式係數與其位置的關係。圖表中,上半部分展示了原始資料和模型預測結果,下半部分展示了基函式係數與其位置的關係。

過度複雜模型的正則化

在過去的章節中,我們討論瞭如何使用高斯基函式(Gaussian basis functions)來建立複雜的模型。然而,當基函式過度重疊時,模型可能會出現過度擬合(overfitting)的問題。為瞭解決這個問題,我們可以使用正則化(regularization)技術來限制模型的複雜度。

Ridge Regression(L2 正則化)

Ridge regression,也稱為 L2 正則化,是最常見的正則化方法之一。它透過在模型的損失函式中新增一個項來懲罰模型係數的二範數(2-norms)。這個懲罰項的形式為:

P = α * ∑(θn^2)

其中 α 是一個可調整的引數,控制著懲罰項的強度。Scikit-Learn 中的 Ridge 估計器實作了這種正則化方法。

from sklearn.linear_model import Ridge
model = make_pipeline(GaussianFeatures(30), Ridge(alpha=0.1))
basis_plot(model, title='Ridge Regression')

Ridge regression 的優點在於它可以在不增加太多計算成本的情況下計算出來。α 引數控制著模型的複雜度,當 α → 0 時,我們還原到了標準線性迴歸模型;當 α → ∞ 時,所有模型回應都會被抑制。

Lasso Regression(L1 正則化)

另一種常見的正則化方法是 Lasso regression,或稱 L1 正則化。它透過懲罰模型係數的絕對值之和來限制模型的複雜度。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 線性迴歸模型深度剖析與基函式應用

package "基函式迴歸" {
    package "線性基礎" {
        component [簡單線性迴歸] as simple
        component [斜率與截距] as slope
        component [最佳擬合線] as bestfit
    }

    package "基函式擴展" {
        component [多項式基函式] as poly
        component [高斯基函式] as gauss
        component [高維對映] as highdim
    }

    package "正則化" {
        component [Ridge Regression] as ridge
        component [Lasso Regression] as lasso
        component [過擬合控制] as overfit
    }
}

simple --> poly : 非線性擴展
poly --> gauss : RBF 核
highdim --> overfit : 複雜度增加
overfit --> ridge : L2 正則化
overfit --> lasso : L1 正則化

note bottom of poly
  φ(x) = [1, x, x², ...]
  特徵空間擴展
end note

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

圖表翻譯:

上述流程圖展示了過度複雜模型如何透過正則化來限制其複雜度。過度擬合是由於模型過度複雜而導致的問題,正則化可以透過懲罰模型係數來解決這個問題。Ridge regression 和 Lasso regression 是兩種常見的正則化方法,它們透過不同的方式來限制模型的複雜度。

從技術架構視角來看,線性迴歸模型雖結構簡單,但在機器學習領域仍佔據重要地位。本系列文章由淺入深地剖析了線性迴歸的數學基礎、模型建立、基函式擴充套件及正則化方法,展現了其從簡單線性關係到處理複雜非線性資料的能力。模型訓練過程中,透過多項式或高斯基函式將資料投影至高維空間,有效提升模型的擬合能力。然而,高維空間也帶來了過擬合的風險,此時,Ridge 和 Lasso 正則化方法的應用就顯得至關重要。這兩種方法都能有效控制模型複雜度,防止過擬合,但其作用機制和適用場景略有不同,需根據實際資料特性選擇合適的正則化策略。對於追求模型可解釋性的應用,Lasso Regression 更具優勢,因其能將部分特徵權重降至零,有效簡化模型。展望未來,根據線性迴歸模型的改良和應用仍有廣闊的發展空間,特別是在結合其他機器學習技術,例如深度學習的嵌入式特徵,以應對更複雜的資料結構和預測任務。對於機器學習的入門者和進階者,深入理解線性迴歸模型的原理和應用技巧都至關重要。