导语:在 R 语言中构建神经网络模型主要有两种主流方式:使用经典的 nnet 包和使用更强大灵活的 keras + tensorflow 框架。
适合快速上手简单任务
nnet (Feed-Forward Neural Networks) 是 R 内置 stats 套件的一部分,非常适合创建单隐藏层的前馈神经网络。它简单、轻量,但对于复杂的深度学习任务能力有限。
# 1.安装和加载包# 安装(如果尚未安装)# install.packages("nnet")# 加载包library(nnet)# 2.准备数据我们使用经典的鸢尾花(iris)数据集作为示例。我们需要将因子型的目标变量进行独热编码(One-Hot Encoding),nnet 的 class.ind 函数可以很方便地完成这件事。同时,将数据划分为训练集和测试集。# 移除setosa种类,使问题变为二分类(简化示例)iris_sub <- iris[iris$Species != "setosa", ]iris_sub$Species <- factor(iris_sub$Species) # 移除未使用的因子水平# 独热编码目标变量# class.ind 会为每个类别创建一个二进制列target <- class.ind(iris_sub$Species)# 将特征数据标准化(重要:能显著提高神经网络性能)features <- scale(iris_sub[, 1:4])# 划分训练集和测试集 (70% 训练, 30% 测试)set.seed(123) # 确保结果可重现sample_index <- sample(1:nrow(iris_sub), nrow(iris_sub) * 0.7)train_features <- features[sample_index, ]test_features <- features[-sample_index, ]train_target <- target[sample_index, ]test_target <- target[-sample_index, ]
训练模型
使用 nnet() 函数。关键参数:
x: 特征矩阵y: 目标矩阵(独热编码后的)size: 隐藏层中的神经元数量(需要调试的超参数)softmax: 对于分类问题,设置为TRUE使用 softmax 输出激活函数maxit: 最大迭代次数decay: 权重衰减(L2正则化)参数,防止过拟合
# 训练神经网络模型nn_model <- nnet(x = train_features,y = train_target,size = 4, # 隐藏层神经元个数softmax = TRUE, # 用于多分类maxit = 200, # 最大迭代次数decay = 1e-4) # 权重衰减#4. 模型预测与评估# 对测试集进行预测,得到每个类别的概率predictions_prob <- predict(nn_model, test_features, type = "raw")# 取概率最大的类别作为最终预测结果predicted_class <- colnames(predictions_prob)[apply(predictions_prob, 1, which.max)]true_class <- iris_sub$Species[-sample_index]# 创建混淆矩阵confusion_matrix <- table(Predicted = predicted_class, Actual = true_class)print(confusion_matrix)# 计算准确率accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)print(paste("准确率:", round(accuracy, 4)))
适合复杂和深度学习项目
这是目前 R 中进行严肃的机器学习项目的推荐方式。keras 是一个高级 API,其后端可以是 TensorFlow, Theano 或 CNTK。在 R 中,我们通过 keras 包来调用 TensorFlow。
#1.安装和加载环境# 安装 keras 库并配置 TensorFlow 后端install.packages("keras")library(keras)# 以下命令会自动安装 Python 版的 TensorFlow 和 Kerasinstall_keras() # 只需运行一次#2.准备数据data(iris)iris_sub <- iris[iris$Species != "setosa", ]iris_sub$Species <- factor(iris_sub$Species)# 将因子标签转换为整数索引(0 和 1)# 注意:keras 需要从 0 开始的索引labels <- as.integer(iris_sub$Species) - 2 # virginica=1, versicolor=0# 将特征数据转换为矩阵并标准化features <- scale(as.matrix(iris_sub[, 1:4]))# 划分训练集和测试集set.seed(123)sample_index <- sample(1:nrow(features), size = nrow(features) * 0.7)x_train <- features[sample_index, ]x_test <- features[-sample_index, ]y_train <- labels[sample_index]y_test <- labels[-sample_index]# 对标签进行独热编码(另一种方式,Keras 也接受整数标签+ sparse_categorical_crossentropy)y_train_categorical <- to_categorical(y_train, num_classes = 2)y_test_categorical <- to_categorical(y_test, num_classes = 2)
#3.定义模型结构使用# keras_model_sequential() 并按顺序堆叠层 (layer_dense)。model <- keras_model_sequential() %>%# 第一隐藏层:需要指定输入维度 input_shape(仅在第一层指定)layer_dense(units = 16, activation = 'relu', input_shape = c(4)) %>%layer_dropout(rate = 0.2) %>% # 丢弃层,随机丢弃20%神经元防止过拟合# 第二隐藏层layer_dense(units = 8, activation = 'relu') %>%# 输出层:二分类问题,所以用2个神经元 + softmax激活函数layer_dense(units = 2, activation = 'softmax')# 查看模型结构summary(model)
#4.编译模型指定优化器、损失函数和评估指标。model %>% compile(loss = 'categorical_crossentropy', # 多分类交叉熵损失optimizer = optimizer_adam(learning_rate = 0.001), # Adam 优化器metrics = c('accuracy') # 监控准确率)#5.训练模型使用 fit() 函数。history <- model %>% fit(x_train, y_train_categorical,epochs = 100, # 在整个训练集上训练多少轮batch_size = 8, # 每个梯度更新使用的样本数validation_split = 0.2 # 从训练集中拿出20%作为验证集)# 绘制训练过程(损失和准确率的变化)plot(history)#6.评估与预测# 在测试集上评估模型性能score <- model %>% evaluate(x_test, y_test_categorical)print(paste('测试集损失:', score$loss))print(paste('测试集准确率:', score$acc))# 对测试集进行预测predictions <- model %>% predict(x_test) %>% k_argmax() %>% as.numeric()# k_argmax() 取概率最大的索引,然后转换为数值向量# 将预测的索引转换回类别名pred_classes <- levels(iris_sub$Species)[predictions + 2] # 因为之前减了2# 混淆矩阵table(Predicted = pred_classes, Actual = iris_sub$Species[-sample_index])
在 R 语言中实施机器学习神经网络主要有两种策略,各有其适用的场景。
1. 经典轻量之选 (nnet 包):
其核心优势在于简单易用和开箱即用。作为 R 的基础扩展包,它无需复杂环境配置,通过 nnet() 函数即可快速构建单隐藏层网络,非常适合初学者理解神经网络基础或处理小规模的简单分类与回归任务。然而,其功能也仅限于此,缺乏构建复杂模型架构的能力。
2. 现代强大之选 (keras + tensorflow 框架):
这是当前处理严肃机器学习项目的主流和推荐方案。虽然需要配置 Python 环境,但它提供了一个极其灵活、强大的高级接口。你可以自由地堆叠深度网络层(如 CNN、RNN),轻松使用 GPU 加速,并利用丰富的预训练模型和社区资源。无论是复杂的研究还是生产环境部署,Keras 框架都能提供工业级的性能和灵活性。
总结来说,您的选择取决于任务需求:若追求快速上手和实现简单模型,可从 nnet 入门;若旨在解决复杂问题或进行深度学习,则必须掌握 keras 与 tensorflow 这一强大组合。

