美文网首页
[R - ml]神经网络

[R - ml]神经网络

作者: XuXiaolu | 来源:发表于2018-11-26 17:46 被阅读4次

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

    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降低了很多

    相关文章

      网友评论

          本文标题:[R - ml]神经网络

          本文链接:https://www.haomeiwen.com/subject/rytiqqtx.html