python - 为什么在对相同数据和相同算法进行评估时会产生两个不同的 AUC 分数
问题描述
我正在研究一个分类问题,其评估指标为 ROC AUC。到目前为止,我已经尝试使用具有不同参数的 xgb。这是我用来采样数据的函数。你可以在这里找到相关的笔记本(google colab)
def get_data(x_train, y_train, shuffle=False):
if shuffle:
total_train = pd.concat([x_train, y_train], axis=1)
# generate n random number in range(0, len(data))
n = np.random.randint(0, len(total_train), size=len(total_train))
x_train = total_train.iloc[n]
y_train = total_train.iloc[n]['is_pass']
x_train.drop('is_pass', axis=1, inplace=True)
# keep the first 1000 rows as test data
x_test = x_train.iloc[:1000]
# keep the 1000 to 10000 rows as validation data
x_valid = x_train.iloc[1000:10000]
x_train = x_train.iloc[10000:]
y_test = y_train[:1000]
y_valid = y_train[1000:10000]
y_train = y_train.iloc[10000:]
return x_train, x_valid, x_test, y_train, y_valid, y_test
else:
# keep the first 1000 rows as test data
x_test = x_train.iloc[:1000]
# keep the 1000 to 10000 rows as validation data
x_valid = x_train.iloc[1000:10000]
x_train = x_train.iloc[10000:]
y_test = y_train[:1000]
y_valid = y_train[1000:10000]
y_train = y_train.iloc[10000:]
return x_train, x_valid, x_test, y_train, y_valid, y_test
这是我在混洗和非混洗数据上运行后得到的两个输出
AUC with shuffling: 0.9021756235738453
AUC without shuffling: 0.8025162142685565
你能找出这里的问题吗?
解决方案
问题在于,在您的 shuffle- 实现中np.random.randint
生成随机数,但它们可以重复,因此您的火车和测试+有效集中出现了相同的事件。您应该np.random.permutation
改用(并考虑使用np.random.seed
以确保结果的可重复性)。
另一个注意事项 - 训练集和验证/测试集之间的性能差异很大(训练显示几乎完美的 ROC AUC)。我想,这是由于树的最大深度(14)太高,你允许你手头的数据集大小(~60K)
PS 感谢分享协作链接-我不知道,但它非常有用。
推荐阅读
- jquery - Safari 及其计算屏幕大小的方式
- php - PHP assert() 函数设置未定义为 $matches
- automated-tests - 在单独的网络上安装杜鹃?
- javascript - 如何开玩笑地测试这个正则表达式
- ios - 无法解码 JSON:无法读取数据,因为它的格式不正确
- jquery - Yii2 - beforeSubmit ajax 返回值
- html - 不同页面不同颜色
- c# - 如何使控制器从@Html.ActionLink 获取“LinkText”文本
- ruby-on-rails - 带有 Markdown 的 Grape Swagger Rails
- mysql - 从 id 列表中查询表