library(nnet)
## Warning: package 'nnet' was built under R version 3.0.3
m <- nnet(Species ~ ., data = iris, size = 3)
## # weights: 27
## initial value 169.013828
## iter 10 value 69.314718
## iter 10 value 69.314718
## iter 10 value 69.314718
## final value 69.314718
## converged
predict(m, newdata = iris)
## setosa versicolor virginica
## 1 1.000e+00 1.119e-21 1.554e-24
## 2 1.000e+00 1.119e-21 1.554e-24
## 3 1.000e+00 1.119e-21 1.554e-24
## 4 1.000e+00 1.119e-21 1.554e-24
## 5 1.000e+00 1.119e-21 1.554e-24
## 6 1.000e+00 1.119e-21 1.554e-24
## 7 1.000e+00 1.119e-21 1.554e-24
## 8 1.000e+00 1.119e-21 1.554e-24
## 9 1.000e+00 1.119e-21 1.554e-24
## 10 1.000e+00 1.119e-21 1.554e-24
## 11 1.000e+00 1.119e-21 1.554e-24
## 12 1.000e+00 1.119e-21 1.554e-24
## 13 1.000e+00 1.119e-21 1.554e-24
## 14 1.000e+00 1.119e-21 1.554e-24
## 15 1.000e+00 1.119e-21 1.554e-24
## 16 1.000e+00 1.119e-21 1.554e-24
## 17 1.000e+00 1.119e-21 1.554e-24
## 18 1.000e+00 1.119e-21 1.554e-24
## 19 1.000e+00 1.119e-21 1.554e-24
## 20 1.000e+00 1.119e-21 1.554e-24
## 21 1.000e+00 1.119e-21 1.554e-24
## 22 1.000e+00 1.119e-21 1.554e-24
## 23 1.000e+00 1.119e-21 1.554e-24
## 24 1.000e+00 1.119e-21 1.554e-24
## 25 1.000e+00 1.119e-21 1.554e-24
## 26 1.000e+00 1.119e-21 1.554e-24
## 27 1.000e+00 1.119e-21 1.554e-24
## 28 1.000e+00 1.119e-21 1.554e-24
## 29 1.000e+00 1.119e-21 1.554e-24
## 30 1.000e+00 1.119e-21 1.554e-24
## 31 1.000e+00 1.119e-21 1.554e-24
## 32 1.000e+00 1.119e-21 1.554e-24
## 33 1.000e+00 1.119e-21 1.554e-24
## 34 1.000e+00 1.119e-21 1.554e-24
## 35 1.000e+00 1.119e-21 1.554e-24
## 36 1.000e+00 1.119e-21 1.554e-24
## 37 1.000e+00 1.119e-21 1.554e-24
## 38 1.000e+00 1.119e-21 1.554e-24
## 39 1.000e+00 1.119e-21 1.554e-24
## 40 1.000e+00 1.119e-21 1.554e-24
## 41 1.000e+00 1.119e-21 1.554e-24
## 42 1.000e+00 1.119e-21 1.554e-24
## 43 1.000e+00 1.119e-21 1.554e-24
## 44 1.000e+00 1.119e-21 1.554e-24
## 45 1.000e+00 1.119e-21 1.554e-24
## 46 1.000e+00 1.119e-21 1.554e-24
## 47 1.000e+00 1.119e-21 1.554e-24
## 48 1.000e+00 1.119e-21 1.554e-24
## 49 1.000e+00 1.119e-21 1.554e-24
## 50 1.000e+00 1.119e-21 1.554e-24
## 51 7.126e-17 5.000e-01 5.000e-01
## 52 7.126e-17 5.000e-01 5.000e-01
## 53 7.126e-17 5.000e-01 5.000e-01
## 54 7.126e-17 5.000e-01 5.000e-01
## 55 7.126e-17 5.000e-01 5.000e-01
## 56 7.126e-17 5.000e-01 5.000e-01
## 57 7.126e-17 5.000e-01 5.000e-01
## 58 7.126e-17 5.000e-01 5.000e-01
## 59 7.126e-17 5.000e-01 5.000e-01
## 60 7.126e-17 5.000e-01 5.000e-01
## 61 7.126e-17 5.000e-01 5.000e-01
## 62 7.126e-17 5.000e-01 5.000e-01
## 63 7.126e-17 5.000e-01 5.000e-01
## 64 7.126e-17 5.000e-01 5.000e-01
## 65 7.126e-17 5.000e-01 5.000e-01
## 66 7.126e-17 5.000e-01 5.000e-01
## 67 7.126e-17 5.000e-01 5.000e-01
## 68 7.126e-17 5.000e-01 5.000e-01
## 69 7.126e-17 5.000e-01 5.000e-01
## 70 7.126e-17 5.000e-01 5.000e-01
## 71 7.126e-17 5.000e-01 5.000e-01
## 72 7.126e-17 5.000e-01 5.000e-01
## 73 7.126e-17 5.000e-01 5.000e-01
## 74 7.126e-17 5.000e-01 5.000e-01
## 75 7.126e-17 5.000e-01 5.000e-01
## 76 7.126e-17 5.000e-01 5.000e-01
## 77 7.126e-17 5.000e-01 5.000e-01
## 78 7.126e-17 5.000e-01 5.000e-01
## 79 7.126e-17 5.000e-01 5.000e-01
## 80 7.126e-17 5.000e-01 5.000e-01
## 81 7.126e-17 5.000e-01 5.000e-01
## 82 7.126e-17 5.000e-01 5.000e-01
## 83 7.126e-17 5.000e-01 5.000e-01
## 84 7.126e-17 5.000e-01 5.000e-01
## 85 7.126e-17 5.000e-01 5.000e-01
## 86 7.126e-17 5.000e-01 5.000e-01
## 87 7.126e-17 5.000e-01 5.000e-01
## 88 7.126e-17 5.000e-01 5.000e-01
## 89 7.126e-17 5.000e-01 5.000e-01
## 90 7.126e-17 5.000e-01 5.000e-01
## 91 7.126e-17 5.000e-01 5.000e-01
## 92 7.126e-17 5.000e-01 5.000e-01
## 93 7.126e-17 5.000e-01 5.000e-01
## 94 7.126e-17 5.000e-01 5.000e-01
## 95 7.126e-17 5.000e-01 5.000e-01
## 96 7.126e-17 5.000e-01 5.000e-01
## 97 7.126e-17 5.000e-01 5.000e-01
## 98 7.126e-17 5.000e-01 5.000e-01
## 99 7.126e-17 5.000e-01 5.000e-01
## 100 7.126e-17 5.000e-01 5.000e-01
## 101 7.126e-17 5.000e-01 5.000e-01
## 102 7.126e-17 5.000e-01 5.000e-01
## 103 7.126e-17 5.000e-01 5.000e-01
## 104 7.126e-17 5.000e-01 5.000e-01
## 105 7.126e-17 5.000e-01 5.000e-01
## 106 7.126e-17 5.000e-01 5.000e-01
## 107 7.126e-17 5.000e-01 5.000e-01
## 108 7.126e-17 5.000e-01 5.000e-01
## 109 7.126e-17 5.000e-01 5.000e-01
## 110 7.126e-17 5.000e-01 5.000e-01
## 111 7.126e-17 5.000e-01 5.000e-01
## 112 7.126e-17 5.000e-01 5.000e-01
## 113 7.126e-17 5.000e-01 5.000e-01
## 114 7.126e-17 5.000e-01 5.000e-01
## 115 7.126e-17 5.000e-01 5.000e-01
## 116 7.126e-17 5.000e-01 5.000e-01
## 117 7.126e-17 5.000e-01 5.000e-01
## 118 7.126e-17 5.000e-01 5.000e-01
## 119 7.126e-17 5.000e-01 5.000e-01
## 120 7.126e-17 5.000e-01 5.000e-01
## 121 7.126e-17 5.000e-01 5.000e-01
## 122 7.126e-17 5.000e-01 5.000e-01
## 123 7.126e-17 5.000e-01 5.000e-01
## 124 7.126e-17 5.000e-01 5.000e-01
## 125 7.126e-17 5.000e-01 5.000e-01
## 126 7.126e-17 5.000e-01 5.000e-01
## 127 7.126e-17 5.000e-01 5.000e-01
## 128 7.126e-17 5.000e-01 5.000e-01
## 129 7.126e-17 5.000e-01 5.000e-01
## 130 7.126e-17 5.000e-01 5.000e-01
## 131 7.126e-17 5.000e-01 5.000e-01
## 132 7.126e-17 5.000e-01 5.000e-01
## 133 7.126e-17 5.000e-01 5.000e-01
## 134 7.126e-17 5.000e-01 5.000e-01
## 135 7.126e-17 5.000e-01 5.000e-01
## 136 7.126e-17 5.000e-01 5.000e-01
## 137 7.126e-17 5.000e-01 5.000e-01
## 138 7.126e-17 5.000e-01 5.000e-01
## 139 7.126e-17 5.000e-01 5.000e-01
## 140 7.126e-17 5.000e-01 5.000e-01
## 141 7.126e-17 5.000e-01 5.000e-01
## 142 7.126e-17 5.000e-01 5.000e-01
## 143 7.126e-17 5.000e-01 5.000e-01
## 144 7.126e-17 5.000e-01 5.000e-01
## 145 7.126e-17 5.000e-01 5.000e-01
## 146 7.126e-17 5.000e-01 5.000e-01
## 147 7.126e-17 5.000e-01 5.000e-01
## 148 7.126e-17 5.000e-01 5.000e-01
## 149 7.126e-17 5.000e-01 5.000e-01
## 150 7.126e-17 5.000e-01 5.000e-01
nnet패키지는 앞서 다항로지스틱회귀분석에서 multinom()함수를 사용하기 위한 패키지이기도 하다.
만약 모델로부터 예측된 분류를 얻고자 한다면 type=“class"를 지정한다.
predicted <- predict(m, newdata = iris, type = "class")
acc <- sum(predicted == iris$Species)/NROW(predicted)
acc
## [1] 0.7
예측의 정확도도 측정해 보았다. 뭐가 다른지 눈으로 보려면 다음과 같이 한다.
cbind(iris, predicted)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 11 5.4 3.7 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 57 6.3 3.3 4.7 1.6 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 59 6.6 2.9 4.6 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 61 5.0 2.0 3.5 1.0 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 80 5.7 2.6 3.5 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 86 6.0 3.4 4.5 1.6 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 104 6.3 2.9 5.6 1.8 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 107 4.9 2.5 4.5 1.7 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 110 7.2 3.6 6.1 2.5 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 120 6.0 2.2 5.0 1.5 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 138 6.4 3.1 5.5 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
## predicted
## 1 setosa
## 2 setosa
## 3 setosa
## 4 setosa
## 5 setosa
## 6 setosa
## 7 setosa
## 8 setosa
## 9 setosa
## 10 setosa
## 11 setosa
## 12 setosa
## 13 setosa
## 14 setosa
## 15 setosa
## 16 setosa
## 17 setosa
## 18 setosa
## 19 setosa
## 20 setosa
## 21 setosa
## 22 setosa
## 23 setosa
## 24 setosa
## 25 setosa
## 26 setosa
## 27 setosa
## 28 setosa
## 29 setosa
## 30 setosa
## 31 setosa
## 32 setosa
## 33 setosa
## 34 setosa
## 35 setosa
## 36 setosa
## 37 setosa
## 38 setosa
## 39 setosa
## 40 setosa
## 41 setosa
## 42 setosa
## 43 setosa
## 44 setosa
## 45 setosa
## 46 setosa
## 47 setosa
## 48 setosa
## 49 setosa
## 50 setosa
## 51 versicolor
## 52 versicolor
## 53 versicolor
## 54 versicolor
## 55 virginica
## 56 versicolor
## 57 virginica
## 58 virginica
## 59 versicolor
## 60 versicolor
## 61 versicolor
## 62 versicolor
## 63 virginica
## 64 virginica
## 65 versicolor
## 66 versicolor
## 67 virginica
## 68 virginica
## 69 virginica
## 70 versicolor
## 71 virginica
## 72 virginica
## 73 versicolor
## 74 virginica
## 75 versicolor
## 76 versicolor
## 77 versicolor
## 78 virginica
## 79 versicolor
## 80 versicolor
## 81 versicolor
## 82 versicolor
## 83 versicolor
## 84 versicolor
## 85 versicolor
## 86 virginica
## 87 versicolor
## 88 versicolor
## 89 virginica
## 90 versicolor
## 91 virginica
## 92 versicolor
## 93 virginica
## 94 virginica
## 95 virginica
## 96 virginica
## 97 versicolor
## 98 versicolor
## 99 virginica
## 100 versicolor
## 101 virginica
## 102 virginica
## 103 virginica
## 104 versicolor
## 105 versicolor
## 106 versicolor
## 107 virginica
## 108 versicolor
## 109 virginica
## 110 versicolor
## 111 versicolor
## 112 versicolor
## 113 virginica
## 114 virginica
## 115 virginica
## 116 versicolor
## 117 versicolor
## 118 virginica
## 119 virginica
## 120 virginica
## 121 virginica
## 122 versicolor
## 123 virginica
## 124 virginica
## 125 virginica
## 126 virginica
## 127 virginica
## 128 versicolor
## 129 versicolor
## 130 versicolor
## 131 versicolor
## 132 virginica
## 133 versicolor
## 134 versicolor
## 135 virginica
## 136 versicolor
## 137 versicolor
## 138 virginica
## 139 versicolor
## 140 versicolor
## 141 versicolor
## 142 versicolor
## 143 virginica
## 144 versicolor
## 145 versicolor
## 146 virginica
## 147 versicolor
## 148 virginica
## 149 virginica
## 150 virginica
위에서 보인 Formula를 지정하는 방법은, nnet()에서 다음과 같이 동작한다.
1. linout의 기본값이 FALSE이므로 출력층에서 linear함수가 아닌 sigmoid 함수가 사용된다.
2. 만약 예층대상이 되는 분류(즉, Y의 레벨)의 수가 2개라면 entropy를 사용해 파라미터가 추정된다.
3. 분류의 수가 3개 이상이라면 SSE로 파라미터가 추정되며, softmax가 적용된다. (여기서는 Species가 3개 이므로 SSE가 추정되며, softmax가 적용된다.)
class.ind(iris$Species)
## setosa versicolor virginica
## [1,] 1 0 0
## [2,] 1 0 0
## [3,] 1 0 0
## [4,] 1 0 0
## [5,] 1 0 0
## [6,] 1 0 0
## [7,] 1 0 0
## [8,] 1 0 0
## [9,] 1 0 0
## [10,] 1 0 0
## [11,] 1 0 0
## [12,] 1 0 0
## [13,] 1 0 0
## [14,] 1 0 0
## [15,] 1 0 0
## [16,] 1 0 0
## [17,] 1 0 0
## [18,] 1 0 0
## [19,] 1 0 0
## [20,] 1 0 0
## [21,] 1 0 0
## [22,] 1 0 0
## [23,] 1 0 0
## [24,] 1 0 0
## [25,] 1 0 0
## [26,] 1 0 0
## [27,] 1 0 0
## [28,] 1 0 0
## [29,] 1 0 0
## [30,] 1 0 0
## [31,] 1 0 0
## [32,] 1 0 0
## [33,] 1 0 0
## [34,] 1 0 0
## [35,] 1 0 0
## [36,] 1 0 0
## [37,] 1 0 0
## [38,] 1 0 0
## [39,] 1 0 0
## [40,] 1 0 0
## [41,] 1 0 0
## [42,] 1 0 0
## [43,] 1 0 0
## [44,] 1 0 0
## [45,] 1 0 0
## [46,] 1 0 0
## [47,] 1 0 0
## [48,] 1 0 0
## [49,] 1 0 0
## [50,] 1 0 0
## [51,] 0 1 0
## [52,] 0 1 0
## [53,] 0 1 0
## [54,] 0 1 0
## [55,] 0 1 0
## [56,] 0 1 0
## [57,] 0 1 0
## [58,] 0 1 0
## [59,] 0 1 0
## [60,] 0 1 0
## [61,] 0 1 0
## [62,] 0 1 0
## [63,] 0 1 0
## [64,] 0 1 0
## [65,] 0 1 0
## [66,] 0 1 0
## [67,] 0 1 0
## [68,] 0 1 0
## [69,] 0 1 0
## [70,] 0 1 0
## [71,] 0 1 0
## [72,] 0 1 0
## [73,] 0 1 0
## [74,] 0 1 0
## [75,] 0 1 0
## [76,] 0 1 0
## [77,] 0 1 0
## [78,] 0 1 0
## [79,] 0 1 0
## [80,] 0 1 0
## [81,] 0 1 0
## [82,] 0 1 0
## [83,] 0 1 0
## [84,] 0 1 0
## [85,] 0 1 0
## [86,] 0 1 0
## [87,] 0 1 0
## [88,] 0 1 0
## [89,] 0 1 0
## [90,] 0 1 0
## [91,] 0 1 0
## [92,] 0 1 0
## [93,] 0 1 0
## [94,] 0 1 0
## [95,] 0 1 0
## [96,] 0 1 0
## [97,] 0 1 0
## [98,] 0 1 0
## [99,] 0 1 0
## [100,] 0 1 0
## [101,] 0 0 1
## [102,] 0 0 1
## [103,] 0 0 1
## [104,] 0 0 1
## [105,] 0 0 1
## [106,] 0 0 1
## [107,] 0 0 1
## [108,] 0 0 1
## [109,] 0 0 1
## [110,] 0 0 1
## [111,] 0 0 1
## [112,] 0 0 1
## [113,] 0 0 1
## [114,] 0 0 1
## [115,] 0 0 1
## [116,] 0 0 1
## [117,] 0 0 1
## [118,] 0 0 1
## [119,] 0 0 1
## [120,] 0 0 1
## [121,] 0 0 1
## [122,] 0 0 1
## [123,] 0 0 1
## [124,] 0 0 1
## [125,] 0 0 1
## [126,] 0 0 1
## [127,] 0 0 1
## [128,] 0 0 1
## [129,] 0 0 1
## [130,] 0 0 1
## [131,] 0 0 1
## [132,] 0 0 1
## [133,] 0 0 1
## [134,] 0 0 1
## [135,] 0 0 1
## [136,] 0 0 1
## [137,] 0 0 1
## [138,] 0 0 1
## [139,] 0 0 1
## [140,] 0 0 1
## [141,] 0 0 1
## [142,] 0 0 1
## [143,] 0 0 1
## [144,] 0 0 1
## [145,] 0 0 1
## [146,] 0 0 1
## [147,] 0 0 1
## [148,] 0 0 1
## [149,] 0 0 1
## [150,] 0 0 1
이제 nnet()함수를 사용한다.
m2 <- nnet(iris[, 1:4], class.ind(iris$Species), size = 3, softmax = TRUE)
## # weights: 27
## initial value 189.668983
## iter 10 value 50.402915
## iter 20 value 11.610643
## iter 30 value 11.528664
## iter 40 value 11.528511
## final value 11.528484
## converged
nnet()는 실행할때마다 결과가 달라진다. 아마 랜덤으로 뭔가를 지정하는듯..?
library(e1071)
## Warning: package 'e1071' was built under R version 3.0.3
## Loading required package: class
library(kernlab)
(m <- ksvm(Species ~ ., data = iris))
## Using automatic sigma estimation (sigest) for RBF or laplace kernel
## Support Vector Machine object of class "ksvm"
##
## SV type: C-svc (classification)
## parameter : cost C = 1
##
## Gaussian Radial Basis kernel function.
## Hyperparameter : sigma = 0.891559297064642
##
## Number of Support Vectors : 60
##
## Objective Function Value : -4.79 -5.375 -20.06
## Training error : 0.013333
ksvm()은 formula를 사용한 형식과, X, Y를 각각 지정하는 형식을 모두 지원한다.
ksvm()함수는 자동으로 데이터의 정규화를 수행하기에(scaled 파라미터의 기본값이 TRUE임), 함수 호출 전 데이터를 정규화할 필요는 없다.
예측은 역시나 predict()를 사용한다.
head(predict(m, newdata = iris))
## [1] setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica
결과를 보면 맨 윗 줄에 "Using automatic sigma estimation (sigest) for RBF"라는 것은 Radial Basis kernel Function을 사용한 모델을 자동으로 선택했다는 의미이다. 이 함수를 바꾸고 싶다면 kernel파라미터에 원하는 함수를 지정하면 된다.
지원하는 kernel의 목록은 help(kernlab:dots)를 참고하자.
ksvm(Species ~ ., data = iris, kernel = "vanilladot")
## Setting default kernel parameters
## Support Vector Machine object of class "ksvm"
##
## SV type: C-svc (classification)
## parameter : cost C = 1
##
## Linear (vanilla) kernel function.
##
## Number of Support Vectors : 29
##
## Objective Function Value : -0.9818 -0.322 -17.06
## Training error : 0.033333
SVM을 잘 사용하기 위해서는 각종 파라미터 값을 잘 찾아야한다. 이를 위한 첫번쨰 방법은 교차 검정을 서로 다른 파라미터값에 대해 수행하는 것이다. 두번째 방법은 SVM 패키지가 제공하는 파라미터 튜닝을 사용하는 것이다.
library(e1071)
(result <- tune.svm(Species ~ ., data = iris, gamma = 2^(-1:1), cost = 2^(2:4)))
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## gamma cost
## 0.5 16
##
## - best performance: 0.04
tune.svm의 반환값은 객체이며, 객체의 속성은 attributes()로 살펴볼 수 있다.
attributes(result)
## $names
## [1] "best.parameters" "best.performance" "method"
## [4] "nparcomb" "train.ind" "sampling"
## [7] "performances" "best.model"
##
## $class
## [1] "tune"
result$best.parameters
## gamma cost
## 7 0.5 16
result$best.parameters["gamma"]
## gamma
## 7 0.5
최적 파라미터값을 빼낼 수 도 있다.
library(mlbench) # 데이터를 사용하기 위한 패키지 로딩
data(BreastCancer)
table(BreastCancer$Class)
##
## benign malignant
## 458 241
유방암 데이터의 양성(benign)의 수는 458, 악성(malignant)의 수는 241로 불균형이 이루어져 있다.
library(caret)
## Warning: package 'caret' was built under R version 3.0.3
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 3.0.3
## Loading required package: ggplot2
x <- upSample(subset(BreastCancer, select = -Class), BreastCancer$Class)
upSample()은 인자로 설명변수와 예측 대상이 되는 분류를 인자로 받아 변환된 데이터를 결과로 출력한다.
위의 예에서는 Class를 제외한 BreastCancer의 데이터가 설명변수이고, Class가 예측 대상이 되는 분류이다.
table(BreastCancer$Class)
##
## benign malignant
## 458 241
table(x$Class)
##
## benign malignant
## 458 458
table을 보면 알 수 있듯이, upSample은 단순히 적은 쪽에 해당하는 분류의 데이터를 중복하여 추출하는 방식이다.
다음을 통해 중복하여 추출했다는 것을 알아 볼 수 있다.
NROW(x)
## [1] 916
NROW(unique(x))
## [1] 691
unique함수는 중복된 요소나 행을 없애서 데이터를 반환한다.
upSample을 훈련데이터에 적용한 경우와 그렇지 않은 경우 각각 모델의 성능을 비교해보자.
library(party)
## Warning: package 'party' was built under R version 3.0.3
## Loading required package: grid
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 3.0.3
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 3.0.3
## Loading required package: strucchange
## Warning: package 'strucchange' was built under R version 3.0.3
## Loading required package: modeltools
## Loading required package: stats4
##
## Attaching package: 'modeltools'
##
## The following object is masked from 'package:kernlab':
##
## prior
library(rpart)
# upSample을 훈련데이터에 적용하지 않은 경우
data <- subset(BreastCancer, select = -Id) # Id를 제외한 나머지 데이터를 subset으로 만듬
parts <- createDataPartition(data$Class, p = 0.8) # data$Class의 80%를 뽑아서 데이터를 만든 후, 인덱스를 리스트로 반환
data.train <- data[parts$Resample1, ] # 행인덱스가 parts$Resample1에 있으므로 데이터를 만들 수 있다.
data.validation <- data[-parts$Resample1, ]
m <- rpart(Class ~ ., data = data.train) # 나무 모형을 만들기 위한 패키지, 훈련데이터로 모델을 만든다.
confusionMatrix(data.validation$Class, predict(m, newdata = data.validation,
type = "class"))
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 85 6
## malignant 6 42
##
## Accuracy : 0.914
## 95% CI : (0.854, 0.955)
## No Information Rate : 0.655
## P-Value [Acc > NIR] : 1e-12
##
## Kappa : 0.809
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.934
## Specificity : 0.875
## Pos Pred Value : 0.934
## Neg Pred Value : 0.875
## Prevalence : 0.655
## Detection Rate : 0.612
## Detection Prevalence : 0.655
## Balanced Accuracy : 0.905
##
## 'Positive' Class : benign
##
# upSample을 훈련데이터에 적용한 경우
data.up.train <- upSample(subset(data.train, select = -Class), data.train$Class)
m <- rpart(Class ~ ., data = data.up.train)
confusionMatrix(data.validation$Class, predict(m, newdata = data.validation,
type = "class"))
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 86 5
## malignant 2 46
##
## Accuracy : 0.95
## 95% CI : (0.899, 0.98)
## No Information Rate : 0.633
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.89
## Mcnemar's Test P-Value : 0.45
##
## Sensitivity : 0.977
## Specificity : 0.902
## Pos Pred Value : 0.945
## Neg Pred Value : 0.958
## Prevalence : 0.633
## Detection Rate : 0.619
## Detection Prevalence : 0.655
## Balanced Accuracy : 0.940
##
## 'Positive' Class : benign
##
subset()문은 특정 컬럼을 선택하거나 또는 제외하는 목적으로 사용되었으며, Id는 각 데이터의 식별자로 모델링에는 적합하지 않기에 가장 처음 단계에서 제거 되었다.
createDataPartition()은 교차 검증(cross validation)에서 살펴본 함수로 훈련 데이터와 검증 데이터의 분리를 위해 사용하였다. 여기서는 80%의 데이터를 훈련데이터로, 나머지 20%를 검증 데이터로 사용하기 위해 p=0.8를 지정하였다.
사용된 모델은 나무 모형이며 rpart를 사용하였다.
예시를 위해 사용할 데이터를 만들어 보자.
data(iris)
data <- iris[, c(1, 2, 5)]
data$Species <- factor(ifelse(data$Species == "setosa", "rare", "common"))
table(data$Species)
##
## common rare
## 100 50
이 데이터에 SMOTE를 사용하여 common과 rare의 갯수를 다략 맞춘 결과는 다음과 같다.
library(DMwR)
## Warning: package 'DMwR' was built under R version 3.0.3
## KernSmooth 2.23 loaded
## Copyright M. P. Wand 1997-2009
newData <- SMOTE(Species ~ ., data, perc.over = 600, perc.under = 100)
table(newData$Species)
##
## common rare
## 300 350
perc.over는 갯수가 적은 분류들로부터 얼마나 많은 데이터를 생성해 낼지를 조정하는 변수이며, perc.under는 갯수가 많은 분류의 데이터에서의 under sampling을 조정하는 변수이다.
library(tm)
## Warning: package 'tm' was built under R version 3.0.3
data(crude)
summary(crude)
## A corpus with 20 text documents
##
## The metadata consists of 2 tag-value pairs and a data frame
## Available tags are:
## create_date creator
## Available variables in the data frame are:
## MetaID
crude데이터는 Rueter 뉴스중 'crude'토픽에 대한 문서 20개를 포함하는 데이터이다.
문서의 본문은 inspect()함수로 볼 수 있다.
inspect(crude[1])
## A corpus with 1 text document
##
## The metadata consists of 2 tag-value pairs and a data frame
## Available tags are:
## create_date creator
## Available variables in the data frame are:
## MetaID
##
## $`reut-00001.xml`
## Diamond Shamrock Corp said that
## effective today it had cut its contract prices for crude oil by
## 1.50 dlrs a barrel.
## The reduction brings its posted price for West Texas
## Intermediate to 16.00 dlrs a barrel, the copany said.
## "The price reduction today was made in the light of falling
## oil product prices and a weak crude oil market," a company
## spokeswoman said.
## Diamond is the latest in a line of U.S. oil companies that
## have cut its contract, or posted, prices over the last two days
## citing weak oil markets.
## Reuter
crude문서들의 글자들을 모두 소문자로 바꾸고 문장 부호를 제거해보자.
변환한 문서를 inspect()함수로 볼 수 있다.
inspect(tm_map(tm_map(crude, tolower), removePunctuation)[1])
## A corpus with 1 text document
##
## The metadata consists of 2 tag-value pairs and a data frame
## Available tags are:
## create_date creator
## Available variables in the data frame are:
## MetaID
##
## $`reut-00001.xml`
## diamond shamrock corp said that
## effective today it had cut its contract prices for crude oil by
## 150 dlrs a barrel
## the reduction brings its posted price for west texas
## intermediate to 1600 dlrs a barrel the copany said
## the price reduction today was made in the light of falling
## oil product prices and a weak crude oil market a company
## spokeswoman said
## diamond is the latest in a line of us oil companies that
## have cut its contract or posted prices over the last two days
## citing weak oil markets
## reuter
(x <- TermDocumentMatrix(crude))
## A term-document matrix (1266 terms, 20 documents)
##
## Non-/sparse entries: 2255/23065
## Sparsity : 91%
## Maximal term length: 17
## Weighting : term frequency (tf)
행렬의 차원은 1266 X 20이고, 행렬의 값은 tf로 나타나며, 각 term의 출현빈도임을 알 수 있다.
행렬의 내부를 inspcet()를 사용해 볼 수 있다.
inspect(x[1:10, 1:10])
## A term-document matrix (10 terms, 10 documents)
##
## Non-/sparse entries: 9/91
## Sparsity : 91%
## Maximal term length: 10
## Weighting : term frequency (tf)
##
## Docs
## Terms 127 144 191 194 211 236 237 242 246 248
## "(it) 0 0 0 0 0 0 1 0 0 0
## "demand 0 1 0 0 0 0 0 0 0 0
## "expansion 0 0 0 0 0 0 0 0 0 0
## "for 0 0 0 0 0 0 1 0 0 0
## "growth 0 0 0 0 0 0 1 0 0 0
## "if 0 0 0 0 0 1 0 0 0 0
## "is 0 0 0 0 0 0 0 0 0 1
## "may 0 0 0 0 0 0 0 0 0 1
## "none 0 0 0 0 0 1 0 0 0 0
## "opec 0 2 0 0 0 0 0 0 0 0
만약 다른 Weighting을 사용하고 싶다면 TermDocumentMatrix()의 control 인자에 weighting을 지정한다.
x <- TermDocumentMatrix(crude, control = list(weighting = weightTfIdf))
inspect(x[1:10, 1:5])
## A term-document matrix (10 terms, 5 documents)
##
## Non-/sparse entries: 2/48
## Sparsity : 96%
## Maximal term length: 10
## Weighting : term frequency - inverse document frequency (normalized) (tf-idf)
##
## Docs
## Terms 127 144 191 194 211
## "(it) 0 0.00000 0 0 0
## "demand 0 0.01181 0 0 0
## "expansion 0 0.00000 0 0 0
## "for 0 0.00000 0 0 0
## "growth 0 0.00000 0 0 0
## "if 0 0.00000 0 0 0
## "is 0 0.00000 0 0 0
## "may 0 0.00000 0 0 0
## "none 0 0.00000 0 0 0
## "opec 0 0.02362 0 0 0
findFreqTerms(TermDocumentMatrix(crude), lowfreq = 10)
## [1] "about" "and" "are" "bpd" "but"
## [6] "crude" "dlrs" "for" "from" "government"
## [11] "has" "its" "kuwait" "last" "market"
## [16] "mln" "new" "not" "official" "oil"
## [21] "one" "opec" "pct" "price" "prices"
## [26] "reuter" "said" "said." "saudi" "sheikh"
## [31] "that" "the" "they" "u.s." "was"
## [36] "were" "will" "with" "would"
전체 20개 문서로 구성된 crude에서 10회 이상 출현한 단어를 찾은 예이다.
참고로 전체 단어와 문서의 목록은 각각 rownames(), colnames()로 볼 수 있따.
x <- TermDocumentMatrix(crude)
head(rownames(x))
## [1] "\"(it)" "\"demand" "\"expansion" "\"for" "\"growth"
## [6] "\"if"
head(colnames(x))
## [1] "127" "144" "191" "194" "211" "236"
findAssocs(TermDocumentMatrix(crude), "oil", 0.7)
## oil
## 15.8 0.87
## opec 0.87
## clearly 0.80
## late 0.80
## trying 0.80
## who 0.80
## winter 0.80
## analysts 0.79
## said 0.78
## meeting 0.77
## above 0.76
## emergency 0.75
## market 0.75
## fixed 0.73
## that 0.73
## prices 0.72
## agreement 0.71
## buyers 0.70
TermDocumentMatrix(crude)과 "oil"의 상관계수가 0.7이상인 단어들을 찾아준다.
data(crude)
data(acq)
to_dtm <- function(corpus, label) {
x <- tm_map(corpus, tolower)
x <- tm_map(corpus, removePunctuation)
return(DocumentTermMatrix(x))
}
우선 corpus의 대문자를 소문자로 바꾸고, 문장 부호를 없앤다.
crude_acq <- c(to_dtm(crude), to_dtm(acq))
crude_acq_df <- cbind(as.data.frame(as.matrix(crude_acq)), LABEL = c(rep("crude",
20), rep("acq", 50)))
위의 코드에서 tolower를 적용하였으므로, "LABEL"열을 다른 열인 소문자 단어들과 중복될 염려가 없다.
이제 데이터 프레임을 살펴보자.
str(crude_acq_df)
## 'data.frame': 70 obs. of 2373 variables:
## $ 150 : num 1 0 0 0 0 0 0 0 0 0 ...
## $ 1600 : num 1 0 0 0 0 0 0 0 0 0 ...
## $ and : num 1 9 0 1 2 7 11 3 9 6 ...
## $ barrel : num 2 0 1 1 0 3 0 0 0 2 ...
## $ brings : num 1 0 1 1 0 0 0 0 0 0 ...
## $ citing : num 1 0 0 0 0 0 0 0 0 0 ...
## $ companies : num 1 1 0 0 0 1 0 0 0 0 ...
## $ company : num 1 0 0 1 0 1 0 0 0 0 ...
## $ contract : num 2 0 1 1 0 0 0 0 0 0 ...
## $ copany : num 1 0 0 0 0 0 0 0 0 0 ...
## $ corp : num 1 0 0 0 0 0 0 0 0 0 ...
## $ crude : num 2 0 2 3 0 2 0 0 0 0 ...
## $ cut : num 2 0 0 0 0 0 0 0 0 0 ...
## $ days : num 1 0 0 0 0 0 0 0 0 0 ...
## $ diamond : num 2 0 0 0 0 0 0 0 0 0 ...
## $ dlrs : num 2 0 1 2 2 2 1 0 0 4 ...
## $ effective : num 1 0 1 1 0 0 0 0 0 0 ...
## $ falling : num 1 0 0 0 0 0 1 0 0 0 ...
## $ for : num 2 5 2 2 2 4 4 1 6 2 ...
## $ had : num 1 0 0 0 0 3 0 2 3 0 ...
## $ have : num 1 3 0 0 0 0 3 0 1 0 ...
## $ intermediate : num 1 0 0 1 0 0 0 0 0 0 ...
## $ its : num 3 6 1 1 1 8 3 0 3 2 ...
## $ last : num 1 1 1 1 0 4 3 0 2 1 ...
## $ latest : num 1 0 0 0 0 0 0 0 0 0 ...
## $ light : num 1 0 1 0 0 0 0 0 0 0 ...
## $ line : num 1 0 0 0 0 0 0 0 0 0 ...
## $ made : num 1 0 0 0 1 0 0 0 0 0 ...
## $ market : num 1 3 0 0 0 0 0 2 0 8 ...
## $ markets : num 1 2 0 0 0 2 0 0 0 2 ...
## $ oil : num 5 12 2 1 1 7 3 3 5 9 ...
## $ over : num 1 0 0 0 0 0 3 1 0 1 ...
## $ posted : num 2 0 1 1 0 0 0 0 0 0 ...
## $ price : num 2 1 2 2 0 2 0 0 1 0 ...
## $ prices : num 3 5 0 0 0 5 1 2 1 9 ...
## $ product : num 1 0 0 0 0 0 0 0 0 0 ...
## $ reduction : num 2 0 0 0 0 0 0 0 0 0 ...
## $ reuter : num 1 1 1 1 1 1 1 1 1 1 ...
## $ said : num 3 11 1 1 3 10 1 3 5 7 ...
## $ shamrock : num 1 0 0 0 0 0 0 0 0 0 ...
## $ spokeswoman : num 1 0 0 0 0 0 0 0 0 0 ...
## $ texas : num 1 0 0 2 0 0 0 0 0 0 ...
## $ that : num 2 10 0 0 2 4 1 0 2 2 ...
## $ the : num 6 19 4 4 8 15 30 6 18 27 ...
## $ today : num 2 0 1 1 0 1 0 0 1 0 ...
## $ two : num 1 1 0 0 0 0 0 0 0 0 ...
## $ was : num 1 1 0 1 0 7 2 1 2 4 ...
## $ weak : num 2 0 0 0 0 0 1 0 0 0 ...
## $ west : num 1 0 0 2 0 0 0 0 0 0 ...
## $ 158 : num 0 3 0 0 0 1 0 0 0 2 ...
## $ ability : num 0 2 0 0 0 3 0 0 0 0 ...
## $ about : num 0 1 0 0 1 0 1 0 2 2 ...
## $ above : num 0 2 0 0 0 3 0 0 0 2 ...
## $ added : num 0 1 0 0 0 1 0 0 1 0 ...
## $ address : num 0 3 0 0 0 0 0 0 0 0 ...
## $ addressed : num 0 1 0 0 0 0 0 0 0 0 ...
## $ advantage : num 0 1 0 0 0 0 0 0 0 0 ...
## $ again : num 0 1 0 0 0 0 0 0 0 0 ...
## $ agreement : num 0 2 0 0 0 0 0 0 0 2 ...
## $ although : num 0 1 0 0 0 0 0 0 0 0 ...
## $ analysis : num 0 1 0 0 0 0 0 0 0 0 ...
## $ analyst : num 0 1 0 0 0 0 0 0 0 0 ...
## $ analysts : num 0 4 0 0 0 1 0 0 0 1 ...
## $ anything : num 0 1 0 0 0 0 0 0 0 0 ...
## $ april : num 0 1 0 0 0 2 1 0 0 0 ...
## $ are : num 0 1 0 0 0 2 2 1 0 3 ...
## $ associates : num 0 1 0 0 0 0 0 0 0 0 ...
## $ back : num 0 1 0 0 0 0 0 0 0 0 ...
## $ been : num 0 1 0 0 0 1 3 0 3 0 ...
## $ before : num 0 2 0 0 0 1 0 0 0 0 ...
## $ bijan : num 0 1 0 0 0 0 0 0 0 0 ...
## $ bpd : num 0 4 0 0 0 7 0 0 0 2 ...
## $ brothers : num 0 1 0 0 0 0 0 0 0 0 ...
## $ but : num 0 5 0 0 0 2 3 1 0 1 ...
## $ buyers : num 0 2 0 0 0 1 0 0 0 0 ...
## $ cambridge : num 0 1 0 0 0 0 0 0 0 0 ...
## $ can : num 0 1 0 0 0 1 0 0 0 0 ...
## $ cannot : num 0 1 0 0 0 0 0 0 0 0 ...
## $ center : num 0 1 0 0 0 0 0 0 0 0 ...
## $ cera : num 0 1 0 0 0 0 0 0 0 0 ...
## $ characterized : num 0 1 0 0 0 0 0 0 0 0 ...
## $ cheating : num 0 1 0 0 0 0 0 0 0 0 ...
## $ clearly : num 0 1 0 0 0 0 0 0 0 1 ...
## $ closer : num 0 1 0 0 0 0 0 0 0 0 ...
## $ come : num 0 1 0 0 0 0 0 0 0 0 ...
## $ condition : num 0 1 0 0 0 0 0 0 0 0 ...
## $ control : num 0 1 0 0 0 0 0 0 0 0 ...
## $ critical : num 0 1 0 0 0 0 0 0 0 0 ...
## $ current : num 0 2 0 0 0 0 0 1 0 0 ...
## $ cutting : num 0 1 0 0 0 0 0 0 0 0 ...
## $ daniel : num 0 1 0 0 0 0 0 0 0 0 ...
## $ david : num 0 1 0 0 0 0 0 0 0 0 ...
## $ december : num 0 1 0 0 0 1 0 0 0 1 ...
## $ deemed : num 0 1 0 0 0 0 0 0 0 0 ...
## $ demand : num 0 5 0 0 0 0 1 0 0 0 ...
## $ differentials : num 0 1 0 0 0 1 0 0 0 0 ...
## $ dillard : num 0 1 0 0 0 0 0 0 0 0 ...
## $ director : num 0 1 0 0 0 0 0 0 0 0 ...
## $ earlier : num 0 1 0 0 0 0 0 0 0 0 ...
## [list output truncated]
str(crude_acq_df$LABEL)
## Factor w/ 2 levels "acq","crude": 2 2 2 2 2 2 2 2 2 2 ...
str(crude_acq_df$LABEL[21:30])
## Factor w/ 2 levels "acq","crude": 1 1 1 1 1 1 1 1 1 1
library(caret) # createDataPartition을 사용하기 위한 패키지
train_idx <- createDataPartition(crude_acq_df$LABEL, p = 0.8)$Resample1
# 훈련데이터
crude_acq.train <- crude_acq_df[train_idx, ]
# 검증데이터
crude_acq.validation <- crude_acq_df[-train_idx, ]
rpart를 사용하여 모델을 만든다.
library(rpart)
m <- rpart(LABEL ~ ., data = crude_acq.train)
결과는 평가 메트릭(metrix)에서 설명한 confusionMatrix()를 사용해 분석해보자.
평가 메트릭이란 예측 모델의 성능을 평가하는 방법이다.
confusionMatrix(predict(m, newdata = crude_acq.validation, type = "class"),
crude_acq.validation$LABEL)
## Confusion Matrix and Statistics
##
## Reference
## Prediction acq crude
## acq 10 0
## crude 0 4
##
## Accuracy : 1
## 95% CI : (0.768, 1)
## No Information Rate : 0.714
## P-Value [Acc > NIR] : 0.009
##
## Kappa : 1
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.000
## Specificity : 1.000
## Pos Pred Value : 1.000
## Neg Pred Value : 1.000
## Prevalence : 0.714
## Detection Rate : 0.714
## Detection Prevalence : 0.714
## Balanced Accuracy : 1.000
##
## 'Positive' Class : acq
##
분석결과의 정확도가, 들인 노력에 비해 상당히 괜찮은 모델을 구할 수 있다.