반도체 생산 공정 데이터 학습 :: part 02 전처리(pre-processing)

개요(Abstraction)
UCI 저장소에 있는 반도체 생산 공정 데이터( Data from a semi-conductor manufacturing process)를 이용한다. 이 데이터는 자유롭게 사용 가능하다. 데이터의 상세한 설명은 저장소 누리집에세 참조 가능하다. 이 데이터의 특징은 노이즈가 포함된 많은 변수를 가지고 있고, 결측 데이터(NA)를 포함한다. rpart을 제외한 많은 모델에서 결측치가 있는 데이터를 사용할 수 없다, 또는 사용 가능하더라도 결측치가 있는 예측자의 평균값을 사용을 내부적으로 강제한다. 이런 이유로 데이터를 모델이 학습하기 전 처리하는 작업을 수행한다.

1 전처리 과정(Pre-Processing)

R에서 전처리 과정은 caret과 Amelia II 패키지를 이용한다.

근접 공분산(near zero-variance) 예측자 제거

데이터 셋에서 근접 공분산(near zero-variance) 예측자는 어떤 모델에 문제를 야기할 수 있다. nearZeroVar 함수는 데이터 집합에서 근접 공분산 예측자를 구별하는데 사용한다. 이 함수는 컬럼의 근접 공분산 조건에 해당하는 인덱스를 돌려준다.
library(caret)

sc.data <- read.csv("./data/secom.csv", header = FALSE, sep = " ", quote = "\"'")
sc.labels <- read.csv("./data/secom labels.csv", header = FALSE, sep = " ", quote = "\"'")


# 근접 공분산 예측자 제거
nzv <- nearZeroVar(sc.data)

# 127개의 근접 공분산 예측자를 찾음
length(nzv)
# [1] 127

sc.data.pp <- sc.data[, -nzv]
dim(sc.data.pp)
# [1] 1567  463

# 제거된 예측자 확인
sc.data.unique <- sapply(sc.data[, nzv], function(x) {length(unique(x))})
View(sc.data[, sort(sc.data.unique) < 20])

전가(Imputation) 또는 대체

Amelia II는 완전한 관측을 요구하는 분석에서 결측이 있는 데이터셋에 모든 정보를 표현한 것을 근사적으로 사용할 수 있다, 그리고 편향(biases), 비효율(inefficiencies), 그리고 분석에서 모든 부분적으로 관측된 관측치를 제외하여 결과를 산출한 바르지 못한 불확실한 추정을 피할 목적으로 전가(imputation) 작업을 수행한다.
거의 대부분의 모델은 NA(결측)을 처리할 수 없다. Amelia II 패키지를 이용해 결측을 대체하는 값으로 채운다. amelia() 함수 사용에는 약간의 까다로운 점이 있어 실패하는 경우도 정리했다. 그리고 전가 작업은 상당히 많은 시간이 필요(약 3시간)하므로 처음에는 m 변수를 1로 설정하여 잘 동작하는지 확인해야 한다.
# 생성될 데이터 갯수를 1로 실행
# 경험적인 선행() 수준을 나타내는 변수를 NULL로 실행.
amelia(sc.data, m = 1, p2s = 1, empri = NULL)

# 근접 공분산 예측자가 포함되었다는 오류 발생 메세지
# Amelia Error Code:  43 
# You have a variable in your dataset that does not vary.  
# Please remove this variable. Variables that do not vary:  V6, V14, V43, V50, V53, V70, V98, V142, V150, 
# V179, V180, V187, V190, V191, V192, V193, V194, V195, V227, V230, V231, V232, V233, V234, V235, V236, 
# V237, V238, V241, V242, V243, V244, V257, V258, V259, V260, V261, V262, V263, V264, V265, V266, V267,
#  V277, V285, V314, V315, V316, V323, V326, V327, V328, V329, V330, V331, V365, V370, V371, V372, V373, 
# V374, V375, V376, V379, V380, V381, V382, V395, V396, V397, V398, V399, V400, V401, V402, V403, V404, 
# V405, V415, V423, V450, V451, V452, V459, V462, V463, V464, V465, V466, V467, V482, V499, V502, V503, 
# V504, V505, V506, V507, V508, V509, V510, V513, V514, V515, V516, V529, V530, V531, V532, V533, V534, 
# V535, V536, V537, V538, V539 
근접 공분산 예측자를 제거한 후 다시 amelia() 실행해 본다. empri를 NULL(기본값)로 설정하여 실행하면 다음과 같은 오류가 발생한다.
sc.data.a <- amelia(sc.data.pp, m = 1, p2s = 1, empri = NULL)

# error: inv_sympd(): matrix is singular or not positive definite
amelia() 함수의 R 도움말을 참조하여 empri를 설정하면 제대로 수행된다.
# 5개의 전가된 데이터셋을 생성하며, empri 값를 설정했다.
sc.data.a.1 <- amelia(sc.data.pp, m = 5, p2s = 1, empri = 0.5 * nrow(sc.data.pp))

# -- Imputation 1 --
# 
#   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#  21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#  61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#  81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#  121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
# 
# 
# -- Imputation 2 --
# 
#   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#  21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#  61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#  81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#  121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#  141
# 
# -- Imputation 3 --
# 
#   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#  21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#  61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#  81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#  121 122 123 124 125
# 
# -- Imputation 4 --
# 
#   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#  21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#  61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#  81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#  121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#  141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
#  161 162 163 164 165 166 167
# 
# -- Imputation 5 --
# 
#   1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
#  21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#  61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#  81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#  121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#  141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
#  161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
#  181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
#  201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
#  221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
#  241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
#  261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
#  281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
#  301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
#  321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
# 결측 정보를 확인해 본다(프롯)
missmap(sc.data.a.1)
Figure 1: 전가된 데이터의 결측 정보
앞쪽의 몇몇 예측자는 상당히 결측이 심하다. 결측이 많은 예측자도 모델 정확성에 영향을 미칠 수 있다, 그래서 어떤 경우에는 이런 예측자를 제외하는 작업을 수행해야 한다.

다중 공선성(multicollinearity) 제거

어떤 모델은 다중공선에 민감하다(i.e., 예측자 사이의 높은 상관관계). 선형 모델, 신경망 그리고 다른 모델들은 이러한 상황에 나쁜 성능을 가지거나, 불안정한 솔류션을 생성한다. 분류 및 회귀 트리 같은 다른 모델은 높은 상관관계의 예측자에게 내성이 생길 수 있다, 그러나 다중공선은 모델의 해석 능력에 부정적인 영향을 끼칠 것이다. 예를 들어, 분류 트리는 높은 상관관계를 가지고 좋은 성능을 가질 수 있다, 그라나 모델에서 예측 변수의 결정을 무작위로 한다. 모델 자체적으로 데이터를 훈련할 때 이 작업을 내부적으로 수행하는 모델도 있다.
# 상관관계가 높은 컬럼
fc <- findCorrelation (as.matrix(sc.data.a.1$imputations$imp1), 0.90)
length(fc)
# 322

sc.data.imp <- sc.data[, -fc]
dim(sc.data.imp)
#[1] 1567  268
다중 공선성 예측자를 제거하면 학습에 필요한 예측자가 268개로 축소된다.

중앙과 척도(centering and/or scaling)

부분 최소 제곱(partial least squares), 신경망, 서포트 벡터 머신 같은 어떤 모델에서는, 중앙과 척도를 맞추는 것을 필요로 한다. preProcess 함수는 훈련집합을 사용하는 예측자의 변환은 값을 결정하기 위해 사용되고 검증 집합이나 미래의 표본에 사용 된다. 이 함수는 아규먼트(argument)로 method 를 갖는다. method로 "center", "scale", "pca" 그리고 "spatialSign" 값을 전달한다. 처음 두개의 옵션은 각각의 예측자를 위한 단순한 위치와 척도 변환을 한다(기본값으로 사용). 분류를 위한 예측함수는 새 표본에 프로세스를 적용하여 사용된다.
#library(caret)

# caret 패키지 함수이며, method 변수의 값에 유의해야 한다. 변환된 데이터셋이 반환된다.
preProcess(sc.data.a.1$imputations$imp1, method = c("center", "scale"))

2 요약

데이터의 전처리 작업은 상당히 중요하다, 전가 작업의 결과는 때에 따라서 Amelia II 패키지에서 제공하는 분석 함수를 통해 확인 작업이 필요하다. 결측값도 결측 자체가 의미가 있을 수 있다. 이런 경우는 결측을 지원하는 모델로 학습을 먼저 하고 적용하고자 하는 모델을 학습시킨다.

댓글 없음:

댓글 쓰기