我在這裏問這個問題,儘管我猶豫是否將它發佈在CrossValidated(或DataScience)StackExchange上。我有一個包含60個標記對象(用於訓練)和150個未標記對象(用於測試)的數據集。問題的目的是預測150個對象的標籤(這是作爲一個家庭作業問題給出的)。對於每個對象,我計算了258個特徵。考慮到每個對象作爲示例,我有X_train : (60,258)
,y_train : (60,)
(用於訓練的對象的標籤)和X_test : (150,258)
。由於給出了作業問題的解決方案,因此我也有y_test : (150,)
中的150個對象的標籤。如何解釋測試數據的性能下降?
爲了預測150個對象的標籤,我選擇使用LogisticRegression(Scikit-learn實現)。分類器在(X_train, y_train)
上進行了訓練,數據經過歸一化後,用於對150個對象進行預測。這些預測與y_test
進行比較以評估模型的性能。爲了再現性,我複製了我用過的代碼。
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import cross_val_score, crosss_val_predict
# Fit classifier
LogReg = LogisticRegression(C=1, class_weight='balanced')
scaler = StandardScaler()
clf = make_pipeline(StandardScaler(), LogReg)
LogReg.fit(X_train, y_train)
# Performance on training data
CV_score = cross_val_score(clf, X_train, y_train, cv=10, scoring='roc_auc')
print(CV_score)
# Performance on test data
probas = LogReg.predict_proba(X_test)[:, 1]
AUC = metrics.roc_auc_score(y_test, probas)
print(AUC)
矩陣X_train
,y_train
,X_test
和y_test
保存在可用this link一個.MAT文件。我的問題如下:
使用這種方法,我在訓練數據(CV_score = 0.8)上獲得了很好的性能,但測試數據的性能更差:對於LogReg中的C = 1,AUC = 0.54 =對於C = 0.01,爲0.40。如果一個天真的分類器應該得到AUC = 0.5,我怎樣才能得到0.5的AUC?這是因爲我有少量訓練樣本? 我注意到,如果我改變的代碼上的測試數據的性能提高:
y_pred = cross_val_predict(clf, X_test, y_test, cv=5)
AUC = metrics.roc_auc_score(y_test, y_pred)
print(AUC)
事實上,AUC = 0.87 C = 1和0.9 C = 0.01。爲什麼使用交叉驗證預測的AUC得分更好?是否因爲交叉驗證允許對不包含降低AUC的對象/樣本的測試數據的子集進行預測?