r - 如何将 one-hot 编码数据传递给 nnet 模型以执行预测?
问题描述
我是数据科学的新手,想在 R 中构建一个神经网络模型。我在训练之前读过关于 one-hot encoding 分类数据的内容。我试图实现这一点,但是,在尝试训练模型时收到以下错误:
Error in model.frame.default(formula = nndf$class ~ ., data = train) :
invalid type (list) for variable 'nndf$class'
我已经阅读了 nnet 文档,其中解释了公式应该传递为:
class ~ x1 + x2
但我仍然不确定如何正确传递数据。
这是代码:
nndf$al <- one_hot(as.data.table(nndf$al))
nndf$su <- one_hot(as.data.table(nndf$su))
nndf$rbc <- one_hot(as.data.table(nndf$rbc))
nndf$pc <- one_hot(as.data.table(nndf$pc))
nndf$pcc <- one_hot(as.data.table(nndf$pcc))
nndf$ba <- one_hot(as.data.table(nndf$ba))
nndf$htn <- one_hot(as.data.table(nndf$htn))
nndf$dm <- one_hot(as.data.table(nndf$dm))
nndf$cad <- one_hot(as.data.table(nndf$cad))
nndf$appet <- one_hot(as.data.table(nndf$appet))
nndf$pe <- one_hot(as.data.table(nndf$pe))
nndf$ane <- one_hot(as.data.table(nndf$ane))
nndf$class <- one_hot(as.data.table(nndf$class))
class(nndf$class)
# view the dataframe to ensure one hot encoding is correct
summary(nndf)
# randomly sample rows for tt split
train_idx <- sample(1:nrow(nndf), 0.8 * nrow(nndf))
test_idx <- setdiff(1:nrow(nndf), train_idx)
# prepare training set and corresponding labels
train <- nndf[train_idx,]
# prepare testing set and corresponding labels
X_test <- nndf[test_idx,]
y_test <- nndf[test_idx, "class"]
# create model with a single hidden layer containing 500 neurons
model <- nnet(nndf$class~., train, maxit=150, size=10)
# prediction
X_pred <- predict(train, type="raw")
解决方案
假设
数据集中的所有变量(nndf)都是分类的。
脚步
- 将除响应变量(即类)之外的所有变量转换为单热编码(即 0,1 格式)
one_hot方法
one_hot_df <- one_hot(nndf[, -13]) # 13 is the index of `class` variable.
模型.矩阵方法
model_mat_df <- model.matrix( ~ . - 1, nndf[, -13])
转换
class
为因子并将其添加到上述 dfs.class <- as.factor(nndf$class)
final_df <- cbind(model_mat_df, class)
拆分
final_df
为训练和测试并在模型中使用。nnet(class~., train, maxit=150, size=10)
推荐阅读
- html - 如何在滚动事件上进行整个 div 滚动?
- php - 填充从 JSON 到 PHP 的下拉列表
- spring - 获取 Spring Broker Relay 内部使用的 stomp 客户端
- javascript - 循环显示帮助命令
- php - 输入类型日期不显示返回日期
- python - 一个范围内的自定义准确度指标,用于回归
- amazon-cloudwatch - 为什么在 aws cloudwatch 上使用 sumologic?
- session - 构建项目后在 ASP.NET Core 中保持会话
- php - 动态准备语句 Readymade 函数,只准备一次语句
- react-native - 如何获取 React Native 中 Text 组件的行数?