【发布时间】:2016-11-17 02:43:05
【问题描述】:
我在这里问这个问题,尽管我犹豫是否将其发布在 CrossValidated(或 DataScience)StackExchange 上。我有一个包含 60 个标记对象(用于训练)和 150 个未标记对象(用于测试)的数据集。该问题的目的是预测 150 个对象的标签(这曾经是作为作业问题给出的)。对于每个对象,我计算了 258 个特征。将每个对象视为样本,我有X_train : (60,258)、y_train : (60,)(用于训练的对象的标签)和X_test : (150,258)。由于给出了作业问题的解决方案,我也有这150个对象的true标签,在y_test : (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 的 AUC = 0.40。如果一个天真的分类器应该得分 AUC = 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)
确实,C=1 时 AUC=0.87,C=0.01 时 AUC=0.9。为什么使用交叉验证预测的 AUC 分数要好得多?是因为交叉验证允许对不包含降低 AUC 的对象/样本的测试数据子集进行预测吗?
【问题讨论】:
标签: python scikit-learn classification