神经网络 对鸢尾花进行分类
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降低了很多