프로그래밍

[R] 분석모델 확장(파생변수, 앙상블 기법)

RainIron 2021. 5. 31. 23:26
반응형

[파생변수 활용]

1. 파생 변수의 개념

1) 파생 변수의 정의

- 작위적(의도적) 정의에 의해 특정 의미를 갖는 변수

- 사용자가 특정 조건을 만들어 의미를 부여한 변수

 

2) 파생 변수의 성격

- 주관적: 논리적 타당성을 갖추지 못한 경우, 분석과 해석에 문제가 생김

- 특정 상황에만 의미있는 것이 아닌, 대표성이 나타나도록 변수 설계를 해야 함.

  ex) 2021년 하반기 제품 구매 고객 리스트(X) -> 하반기 제품 구매 고객 리스트

- 세분화, 고객행동 예측, 마케팅 혹은 캠페인 반응 예측에 활용이 가능

  ex) 변수(근무시간 중 구매정도, 주거래매장, 선호상품, 가격대 등) -> 고객의 예상 구매 빈도, 거래 금액으로 고객 등급 분류, 캠페인 시행 효과 확인 등

2. 파생 변수의 예시와 활용

1) 제작

- 변수를 조합하거나, 함수를 적용해 새로운 변수를 생성

 

2) 요약변수

- 기본 정보를 특정 기준으로 그룹핑하여 요약한 변수

- 예) 연속형 변수의 구간화, 사용 단어 빈도, 기간별 구매 금액 등

- 특성

    - 수집된 정보를 분석에 맞게 종합

    - 데이터 마트(데이터 원 저장소인 데이터 웨어하우스와 사용자 사이의 복제된 데이터)에서 가장 기본적인 변수

    - 다수의 모델에 공통으로 사용될 수 있어, 재활용성이 높음

    - 간단한 구조(자동화 프로그램 구축 가능)

 

- 데이터마트: 일반적으로 각 응용분야별로 구축되는 소규모 형태의 데이터웨어하우스

  (의사결정지원시스템(DSS: Decision Support System): 사용자의 요구사항에 초점을 맞춘, 특정 사용자 집단에 특화된 데이터 저장고)

  데이터웨어하우스(DW) 데이터마트
범위 애플리케이션 중립적 중앙집중식
공유 전사적
특정 애플리케이션
특정 부문
특정 사용자 영역
비즈니스 프로세스 중심적
주제영역 다수의 데이터 구조 지원 단일한 부분적 데이터 구조 지원
데이터 관점 오랜 기간의 상세 데이터 요약
(시계열 이력 데이터, 납입보험료)
제한된 규모의 데이터 요약
(추세, 패턴 분석)
기타특성 지속성/전략적 프로젝트 중심

 

- 요약변수 사용 사례

  * 기간별 구매 금액/횟수: 고객의 구매패턴 식별

  * 위클리 쇼퍼: 구매 시기를 통해 고객의 특성을 추정

  * 상품별 구매금액/횟수: 고객의 라이프 스테이지/라이프스타일 등을 이해

  * 유통 채널별 구매금액: 온/오프라인 고객의 구매를 유도

  * 단어 빈도: 텍스트자료에서 단어들의 출현 빈도를 데이터화하여 사용

  * 초기 행동변수: 고객 가입/첫 거래 초기 1개월간 거래 패턴 -> 1년 후 반응 예측

  * 트렌드변수: 추이값을 나타내는 변수

  * 결측값과 이상값 처리: 내용 파악 후 처리

  * 연속형 변수의 구간화: 분석 후 적용 단계를 고려한 데이터 분석을 위해 연령/비용 등 연속형 변수를 구간화 하는 것

 

3) 파생변수

- 사용자가 의미를 부여하여 생성한 변수

- 주관적(논리적 타당성이 필요)

- 생성된 변수가 모집단의 대표성을 나타낼 수 있어야함

 

- 파생변수 사용 사례

  * 근무시간 구매 지수: 근무시간대에 거래가 발생하는 비율을 산출

  * 주 구매 매장 변수: 고객의 주거래 매장을 예측

  * 주 활동 지역 변수: 고객의 정보/거래내용 통해 주 활동 지역을 예측

  * 주 구매 상품 변수: 상품 추천에 활용

  * 구매 상품 다양성 변수: 고객의 구매 성향 파악

  * 선호하는 가격대 변수

  * 라이프 스테이지 변수

  * 라이프 스타일 변수

  * 행사 민감 변수

 

- 파생 변수의 활용

  * 모델 성능 향상의 방법

    1. 주어진 데이터를 가지고, 모델에 맞춰 데이터를 수정하고, 주요 변수에 따라 모델링을 함(일반적인 방법)

    2. 데이터의 특성에 대해 이해하고, 분석자의 주관에 따라 파생변수를 얼마나 잘 생성하느냐에 따라 모델의 성능은 향상됨

 

3. R을 이용한 파생변수 실습

* melt(): 식별자 id, 측정 변수 variable, 측정치 value 형태로 데이터를 재구성하는 함수

reshape2::melt.data.frame(
  data,         # melt할 데이터
  id.vars,      # 식별자 컬럼들
  measuer.vars, # 측정치 컬럼들
  na.rm = False # NA인 행을 결과에 포함시킬지 여부. False는 NA를 제거하지 않음
)

  ex) melt1 = melt(data, id = 'names') # names 변수를 id변수로 재구성

 

* cast(): 새로운 구조로 데이터를 만드는 함수(melt_Data, 변수1, 변수2 ~ column 생성 변수명)

 

* dplyr 패키지: 데이터 프레임을 처리하는 함수로 구성된 패키지

  - data.table

  - 각종 데이터베이스: MySQL, PostgreSQL, SQLite, BigQuery 지원

  - 데이터 큐브: dplyr 패키지 내부에 실험적으로 내장됨

함수명 내용 유사함수
filter() 지정한 조건식에 맞는 데이터 추출 subset()
select() 열의 추출 data[, c('Year', 'Month')]
mutate() 열 추가 transform()
arrange() 정렬 order, sort()
summarise() 집계 aggregate()

 

* hflights 데이터: 미국 휴스턴에서 출발하는 모든 비행기의 2011년 이착륙기록이 수록된 것으로 227496건의 이착륙기록에 대해 21개 항목을 수집한 데이터

install.packages('dplyr')
install.packages('hflights')
library(hflights)
library(dplyr)
str(hflights) # hflights의 구조 출력

# 변수명 확인
colnames(hflights)

# 자료를 보기 좋게 한 화면에 편집
hflights_df <- tbl_df(hflights)
hflights_df

# 파생변수 추가(칼럼 추가)
aa <- mutate(hflights_df, gain=ArrDelay - DepDelay)

# 변수가 새로 생성된 것을 확인
aa


[앙상블 기법 활용]

1. 앙상블 기법의 개념

1) 앙상블 기법

- 정의: 주어진 자료로 여러 개의 예측 모델을 학습한 다음, 하나의 최종 예측 모델을 사용하여 정확도를 높이는 기법

  (지도학습의 장/단점: 정교화, 대규모화되어 예측 성능이 뛰어나지만, 학습에 오랜 시간이 걸리고, 과도적합으로 인한 오차 증가가 동반된다.)

  -> 지도학습 기법보다 더 좋은 성능을 내기 위해 고안된 기법(많은 기저 학습기들을 합치는 방법)

 

- 단점: 모형 복잡도가 높아 설명하기 어렵다

- 장점: 성능이 높다

 

- 트리 기반 통계적 학습 기법

트리 기반 통계적 학습 기법
지도 학습 의사결정 트리 - 회귀/분류 트리
+ 배깅, 부스팅, 랜덤 포레스트
비지도 학습 군집화(Clustering)

 

2) 고려사항

- 학습기의 선택: 비교적 간단하면서도, 서로 차별성이 있는 분류기를 선택 => 결합을 통해 효과를 향상

  1) 학습 알고리즘 차별화: 기법 결합 시, 베이즈 분류기와 k-neighbors 알고리즘, 인공신경망과 SVM을 결합하는 방법과 같이 서로 다른 접근 방법을 가진 알고리즘을 선택

  2) 모델 선택과 관련된 파라미터의 차별화

  3) 학습 데이터 차별화: 같은 기법 모델을 결합하되, 학습에 사용되는 데이터 집합에 차별을두어 복수 개의 분류기를 만드는 방법

 

- 결합 방법의 선택: 학습이 완료된 학습기들로부터 얻어지는 인식 결과의 결합 => 각 학습기의 특성을 고려하여 결합

  * 병렬적 결합 방법: 기법 결합 시, 각각의 분류기로부터 얻어진 결과를 한 번에 모두 고려하여 최종 결과를 얻는 방법

  * 순차적 결합 방법: 각 분류기의 결과를 단계별로 나누어, 단계적으로 결합하는 방법

    -> 앞 단계에 배치된 결과가 뒤에 배치된 분류기의 학습과 분류에 영향을 미침

2. 앙상블 기법의 종류와 활용

1) 배깅 = Bootstrap(랜덤 샘플링) + Aggregating(집합)

- 최종 모델 생성 과정

    1. 주어진 학습자료에서 표본을 무작위로 재추출 해, 여러 개의 부트스트랩을 만듬

        (부트스트랩: 실측 데이터를 바탕으로 가상의 샘플링을 수행해, 분포를 추정하는 것)

    2. 만들어진 부트스트랩 자료를 각각에 대해 추출 표본들의 분산을 표본 수로 나눔

    3. 분산을 줄인 예측 모형 제작

    4. 그 모형을 결합해 최종 모형을 생성

 

- 배깅 알고리즘: 각 훈련치를 평균하면, 분산을 낮추는 효과가 있음(분산을 낮춰 과적합을 막아줌)

 

2) 부스팅

- 정의: 제대로 분류되지 않은, 예측력이 약한 모형들을 결합하여 강한 예측 모형을 만드는 것

- 오차가 큰 학습기의 경우 가중치를 높이고, 오차가 작은 학습기의 경우 가중치를 낮춤

- 부스팅 알고리즘

    * 직렬적 개념

    * 훈련오차를 빠르고, 쉽게 줄일 수 있다.

    * 잘못 분류된 데이터에 가중치를 부여하여 더 잘 분류하는 목적으로 사용

- 학습과정

    학습데이터 -> 1st 분류기 -> 오분류/정분류 데이터 중 k개 추출 -> 2nd 분류기 학습 -> 오분류/정분류 데이터 중 k개 추출 -> 반복 -> ... -> 적용 데이터를 1st 분류기, 2nd 분류기, 3rd 분류기 등 적용 -> 최종 결과

 

3) 랜덤 포레스트

- 정의: 분산이 큰 의사결정나무의 단점을 통계적 기법으로 극복한 방법

- 여러 개의 의사결정 나무를 만들고, 각각의 나무에 부트스트랩을 이용해 생성한 데이터셋으로 모델을 구성함

  => 편향을 증가시킴으로써, 분산이 큰 의사결정나무의 단점을 완화

- 장점: 과적합 발생률이 낮아지고, 일반 의사결정나무보다 예측력이 높아진다

- 단점: 복잡한 구조로 해석력이 떨어짐

 

3. R을 이용한 앙상블 기법

1) 랜덤포레스트

install.packages('randomForest')
library(randomForest)

idx = sample(2, nrow(iris), replace = T, prob = c(0.7,0.3)) 
# sample = 분류 지표(예: 2 -> 1 or 2)
# prob = probability(예: c(0.7, 0.3) -> 1 = 70%, 2 = 30%)

idx
'''
  [1] 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 2 1
 [22] 1 2 1 1 1 1 2 1 2 1 2 1 2 1 1 1 2 1 2 1 1
 [43] 1 1 2 1 1 1 2 1 1 1 2 1 1 2 2 1 1 1 1 1 1
 [64] 1 2 1 2 2 2 1 1 1 1 2 1 2 1 2 1 1 1 2 2 1
 [85] 1 2 2 2 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 2 1
[106] 1 2 2 2 1 2 1 1 1 1 1 1 2 1 1 2 1 1 1 1 2
[127] 2 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1
[148] 1 2 1
'''

 

trainData = iris[idx == 1,]
testData = iris[idx == 2,]

model = randomForest(Species~., data = trainData, ntree = 100, proximity = T)
# ntree: 의사결정나무 갯수

model

- OOB(Out Of Bag)(estimate of error rate, 에러 추정치): 3.74%(모델 훈련에 사용되지 않은 데이터를 사용해 에러 추정)

- 의사결정나무 갯수(Number of trees): 100

- 혼동행렬을 통해 정분류, 오분류된 케이스 갯수를 알 수 있음

importance(model)

지니계수

- 지니계수: 값이 높은 변수가 클래스를 분류하는데 가장 큰 영향을 줌

 

2) 기타

- 배깅은 party와 caret 라이브러리를 사용해서 부트스트랩과 모델링을 함

- 부스팅은 tree 라이브러리와 rpart 패키지를 사용하여 표본 추출과 트리 모델을 형성할 수 있음

반응형