如何使用R语言rpart包实现类似SkLearn的决策树准确率计算
基于rpart实现与Scikit-Learn决策树等效的准确率计算
参数映射对齐规则
要匹配Scikit-Learn的DecisionTreeClassifier行为,需要将参数一一对应到rpart的配置项中:
- 随机状态对齐:提前用
set.seed(rseed)固定全局随机数种子,等效sklearn的random_state参数 - 最小分裂样本数:在rpart控制项中设置
minsplit=2,等效sklearn的min_samples_split=2,即节点内样本数达到阈值才允许触发分裂 - 代价复杂度剪枝参数:在rpart控制项中设置
cp=0.005,等效sklearn的ccp_alpha=0.005,控制剪枝强度 - 任务类型匹配:指定
method="class"为分类树,且训练时的响应变量train_outputs必须转为因子类型,否则rpart会默认拟合回归树,与sklearn的分类任务逻辑完全不符
完整模型训练代码
# 加载rpart依赖 library(rpart) # 固定随机种子 set.seed(rseed) # 配置模型控制参数 tree_ctrl <- rpart.control( minsplit = 2, cp = 0.005 ) # 训练决策树模型(等效sklearn的tr.fit()逻辑) # 注意:入参需要合并为单数据框,train_outputs需提前转为因子适配分类任务 train_df <- cbind(train_features, train_outputs = factor(train_outputs)) model_tree <- rpart( formula = train_outputs ~ ., data = train_df, method = "class", control = tree_ctrl )
训练/测试集准确率计算(等效sklearn的model.score())
rpart没有内置直接输出准确率的方法,通过预测结果与真实值比对计算准确率,同时保持与示例一致的输出格式:
# 计算训练集准确率 train_pred <- predict(model_tree, newdata = train_df, type = "class") train_acc <- mean(train_pred == train_df$train_outputs) cat(sprintf("Model Train Accuracy: %.4f\n", train_acc)) # 计算测试集准确率(测试集特征列名、类型需与训练集保持一致) test_df <- cbind(test_features, test_outputs = factor(test_outputs)) test_pred <- predict(model_tree, newdata = test_df, type = "class") test_acc <- mean(test_pred == test_df$test_outputs) cat(sprintf("Model Test Accuracy: %.4f\n", test_acc))
注意事项
- 预测时传入的测试集特征列名、数据类型必须与训练集完全一致,列顺序调换不会影响rpart计算,但列名不匹配会导致预测结果报错
- 通过
type="class"获取分类预测标签时,输出结果的类别顺序与训练时因子的水平顺序一致,无需额外调整标签对齐 - 代码输出精度设置为4位小数,与示例中Scikit-Learn的输出格式完全匹配
- 受rpart与Scikit-Learn底层树分裂逻辑的细微差异影响,最终输出的准确率不会与Python端的结果完全相等,但计算流程、参数含义完全等效
内容的提问来源于stack exchange,提问作者billv1179
相关产品推荐
相关产品推荐

