文章轉自微信公眾號:機器學習與人工智慧AI
文章原始連結:https://mp.weixin.qq.com/s/N0eQyCLaH4JOR_Z7ELcOag大家好,咱們今天說說過擬合和欠擬合! !
都說過擬合和欠擬合是在學習演算法過程中,不可能避免,而且是每次訓練都或多或少出現的現象。
今天就用兩個案例,真實體驗一下過擬合和欠擬合。
過度擬合(Overfitting)和欠擬合(Underfitting)涉及到模型在訓練和泛化過程中的表現表現。
過擬合(Overfitting)
咱們從定義、產生的原因、如何辨識和解決辦法四個面向進行說明:
定義: 過度擬合指的是模型在訓練資料上表現得很好,但在未見過的測試資料上表現較差的現象。模型過於複雜,幾乎完美地擬合了訓練資料中的雜訊和細節,導致對新資料的泛化能力不足。 原因: 過度擬合通常發生在模型的複雜度過高時,它可能具有過多的參數,以至於可以記住訓練資料的每一個細節。這可能包括雜訊、異常值或訓練資料中的一些特定模式。 辨識: 透過觀察模型在訓練集和驗證集(或測試集)上的表現差異來識別過擬合。如果模型在訓練集上表現很好,但在驗證集上表現較差,可能就存在過擬合問題。 解決方法: 減小模型複雜度: 減少模型的參數數量,可以透過減少層數、節點數或使用正規化方法。 增加數據量: 提供更多的訓練數據,可以幫助模型學到更一般化的規律,減少訓練數據中雜訊的過度擬合。
欠擬合(Underfitting)
定義: 欠擬合指的是模型在訓練資料上表現較差,無法捕捉資料中的關鍵模式和規律,導致在測試資料上也表現不佳。模型過於簡單,無法很好地適應數據的複雜性。
原因: 欠擬合通常發生在模型複雜度不足的情況下,可能是因為模型過於簡單,沒有足夠的表達能力來捕捉資料的真實分佈。
辨識: 如果模型在訓練集和驗證集上的表現都較差,無法很好地擬合訓練數據,可能存在欠擬合問題。
解決方法:
增加模型複雜度: 增加模型的參數數量,可以透過增加層數、節點數或使用更複雜的模型結構。 提供更多特徵: 確保模型能夠獲得足夠的信息,可能需要添加更多的特徵或進行特徵工程的處理。 增加訓練次數: 增加模型的訓練次數,以便更好學習資料的模式。
在說完一些既定描述之後,以下使用多項式回歸進行真實體驗!
案例- 過擬合
過度擬合通常發生在模型過於複雜,能夠很好地擬合訓練資料中的雜訊和細節,但在未見過的資料上表現不佳。這可能導致模型對訓練資料過度敏感,無法泛化到新資料。
過擬合可以透過損失函數表示,例如均方誤差(Mean Squared Error):
其中, 是實際標籤, 是模型預測的標籤, 是樣本數。
過度擬合時,模型可能會試圖使訓練資料的MSE 盡可能小,但在測試資料上可能會增加。
下面是一個Python 程式碼使用多項式迴歸模型:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
# 生成样本数据
np.random.seed(42)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义多项式回归模型
degree = 15
poly_features = PolynomialFeatures(degree=degree, include_bias=False)
X_poly_train = poly_features.fit_transform(X_train)
X_poly_test = poly_features.transform(X_test)
# 训练多项式回归模型
model = LinearRegression()
model.fit(X_poly_train, y_train)
# 预测
y_train_pred = model.predict(X_poly_train)
y_test_pred = model.predict(X_poly_test)
# 计算均方误差
mse_train = mean_squared_error(y_train, y_train_pred)
mse_test = mean_squared_error(y_test, y_test_pred)
# 绘制图形
plt.scatter(X, y, color='gray', label='Actual data')
plt.plot(X, model.predict(poly_features.transform(X)), color='red', label='Model fit', linewidth=2)
plt.title(f'Degree={degree} | Train MSE: {mse_train:.2f} | Test MSE: {mse_test:.2f}')
plt.legend()
plt.show()
從程式碼產生的圖形中,你會看到模型在訓練資料上表現得非常好(紅色曲線與灰色點的擬合度很高),但是在測試資料上的表現可能較差,特別是在資料的邊緣部分。這是典型的過度擬合現象,模型過於複雜,以至於學到了訓練資料中的雜訊和細節。
在圖形中,隨著多項式的階數(degree)的增加,模型對訓練資料的擬合變得越來越好,但對測試資料的泛化能力卻下降。這是需要注意的典型過度擬合行為。
案例- 欠擬合
欠擬合通常發生在模型過於簡單,無法捕捉資料中的關鍵模式和規律,導致在訓練資料上表現較差,同時在測試資料上也無法取得好的效果。這可能是由於模型的複雜度不足,無法適應資料的真實分佈。
同樣以均方誤差(Mean Squared Error)為例。
使用線性迴歸模型:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
# 生成样本数据
np.random.seed(42)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# 计算均方误差
mse_train = mean_squared_error(y_train, y_train_pred)
mse_test = mean_squared_error(y_test, y_test_pred)
# 绘制图形
plt.scatter(X, y, color='gray', label='Actual data')
plt.plot(X, model.predict(X), color='red', label='Model fit', linewidth=2)
plt.title(f'Linear Regression | Train MSE: {mse_train:.2f} | Test MSE: {mse_test:.2f}')
plt.legend()
plt.show()
從產生的圖,會看到模型對訓練資料的擬合程度較差(紅色線與灰色點的擬合度較低)。這是典型的欠擬合現象,模型無法很好地適應資料的非線性特徵,導致訓練資料上的均方誤差較大。
在圖形中,線性迴歸模型無法捕捉到資料中的正弦模式,這是因為模型的複雜度不足以適應資料的真實分佈。這是需要注意的典型欠擬合行為。解決欠擬合問題的方法可能包括增加模型複雜度或提供更多的特徵。
區別總結
這兩個案例代表了機器學習中兩種常見的問題:過度擬合和欠擬合。
它們的差異主要體現在模型對資料的適合程度以及在訓練集和測試集上的表現。
擬合程度:
過度擬合案例: 模型在訓練資料上表現得非常好,幾乎完美地擬合了訓練資料中的雜訊和細節。 欠擬合案例: 模型在訓練資料上表現較差,無法捕捉資料中的關鍵模式和規律。
模型複雜度:
過度擬合案例: 模型複雜過高,可能包含過多的參數,使得模型過於靈活,過度擬合了訓練資料。 欠擬合案例: 模型複雜度不足,無法很好地適應資料的真實分佈,可能是模型過於簡單。
解決方法:
過度擬合案例: 減少模型複雜度,使用正規化技術,增加訓練資料量,等等。 欠擬合案例: 增加模型複雜度,提供更多特徵,增加訓練次數,等等。
性能評估:
過度擬合案例: 在訓練集上表現良好,但在測試集上表現較差,測試誤差可能明顯高於訓練誤差。 欠擬合案例: 在訓練集和測試集上表現都較差,測試誤差和訓練誤差都可能較大。
圖形表現:
過度擬合案例: 模型在訓練資料上擬合得非常好,但在測試資料上可能出現過度擬合的情況。 欠擬合案例: 模型在訓練資料上的擬合度較低,無法很好地捕捉資料中的模式,可能表現為線性模型對非線性資料的擬合不足。
這些案例展示了在建立和調整機器學習模型時需要注意的兩個極端情況,而找到適當的模型複雜度以及有效的解決方案是提高模型泛化性能的關鍵。