将测试集划分为子组,然后分别对每个子组进行预测

Posted

技术标签:

【中文标题】将测试集划分为子组,然后分别对每个子组进行预测【英文标题】:Divide the testing set into subgroup, then make prediction on each subgroup separately 【发布时间】:2019-07-05 16:44:19 【问题描述】:

我有一个类似于下表的数据集:

预测目标将是“分数”列。我想知道如何将测试集划分为不同的子组,例如分数在 1 到 3 之间,或者然后检查每个子组的准确性。

现在我拥有的如下:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = tree.DecisionTreeRegressor()
model.fit(X_train, y_train)
for i in (0,1,2,3,4):
    y_new=y_test[(y_test>=i) & (y_test<=i+1)]
    y_new_pred=model.predict(X_test)
    print metrics.r2_score(y_new, y_new_pred)

但是,我的代码不起作用,这是我得到的回溯:

发现样本数量不一致的输入变量:[14279, 55955]

我已经尝试了下面提供的解决方案,但看起来对于完整的分数范围 (0-5),r^2 是 0.67。但是例如 (0-1,1-2,2-3,3-4,4-5) 的子分数范围,r^2s 明显低于整个范围。不应该有些子分数 r^2 高于 0.67 而有些低于 0.67?

谁能告诉我我哪里做错了?非常感谢您的帮助。

【问题讨论】:

我认为您正在寻找confusion matrix。只需在将其传递给函数之前创建输出变量组。那应该可以。 显然,y_new_pred 包含整个测试集 X_test(55955 个样本)的预测,y_new 仅包含真实标签的子集 (14279),因此任何指标计算(r2_score 或其他)注定会失败,因此会出错;请参阅下面的答案(并请接受它,因为它可以解决您的问题)。 【参考方案1】:

当您计算指标时,您必须过滤预测值(根据您的子集条件)。

基本上你正在尝试计算

metrics.r2_score([1,3],[1,2,3,4,5])

这会产生错误,

ValueError:发现输入变量的数量不一致 样本:[2, 5]

因此,我建议的解决方案是

model.fit(X_train, y_train)
#compute the prediction only once. 
y_pred = model.predict(X_test)

for i in (0,1,2,3,4):
    #COMPUTE THE CONDITION FOR SUBSET HERE
    subset = (y_test>=i) & (y_test<=i+1)
    print metrics.r2_score(y_test [subset], y_pred[subset])

【讨论】:

Found array with 0 sample(s) (shape=(0, 55955)) while a minimum of 1 is required. 感谢您的帮助,我的朋友,但在应用您的解决方案后,我得到了上述回溯。知道为什么会这样, 顺便说一句,我打印出了y_test [subset]y_pred[subset],它们都是空的 好的,我的朋友。应用您的代码时我做错了什么。我一步一步研究了你的解决方案。所以子集只有 True 和 False 值。所以y_test [subset] and y_pred[subset] 只会在子集中保留标记为真的项目。我的理解正确吗? @AI_Learning 我对您的解决方案有一些疑问,我的朋友,但看起来对于完整的分数范围(0-5),r^2 是 0.67。但是例如 (0-1,1-2,2-3,3-4,4-5) 的子分数范围,r^2s 明显低于整个范围。不应该一些子分数 r^2 高于 0.67 而其中一些低于 0.67?非常感谢您的帮助

以上是关于将测试集划分为子组,然后分别对每个子组进行预测的主要内容,如果未能解决你的问题,请参考以下文章

数据集的划分

为啥要划分训练集、验证集和测试集

划分训练、测试集和数据观察

深度学习入门比赛——街景字符识别

深度学习入门比赛——街景字符识别

排序算法