Cross Validation: 從多個方面詳解交叉驗證

一、什麼是交叉驗證

交叉驗證是評估模型性能的一種統計分析方法。在機器學習中,交叉驗證通常用於訓練集和測試集的選擇,以避免過度擬合。交叉驗證將數據分成若干組,然後將每組數據分別作為測試集和訓練集,統計結果進行得出最終的性能評估。常用的交叉驗證方法包括k-fold交叉驗證和leave-one-out交叉驗證。

二、k-fold交叉驗證

k-fold交叉驗證將數據集分成k組,每次將1組數據作為測試集,其他組數據作為訓練集。重複k次,每次都用不同的組作為測試集,並且每個測試集中的數據都用於訓練集。最後將k次的測試結果取平均值,得到最終的模型性能評估。

from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np

data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
target = np.array([3, 7, 11, 15, 19])

kf = KFold(n_splits=3)
lr = LinearRegression()

for train_index, test_index in kf.split(data):
    X_train, X_test = data[train_index], data[test_index]
    y_train, y_test = target[train_index], target[test_index]
    lr.fit(X_train, y_train)
    y_pred = lr.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    print("MSE: ", mse)

三、leave-one-out交叉驗證

leave-one-out交叉驗證就是將每個樣本都作為測試集,其他樣本作為訓練集,重複n次,n為樣本個數。因為每次訓練集只有1個樣本,所以計算開銷很大,一般只適用於樣本量較少的情況。

from sklearn.model_selection import LeaveOneOut
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np

data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
target = np.array([3, 7, 11, 15, 19])

loo = LeaveOneOut()
lr = LinearRegression()

mse_list = []
for train_index, test_index in loo.split(data):
    X_train, X_test = data[train_index], data[test_index]
    y_train, y_test = target[train_index], target[test_index]
    lr.fit(X_train, y_train)
    y_pred = lr.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    mse_list.append(mse)
avg_mse = np.mean(mse_list)
print("Avg MSE: ", avg_mse)

四、交叉驗證的參數選擇

在使用交叉驗證進行模型評估時,需要選擇不同的參數來得出最優的模型。通常可以使用網格搜索來選擇最佳參數組合。網格搜索通過枚舉不同參數組合,對每組參數進行交叉驗證,選擇平均性能最好的一組作為最終的模型參數。

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import Ridge
import numpy as np

data = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
target = np.array([3, 7, 10, 14, 18])

parameters = {'alpha':np.logspace(-3, 3, 7)}
ridge = Ridge()
clf = GridSearchCV(ridge, parameters, cv=3)
clf.fit(data, target)

print("Best Parameter: ", clf.best_params_)
print("Best Score: ", clf.best_score_)

五、交叉驗證的優缺點

交叉驗證的優點:

  • 可以利用所有的數據進行模型的評估,避免了數據的浪費。
  • 可以減小訓練誤差和測試誤差的方差,提高模型的穩定性和泛化能力。

交叉驗證的缺點:

  • 計算開銷較大,尤其是在樣本量較大時。
  • 不適用於非隨機數據集,例如時間序列數據集。
  • 可能會出現過度擬合,特別是在使用網格搜索選擇參數時。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/245170.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:06
下一篇 2024-12-12 13:06

相關推薦

發表回復

登錄後才能評論