概念
偏差(Bias):
偏差是模型預測值與實際值之間的差距,它反映了模型對訓練數據的擬合能力。高偏差意味著模型無法很好地擬合訓練數據,通常會導致欠擬合。欠擬合是指模型過于簡單,不能捕捉數據中的復雜模式,導致在訓練集和測試集上都表現不佳。
方差(Variance):
方差是模型在不同訓練數據集上預測值的變化程度,它反映了模型對訓練數據的敏感性。高方差意味著模型過于復雜,對訓練數據的小變化非常敏感,通常會導致過擬合。過擬合是指模型在訓練集上表現很好,但在未見過的測試數據上表現不佳。
權衡
偏差-方差權衡(Bias-Variance Trade-off):
在實際機器學習中,我們通常希望找到適當的模型復雜度,以平衡偏差和方差之間的關系,從而實現良好的泛化能力。一個理想的模型應該具有適當的復雜度,能夠在訓練數據上進行合適的擬合,同時又不會過于敏感,可以較好地適應未見過的數據。
解決方法
解決偏差和方差的方法包括:
減小偏差:增加模型的復雜度,使用更多的特征或更深的網絡等,以提高模型的表達能力。
減小方差:使用正則化方法,如L1/L2正則化、Dropout等,以減少模型對訓練數據的過度擬合。
總結:
偏差反映了模型對訓練數據的擬合能力,高偏差通常導致欠擬合。
方差反映了模型對不同訓練數據的變化敏感性,高方差通常導致過擬合。
偏差和方差之間存在權衡關系,需要找到適當的模型復雜度來實現良好的泛化能力。
代碼實現
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 生成隨機數據
np.random.seed(0)
X = np.random.rand(100, 1)
y = 2 * X + 1 + np.random.randn(100, 1) * 0.2# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)# 創建多項式特征
poly = PolynomialFeatures(degree=10)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)# 使用不同復雜度的模型進行擬合
model_underfit = LinearRegression()
model_properfit = LinearRegression()
model_overfit = LinearRegression()model_underfit.fit(X_train, y_train)
model_properfit.fit(X_train_poly, y_train)
model_overfit.fit(X_train_poly, y_train)# 繪制擬合結果
plt.figure(figsize=(12, 6))plt.subplot(1, 3, 1)
plt.scatter(X_train, y_train, color='blue', label='Training Data')
plt.plot(X_train, model_underfit.predict(X_train), color='red', label='Underfitting')
plt.legend()
plt.title('Underfitting')plt.subplot(1, 3, 2)
plt.scatter(X_train, y_train, color='blue', label='Training Data')
plt.plot(X_train, model_properfit.predict(X_train_poly), color='red', label='Properfitting')
plt.legend()
plt.title('Properfitting')plt.subplot(1, 3, 3)
plt.scatter(X_train, y_train, color='blue', label='Training Data')
plt.plot(X_train, model_overfit.predict(X_train_poly), color='red', label='Overfitting')
plt.legend()
plt.title('Overfitting')plt.tight_layout()
plt.show()# 計算測試集上的均方誤差
y_pred_underfit = model_underfit.predict(X_test)
y_pred_properfit = model_properfit.predict(X_test_poly)
y_pred_overfit = model_overfit.predict(X_test_poly)mse_underfit = mean_squared_error(y_test, y_pred_underfit)
mse_properfit = mean_squared_error(y_test, y_pred_properfit)
mse_overfit = mean_squared_error(y_test, y_pred_overfit)print("MSE Underfit:", mse_underfit)
print("MSE Properfit:", mse_properfit)
print("MSE Overfit:", mse_overfit)
在這個示例中,我們生成了一個隨機的多項式回歸問題,并使用不同復雜度的線性回歸模型進行擬合。通過繪制擬合結果和計算測試集上的均方誤差,我們可以看到:
Underfitting(欠擬合):模型過于簡單,無法捕捉數據中的復雜模式,導致在訓練集和測試集上都表現不佳。
Properfitting(適當擬合):使用多項式特征的線性回歸模型可以適當地擬合數據,既不過于簡單也不過于復雜。
Overfitting(過擬合):模型過于復雜,對訓練數據的小變化非常敏感,導致在訓練集上表現良好,但在測試集上表現不佳。
通過調整模型的復雜度,我們可以在適當的范圍內平衡偏差和方差,從而實現更好的泛化能力。