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
相关产品推荐
相关产品推荐

