我們學習了過擬合和欠擬合,具體見我的文章:https://giszz.blog.csdn.net/article/details/136440338
那么今天,我們來學習模型泛化性的評價。
泛化性的問題,我們也討論過了,那么如何評價模型的泛化性呢?
?
我們知道,過擬合(over-fitting),就是在訓練數據上表現良好,在未知數據上表現差。
欠擬合(under-fitting),就是在訓練數據和未知數據上表現都很差。
這里要記住!
過和欠都不好,訓練結合略微低于測試結果是組好的。?
?
這個圖特別有助于我們的理解。
延伸學習:
模型泛化性的評價方法主要包括留出驗證、交叉驗證、自助法等,下面詳細闡述留出驗證和交叉驗證這兩種常用的方法,以及它們的步驟和重要的工具,并給出具體的例子來說明。
一、留出驗證
留出驗證是將數據集劃分為訓練集、驗證集和測試集三個部分。訓練集用于訓練模型,驗證集用于調整模型參數和選擇最佳模型,測試集用于評估模型的泛化性能。
步驟:
- 將數據集按比例劃分為訓練集、驗證集和測試集,通常的比例是70%:15%:15%或60%:20%:20%等。
- 使用訓練集訓練模型,并使用驗證集進行模型選擇和參數調整。
- 選擇在驗證集上表現最好的模型,使用測試集評估其泛化性能。
工具:
Python中的scikit-learn庫提供了留出驗證的相關功能,如train_test_split
函數可用于劃分數據集。
例子:
假設我們有一個包含1000個樣本的數據集,我們可以使用train_test_split
函數將其劃分為訓練集、驗證集和測試集。例如,將70%的數據作為訓練集,剩余的30%再平均分為驗證集和測試集。
from sklearn.model_selection import train_test_split X, y = # 數據集的特征和標簽 X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
二、交叉驗證
交叉驗證是一種將數據集分成多份,每次使用其中的一份作為驗證集,其余的作為訓練集的驗證方法。常見的交叉驗證方法有k折交叉驗證和留一交叉驗證。
步驟(以k折交叉驗證為例):
- 將數據集平均分成k份,每份稱為一個折(fold)。
- 每次使用其中的一個折作為驗證集,其余的k-1個折作為訓練集。
- 重復k次,每次選擇不同的折作為驗證集,確保每個折都被用作驗證集一次。
- 計算k次驗證結果的平均值作為模型的性能評估指標。
工具:
Python中的scikit-learn庫提供了交叉驗證的相關功能,如KFold
和cross_val_score
等。
例子:
假設我們有一個包含100個樣本的數據集,我們可以使用5折交叉驗證來評估模型的性能。這意味著我們將數據集分成5份,每份包含20個樣本。
from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegression X, y = # 數據集的特征和標簽
model = LogisticRegression() # 以邏輯回歸模型為例 kfold = KFold(n_splits=5, shuffle=True, random_state=42) # 創建5折交叉驗證對象
scores = cross_val_score(model, X, y, cv=kfold) # 使用交叉驗證評估模型性能 print("交叉驗證結果:", scores) # 輸出每次驗證的結果
print("平均性能:", scores.mean()) # 輸出平均性能評估指標
需要注意的是,在實際應用中,我們通常會結合多種評估方法和工具來全面評估模型的泛化性能。此外,還需要注意數據集的劃分比例、隨機性等因素對評估結果的影響。
?