☐ Representation - Feature Engineering ○ 모델은 input examples을 직접 보거나/듣거나/감지할 수 없다. - 따라서, 데이터를 모델이 이해할 수 있는 특성(features)들로 표현해야 하는데, 이러한 작업을 포괄적으로 representation이라고 한다. - ML에서는 코딩보다 최적의 representation이 우선이다. ○ Feature Engineering = Feature Extraction - raw data를 feature vector로 변환하는 프로세스 · 어떤 features들이 유용할지 선별한 후 raw data를 feature vector로 변환한다. ○ Feature Vector - raw data의 변환 후 모델로 전달하는 feature 값 · 대부분의 ML 모델은 (features x weight)와 같은 곱셈을 수행해야 하므로 features는 real-numbered vectors로 표현되어야 한다. Representation | Raw Data | | Feature Vector | 0: { house_info: { num_rooms: 6 num_bedrooms: 3 street_name: “세종로” num_basement_rooms: -1 ... } } | ⇨ Feature Engineering | [ 6.0, 1.0, 0.0, 0.0, 0.0, 9.321, -2.20, 1.01, 0.0, ... ] | ▪raw data는 vectors 형태가 아니다. | | ▪따라서, raw data를 vector로 변환해야 하는데 이 과정을 feature engineering 이라고 한다. |
○ Mapping numeric values - 숫자 (정수, floating-point)는 weight와 곱셈이 가능하므로 별도의 인코딩이 필요하지 않다. · 예) “num_rooms: 6”는 “num_rooms_feature = [ 6.0 ]”처럼 그대로 사용 ○ Mapping categorical values - categorical values는 불연속(discrete)적인 strings 또는 numbers를 말하며 이들로부터 생성된 features도 불연속 특성을 유지한다. - street_name 이라는 feature를 가지고 예를 들어보자. · options: {‘종로’, ‘세종로’, ‘을지로’} · 이와 같이 strings으로 이루어진 feature를 vocabulary라고 한다. · 위 옵션들은 string이기에 weight와 곱셈을 할 수 없으므로 feature engineering을 통해 numeric values로 변환한다. · 위의 street_name feature에는 모든 거리명이 포함되어 있지 않으므로 ‘종로’, ‘세종로’, ‘을지로’를 제외한 다른 거리명은 ‘기타’로 정하자. · 조금 전 설정한 ‘기타’는 vocabulary에 포함되어 있지 않다고 해서 OOV (out-of-vocabulary) 라고 한다. - 이제 각 option에 숫자를 맵핑시켜준다. · ‘종로’는 ‘0’, ‘세종로’는 ‘1’, ‘을지로’는 ‘2’, ‘기타’는 ‘3’ - 그런데, 이 숫자들을 모델에 직접 전달할 경우 문제가 발생할 수 있다. · street_name feature를 가지고 건물 가격을 예측하는 모델이 있다고 치자. · 하지만 위 숫자들에는 건물 가격 정보가 포함되어 있지 않아 현재 상태로는 이를 기반으로 건물 가격을 예측할 수 없다. · 그리고, ‘종로’와 ‘세종로’의 코너에 위치한 건물은 ‘0’과 ‘1’을 동시에 취해야 하는데 현재 상태로는 방법이 없다. · 이런 제약을 극복하기 위해 각 categorical features별로 binary vector를 생성한다. - binary vector 생성 방법 · 해당 element(s)를 1로 하고 나머지 elements를 0으로 하는 vector를 생성한다. · vector의 크기는 vocabulary에 포함되어 있는 elements 수와 같다. · 1로 설정한 element가 한 개일 경우 one-hot encoding representation 이라 하고, 여러 개일 경우에는 multi-hot encoding representation 이라고 한다. - binary vector의 유용성 · 모든 feature value (예: 거리 이름)에 대해 boolean variable을 효율적으로 생성 - 예시) 위의 feature에서 ‘세종로’에 대해 one-hot encoding을 수행해보자. · ‘세종로’는 1로 하고 나머지는 0으로 하는 binary vector를 만든다. Representation | Raw Data | | Feature Vector | 0: { house_info: { num_rooms: 6 num_bedrooms: 3 street_name: “세종로” num_basement_rooms: -1 ... } } | ⇨ Feature Engineering | street_name feature = [0, 1, 0, 0] | ▪String Features는 one-hot encoding으로 처리할 수 있다. | | ▪vector 크기는 unique vocab items (거리 이름)의 수와 같다. ▪one-hot encoding으로 처리를 해서 ‘세종로’는 1로 하고 나머지는 0으로 한다. |
· 만일 건물이 종로와 세종로의 코너에 있다면 [1, 1, 0, 0]처럼 multi-hot encoding을 해주면 된다. - categorical feature vs binary feature | | | 종로 | | 세종로 | | 을지로 | | 기타 | 4개 카테고리를 가진 categorical feature: 종로 세종로 을지로 기타 | 종로 세종로 을지로 기타 을지로 종로 기타 세종로 을지로 | ⇨ binary feature로 변환 | 1 0 0 0 0 1 0 0 0 | | 0 1 0 0 0 0 0 1 0 | | 0 0 1 0 1 0 0 0 1 | | 0 0 0 1 0 0 1 0 0 |
○ Sparse Representation - 거리명이 1,000,000 개가 있다고 가정하고 binary vector를 생성한다면 소수의 elements에만 1이 할당되고 나머지 대부분의 elements에는 0이 할당될 것이다. · 이는 공간적으로나 연산에 소요되는 시간으로 봐서 매우 비효율적인 구조이다.
- 비효율성을 극복하기 위해서 0이 아닌 값만 저장하는 sparse representation 방식을 사용할 수 있다. |