You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KNN房价模型生成混淆矩阵报错:数据层级多于参考层级

问题

使用R语言构建KNN房价预测模型时,生成混淆矩阵出现如下报错:

Error in confusionMatrix.default(data = as.factor(knn_df), reference = as.factor(test_price)) :
the data cannot have more levels than the reference

其中knn_df有176个层级,test_price有109个层级。请问该情况是否正常?需要手动匹配层级还是数据拆分环节存在错误?

完整代码如下:

model_df <- filter(model_df, model_df$Price < quantile(model_df$Price, 0.98))
model_df <- filter(model_df, model_df$Area < quantile(model_df$Area, 0.98))

model_df[, c("Area", "Room", "Lon", "Lat")] <- scale(model_df[, c("Area", "Room", "Lon", "Lat")])

set.seed(123)
msplit <- runif(nrow(model_df)) < 0.7
train_df <- model_df[msplit, ]
test_df <- model_df[!msplit, ]

train_ind_vars <- train_df[, c("Area", "Room", "Lon", "Lat")]
train_price <- train_df$Price
test_ind_vars <- test_df[, c("Area", "Room", "Lon", "Lat")]
test_price <- test_df$Price

knn_df <- knn(train = as.matrix(train_ind_vars), test = as.matrix(test_ind_vars), cl = train_price , k = 30 )

confusion_matrix <- confusionMatrix(data = as.factor(knn_df), reference = as.factor(test_price))

注:model_df包含Price(房价)、Area(面积)、Room(房间数)、Lat(纬度)、Lon(经度)字段。

解答

1. 情况不正常,核心原因是任务类型错配

房价预测是连续数值回归任务,但你误用了分类版KNN(knn函数)和分类任务的评估工具confusionMatrix,这是根本错误:

  • knn函数是为分类任务设计的,它会把输入的cl(这里是训练集房价)当成类别标签,预测结果只能是训练集中出现过的房价值,导致knn_df的层级数等于训练集房价的不同取值数量。
  • 测试集的test_price是另一组连续数值,不同取值数量和训练集不一致,转成因子后层级数不匹配,因此触发报错。

2. 数据拆分环节无错误

你的随机7:3拆分逻辑(runif(nrow(model_df)) < 0.7)是合理的,报错和数据拆分没有关系。

3. 正确的解决方法

(1)改用KNN回归方法

放弃分类版knn,使用回归版KNN,比如FNN包的knn.reg函数:

# 安装并加载依赖包
install.packages("FNN")
library(FNN)
library(dplyr)

# 保留原数据预处理步骤
model_df <- filter(model_df, model_df$Price < quantile(model_df$Price, 0.98))
model_df <- filter(model_df, model_df$Area < quantile(model_df$Area, 0.98))

model_df[, c("Area", "Room", "Lon", "Lat")] <- scale(model_df[, c("Area", "Room", "Lon", "Lat")])

set.seed(123)
msplit <- runif(nrow(model_df)) < 0.7
train_df <- model_df[msplit, ]
test_df <- model_df[!msplit, ]

train_ind_vars <- train_df[, c("Area", "Room", "Lon", "Lat")]
train_price <- train_df$Price
test_ind_vars <- test_df[, c("Area", "Room", "Lon", "Lat")]
test_price <- test_df$Price

# 执行KNN回归预测
knn_pred <- knn.reg(train = as.matrix(train_ind_vars), 
                    test = as.matrix(test_ind_vars), 
                    y = train_price, 
                    k = 30)$pred

(2)用回归任务指标评估模型

回归任务不能用混淆矩阵,应该用以下指标评估模型效果:

# 计算回归评估指标
mae <- mean(abs(knn_pred - test_price))  # 平均绝对误差
mse <- mean((knn_pred - test_price)^2)   # 均方误差
rmse <- sqrt(mse)                        # 均方根误差

cat("MAE:", round(mae, 2), "\nMSE:", round(mse, 2), "\nRMSE:", round(rmse, 2))

内容的提问来源于stack exchange,提问作者RensvDijck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:30:29