[R - ml]神经网络

神经网络 对鸢尾花进行分类

iris

require(neuralnet)
require(caret)
# 准备数据
data(iris)
inTrain = createDataPartition(y = iris$Species, p = 0.8, list = F)
iris.train = iris[inTrain, ]
iris.test = iris[-inTrain, ]
# 需要分别构建3个dummy变量
iris.train = cbind(iris.train, iris.train$Species=='setosa')
iris.train = cbind(iris.train, iris.train$Species=='versicolor')
iris.train = cbind(iris.train, iris.train$Species=='virginica')

names(iris.train)[6] = 'setosa'
names(iris.train)[7] = 'versicolor'
names(iris.train)[8] = 'virginica'

# 讲这3列作为预测对象,使用3层
nn = neuralnet(setosa + versicolor + virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
               data = iris.train, hidden = c(3))

plot(nn)

# 计算出的是概率
mypredict = compute(nn, iris.test[-5])$net.result
head(mypredict)

# 需要写一个函数,来找出概率最大的是哪个
maxidx = function(arr) {
  return(which(arr == max(arr)))  # 返回每行最大的数是第几列
}

idx = apply(mypredict, 1, maxidx) # 1 表示对行进行操作

# 映射到对应的species
predict.species = c('setosa', 'versicolor', 'virginica')
prediction = predict.species[idx]
table(prediction, iris.test$Species)

混凝土压力强度

数据准备

混凝土强度数据

concrete = read.csv('E:/rpath/Concrete_Data.csv')
str(concrete)
names(concrete) = c('Cement', 'Slag', 'Ash', 'Water', 'Superplasticizer', 'CoarseAgg', 'FineAgg', 'Age', 'strength')
summary(concrete)

通过 summary 我们看到各个特征的数据范围不同,差异很大,因此我们对数据进行标准化处理

normalize = function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}
concrete_norm = as.data.frame(lapply(concrete, normalize))
summary(concrete$strength)
summary(concrete_norm$strength)
set.seed(2014)
inTrain = createDataPartition(y = concrete_norm$strength, p = 0.8, list = F)
concrete_train = concrete_norm[inTrain, ]
concrete_test = concrete_norm[-inTrain, ]

建立模型

concrete_model = neuralnet(strength ~ Cement + Slag + Ash + Water +
                             Superplasticizer + CoarseAgg + FineAgg + Age,
                           data = concrete_train, hidden = 5)
plot(concrete_model)

模型评估

model_results <- compute(concrete_model, concrete_test[1:8])
predicted_strength <- model_results$net.result
cor(predicted_strength, concrete_test$strength)

神经网络没有使用predict函数,而是使用compute函数,
使用帮助参考?compute,
comcrete_test[1:8]为前面构建模型用到的8个covariate。
从以上输出我们看出预测的数据与实际的数据相关性是0.83.
当然MAE评估可能更恰当

MAE <- function(actual, predicted) {
  mean(abs(actual - predicted))
}

MAE(concrete_test$strength, predicted_strength)

# MAE 0.08656618178 # hidden = 1
# MAE 0.05479880408 # hidden = 5

五个第二层的MAE 比一个第二层的MAE降低了很多

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容