我在这里问这个问题,尽管我犹豫是否将它发布在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的对象/样本的测试数据的子集进行预测?