将测试集划分为子组,然后分别对每个子组进行预测
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?非常感谢您的帮助以上是关于将测试集划分为子组,然后分别对每个子组进行预测的主要内容,如果未能解决你的问题,请参考以下文章