기본 콘텐츠로 건너뛰기

R을 이용해 간단한 신경망 만들기 (10)





 이제 가장 앞에서 했던 예제를 이용해서 nnet과 neuralnet의 성능을 다시 비교해보겠습니다. 결과가 몇 가지 카테고리로 나눠지는 분류형 작업에서는 nnet이 나은 성능을 보여줬습니다. 가격처럼 연속 변수를 추정하는데는 어느 쪽이 더 나은지 아직 비교를 하지 않았습니다. diamond 데이터에서 1000개를 뽑아 900개를 훈련 데이터로, 100개를 테스트 데이터로 삼고 비교를 해보겠습니다. 이번에는 scale을 사용해서 가격과 캐럿을 정규화시켜 같은 데이터를 두 인공지능 신경망 패키지에 넣습니다.


library("ggplot2")
library("neuralnet")
library(Metrics)
library(nnet)

diamonds$cut2[diamonds$cut=="Fair"]=0
diamonds$cut2[diamonds$cut=="Good"]=1
diamonds$cut2[diamonds$cut=="Very Good"]=2
diamonds$cut2[diamonds$cut=="Premium"]=3
diamonds$cut2[diamonds$cut=="Ideal"]=4

diamonds$color2[diamonds$color=="D"]=0
diamonds$color2[diamonds$color=="E"]=1
diamonds$color2[diamonds$color=="F"]=2
diamonds$color2[diamonds$color=="G"]=3
diamonds$color2[diamonds$color=="H"]=4
diamonds$color2[diamonds$color=="I"]=5
diamonds$color2[diamonds$color=="J"]=6

diamonds1<-diamonds c="" carat="" color2="" cut2="" price="" span="">
diamonds1$price2=scale(diamonds1$price)
diamonds1$carat2=scale(diamonds1$carat)

set.seed(1234)
diamonds2<-sample 1000="" diamonds1="" nrow="" replace="FALSE)</span">
diamonds2<-diamonds1 diamonds2="" span="">

set.seed(1234)

n = nrow(diamonds2)
train <- 900="" n="" sample="" span="">
test <- diamonds2="" span="" train="">
train <- diamonds2="" span="" train="">


 neuralnet은 3:3:3구성으로 신경망을 구성합니다. 


f<-price2 carat2="" color2="" cut2="" span="">

fit<-neuralnet f="" span="">
               data=train, 
               hidden=c(3,3,3),
               algorithm = "rprop+",
               err.fct = "sse",
               act.fct = "logistic",
               threshold = 0.1,
               stepmax=1e7,
               linear.output = TRUE)

pred<-compute c="" carat2="" color2="" cut2="" fit="" span="" test="">
result1<-cbind net="" pred="" span="" test="">
result1$price3=pred$net*sd(train$price)+mean(train$price)
result1[,c("price","price3")]

result1$price4=result1$price-result1$price3
mean(result1$price4);sd(result1$price4)


결과는 아래와 같습니다. 



> result1[,c("price","price3")]
    price        price3
1    5676  7158.4385300
2     878   719.8074114
3     829   831.3749722
4   15428 16547.6083877
5     421   694.0573474
6    1698  1324.2573993
7    2861  3542.3685795
8     658   895.0632051
9    8974  8354.0780604
10   9189  9101.1099778
11    492   918.1250754
12   6048  7087.4086483
13  15485 16419.7049268
14  16532 16059.2629705
15   3612  2505.1566194
16   8640  6620.4990300
17   3494  1688.2556233
18   1013   469.0950248
19   1659  1774.9824311
20    612   544.2927174
21   6053  6893.3466775
22   2205  1158.6017509
23  16733 16672.5136981
24   1380  1875.1675574
25   1125   895.0632051
26  15783 16566.4267716
27   5747  5396.3075564
28    723   943.2778839
29    657   800.9945224
30  12791 12190.2612976
31   7378  5750.2767065
32    624   515.8404538
33   2990  1541.3452801
34  10076 11068.4254156
35   1063   989.5016278
36  15312 14097.2092245
37   7119  5701.8445957
38  10316  7421.3986817
39   7340  8506.6367291
40    942   910.5026958
41    828   752.6034797
42   3625  4378.5422048
43    790   905.1833696
44    923   743.4189138
45    787   762.4159732
46   1608  1777.7261808
47   8075  8632.3751287
48   1289  1606.2536315
49   2671  2755.4297627
50   2578  2475.9034934
51   3337  3962.7829507
52    905   798.0972265
53   3348  4007.1614974
54    561   544.2927174
55    545   719.8074114
56    774  1052.5556643
57   4066  3878.7743141
58  10913 16508.5906138
59   4939  5732.4468281
60   9240 13285.0456263
61   5622  6214.4863908
62  12150  8228.7889543
63   5607  5038.2854738
64   2265  2475.9034934
65   1624  1405.7177625
66   6271  5841.0145488
67    680   910.5026958
68  15079 12292.4224548
69  13196 13324.3064177
70   2441  2799.6964773
71   2401  1800.0705063
72  16100 15529.9506136
73   2525  2558.6185463
74   2096  2599.6071408
75   1082  1112.0117404
76    802   806.3563402
77    817   644.6212505
78   4482  2762.6028638
79    526   355.0189879
80    421   752.6034797
81   8403  7137.2076733
82   3892  4617.0757212
83   2010  1606.2536315
84    685   868.5866515
85   2012  1311.4712970
86   3644  4988.1585407
87  17153 15026.2835178
88    850   998.2275551
89   3972  3280.0532132
90  12339 13465.4731286
91    759   807.9683077
92    696   547.3506904
93   8774  7059.1140595
94   3183  2951.0382289
95   2591  2477.5763848
96    945   584.3414026
97   5292  5732.4468281
98   1298  2565.5735340
99    889   735.2652309
100  3796  4450.8771871
> result1$price4=result1$price-result1$price3
> mean(result1$price4);sd(result1$price4)
[1] 46.3577482
[1] 1158.710832


 그럭저럭 추정을 하기는 하는데, 가격이 평균 46달러 정도 차이가 있습니다. nnet에서는 maxit를 기본값으로 하면 결과를 찾지 못하기 때문에 500을 주고 노드는 5개로 했습니다. 


nn <- carat2="" color2="" cut2="" data="train," decay="5e-4," maxit="500) </span" nnet="" price2="" size="5,">
nn
price3<-predict nn="" span="" test="">
result2=cbind(test,price3)
result2

result2$price4=result2$price3*sd(train$price)+mean(train$price)
result2[,c("price","price4")]

result2$price5=result2$price-result2$price4
mean(result2$price5);sd(result2$price5)


 결과를 보면 상당히 차이가 큽니다. 


> result2$price4=result2$price3*sd(train$price)+mean(train$price)
> result2[,c("price","price4")]
    price      price4
1    5676 7672.007437
2     878 3894.393333
3     829 3894.393333
4   15428 7931.338301
5     421 3894.393333
6    1698 3894.393333
7    2861 3894.536388
8     658 3894.393333
9    8974 7916.883643
10   9189 7926.028269
11    492 3894.397454
12   6048 6569.112058
13  15485 7931.338288
14  16532 7931.338296
15   3612 3894.393333
16   8640 7898.185086
17   3494 3894.393333
18   1013 3894.393333
19   1659 3894.393333
20    612 3894.393333
21   6053 7930.365201
22   2205 3894.393333
23  16733 7931.338227
24   1380 3894.473040
25   1125 3894.393333
26  15783 7931.338301
27   5747 5179.993313
28    723 3894.393333
29    657 3894.396359
30  12791 7931.329113
31   7378 7007.191522
32    624 3894.394989
33   2990 3894.400044
34  10076 7931.333821
35   1063 3894.393333
36  15312 7931.338208
37   7119 5800.351948
38  10316 7929.702124
39   7340 7931.070966
40    942 3894.393333
41    828 3894.393333
42   3625 3897.432456
43    790 3894.445754
44    923 3894.393333
45    787 3894.393333
46   1608 3894.393333
47   8075 7927.931554
48   1289 3894.393333
49   2671 3894.393333
50   2578 3894.393333
51   3337 3950.021059
52    905 3894.393333
53   3348 4029.696071
54    561 3894.393333
55    545 3894.393333
56    774 3894.393333
57   4066 3894.681967
58  10913 7931.338299
59   4939 5429.746341
60   9240 7931.335309
61   5622 6141.245167
62  12150 7179.328294
63   5607 5098.811431
64   2265 3894.393333
65   1624 3894.393333
66   6271 6255.388441
67    680 3894.393333
68  15079 7931.334046
69  13196 7926.575540
70   2441 3894.393333
71   2401 3894.393333
72  16100 7931.338239
73   2525 3894.473636
74   2096 3894.393333
75   1082 3894.393333
76    802 3894.393333
77    817 3894.393333
78   4482 3894.395153
79    526 3894.393333
80    421 3894.393333
81   8403 7930.851183
82   3892 4846.138573
83   2010 3894.393333
84    685 3894.397274
85   2012 3894.393333
86   3644 3897.736542
87  17153 7931.337662
88    850 3894.399397
89   3972 3894.473520
90  12339 7931.337700
91    759 3894.393333
92    696 3894.393333
93   8774 7916.076486
94   3183 3894.399407
95   2591 3894.395289
96    945 3894.393333
97   5292 5429.746341
98   1298 3894.393333
99    889 3894.393333
100  3796 4021.678458
> result2$price5=result2$price-result2$price4
> mean(result2$price5);sd(result2$price5)
[1] -407.1997565
[1] 3325.384675




 이것만 보면 하나의 신경망 층만 만드는 nnet 보다 여러 개의 층을 만들 수 있는 neuralnet이 더 좋은 선택인 것 같습니다. 물론 이는 학습하고자하는 자료나 알고리즘에 따라 크게 차이가 있을 수 있어 어느 쪽이 더 좋다고 단순하게 말할 순 없습니다. 하지만 하나의 패키지로 만족할만한 결과를 얻지 못했을 때 몇 가지 패키지의 사용법을 알고 있다면 가장 좋은 성능을 내는 패키지를 사용할 수 있다는 장점이 있습니다. 앞으로 몇 가지 패키지를 더 알아보겠습니다. 

댓글

이 블로그의 인기 게시물

세상에서 가장 큰 벌

( Wallace's giant bee, the largest known bee species in the world, is four times larger than a European honeybee(Credit: Clay Bolt) ) (Photographer Clay Bolt snaps some of the first-ever shots of Wallace's giant bee in the wild(Credit: Simon Robson)  월리스의 거대 벌 (Wallace’s giant bee)로 알려진 Megachile pluto는 매우 거대한 인도네시아 벌로 세상에서 가장 거대한 말벌과도 경쟁할 수 있는 크기를 지니고 있습니다. 암컷의 경우 몸길이 3.8cm, 날개너비 6.35cm으로 알려진 벌 가운데 가장 거대하지만 수컷의 경우 이보다 작아서 몸길이가 2.3cm 정도입니다. 아무튼 일반 꿀벌의 4배가 넘는 몸길이를 지닌 거대 벌이라고 할 수 있습니다.   메가칠레는 1981년 몇 개의 표본이 발견된 이후 지금까지 추가 발견이 되지 않아 멸종되었다고 보는 과학자들도 있었습니다. 2018년에 eBay에 표본이 나왔지만, 언제 잡힌 것인지는 알 수 없었습니다. 사실 이 벌은 1858년 처음 발견된 이후 1981년에야 다시 발견되었을 만큼 찾기 어려운 희귀종입니다. 그런데 시드니 대학과 국제 야생 동물 보호 협회 (Global Wildlife Conservation)의 연구팀이 오랜 수색 끝에 2019년 인도네시아의 오지에서 메가칠레 암컷을 야생 상태에서 발견하는데 성공했습니다.   메가칠레 암컷은 특이하게도 살아있는 흰개미 둥지가 있는 나무에 둥지를 만들고 살아갑니다. 이들의 거대한 턱은 나무의 수지를 모아 둥지를 짓는데 유리합니다. 하지만 워낙 희귀종이라 이들의 생태에 대해서는 거의 알려진 바가 없습니다.  (동영상)...

몸에 철이 많으면 조기 사망 위험도가 높다?

 철분은 인체에 반드시 필요한 미량 원소입니다. 헤모글로빈에 필수적인 물질이기 때문에 철분 부족은 흔히 빈혈을 부르며 반대로 피를 자꾸 잃는 경우에는 철분 부족 현상이 발생합니다. 하지만 철분 수치가 높다는 것은 반드시 좋은 의미는 아닙니다. 모든 일에는 적당한 수준이 있게 마련이고 철 역시 너무 많으면 여러 가지 질병을 일으킬 수 있습니다. 철 대사에 문제가 생겨 철이 과다하게 축적되는 혈색소증 ( haemochromatosis ) 같은 드문 경우가 아니라도 과도한 철분 섭취나 수혈로 인한 철분 과잉은 건강에 문제를 일으킬 수 있습니다. 하지만 높은 철 농도가 수명에 미치는 영향에 대해서는 잘 알려지지 않았습니다.   하버드 대학의 이야스 다글라스( Iyas Daghlas )와 임페리얼 칼리지 런던의 데펜더 길 ( Dipender Gill )은 체내 철 함유량에 영향을 미치는 유전적 변이와 수명의 관계를 조사했습니다. 연구팀은 48972명의 유전 정보와 혈중 철분 농도, 그리고 기대 수명의 60/90%에서 생존 확률을 조사했습니다. 그 결과 유전자로 예측한 혈중 철분 농도가 증가할수록 오래 생존할 가능성이 낮은 것으로 나타났습니다. 이것이 유전자 자체 때문인지 아니면 높은 혈중/체내 철 농도 때문인지는 명확하지 않지만, 높은 혈중 철 농도가 꼭 좋은 뜻이 아니라는 것을 시사하는 결과입니다.   연구팀은 이 데이터를 근거로 건강한 사람이 영양제나 종합 비타민제를 통해 과도한 철분을 섭취할 이유는 없다고 주장했습니다. 어쩌면 높은 철 농도가 조기 사망 위험도를 높일지도 모르기 때문입니다. 그러나 임산부나 빈혈 환자 등 진짜 철분이 필요한 사람들까지 철분 섭취를 꺼릴 필요가 없다는 점도 강조했습니다. 연구 내용은 정상보다 높은 혈중 철농도가 오래 유지되는 경우를 가정한 것으로 본래 철분 부족이 있는 사람을 대상으로 한 것이 아니기 때문입니다. 낮은 철분 농도와 빈혈이 건강에 미치는 악영향은 이미 잘 알려져 있기 때문에 철...

사막에서 식물을 재배하는 온실 Ecodome

 지구 기후가 변해가면서 일부 지역에서는 비가 더 많이 내리지만 반대로 비가 적게 내리는 지역도 생기고 있습니다. 일부 아프리카 개도국에서는 이에 더해서 인구 증가로 인해 식량과 물이 모두 크게 부족한 현상이 지속되고 있습니다. 이를 해결하기 위한 여러 가지 아이디어들이 나오고 있는데, 그 중 하나가 사막 온실입니다.   사막에 온실을 건설한다는 아이디어는 이상해 보이지만, 실제로는 다양한 사막 온실이 식물재배를 위해서 시도되고 있습니다. 사막 온실의 아이디어는 낮과 밤의 일교차가 큰 사막 환경에서 작물을 재배함과 동시에 물이 증발해서 사라지는 것을 막는데 그 중요한 이유가 있습니다.   사막화가 진행 중인 에티오피아의 곤다르 대학( University of Gondar's Faculty of Agriculture )의 연구자들은 사막 온실과 이슬을 모으는 장치를 결합한 독특한 사막 온실을 공개했습니다. 이들은 이를 에코돔( Ecodome )이라고 명명했는데, 아직 프로토타입을 건설한 것은 아니지만 그 컨셉을 공개하고 개발에 착수했다고 합니다.   원리는 간단합니다. 사막에 건설된 온실안에서 작물을 키움니다. 이 작물은 광합성을 하면서 수증기를 밖으로 내보네게 되지만, 온실 때문에 이 수증기를 달아나지 못하고 갖히게 됩니다. 밤이 되면 이 수증기는 다시 응결됩니다. 그리고 동시에 에코돔의 가장 위에 있는 부분이 열리면서 여기로 찬 공기가 들어와 외부 공기에 있는 수증기가 응결되어 에코돔 내부로 들어옵니다. 그렇게 얻은 물은 식수는 물론 식물 재배 모두에 사용 가능합니다.  (에코돔의 컨셉.  출처 : Roots Up)   (동영상)   이 컨셉은 마치 사막 온실과 이슬을 모으는 담수 장치를 합쳐놓은 것이라고 말할 수 있습니다. 물론 실제로도 잘 작동할지는 직접 테스트를 해봐야 알 수...