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