UNIT 3-1 특징공학
특징(Feature)
- 어떠한 벡터들이 분포적으로 모여있는것
- 벡터들의 집합을 구분할 수 있는 기준
- 모델의 성능을 높이는 가장 중요한 요소
- 데이터 성질, 문제마다 유효한 특징은 다름
- 다양한 특징을 만들어보고 직접 확인하는것이 중요
모델과 특징
모델과 특징의 관계
정형 데이터 -> GBDT
- 수치의 크기(범위) 자체에는 의미가 없고, 크고 작은 관계가 중요
- 결측값이 있어도 어느정도 처리할 수 있음
- 결정 트리의 내부 반복작업에 따라 변수간 상호 작용을 반영
비정형 데이터 -> 인공신경망
- 값의 범위에 영향을 받음
- 결측값을 채워야 함
- 앞 층의 출력을 결합하여 계산하는 연산으로 변수 간 상호작용을 반영
기초가 되는 특징
베이스라인 특징
- 데이터를 최소한의 처리와 변환으로 모델 학습이 가능하게 만든 상태의 특징
- GBDT 모델은 사실 이것만으로도 매우 강력함
- 특징 공학이 효과적인지 판단할 수 있는 비교 기준이 되는 모델
베이스라인 모델
- 기본값으로 모델학습을 한 상태의 모델
- 파라미터 조정을 통해 변경하여 학습한 모델이 효과적인지 판단할 수 있는 비교기준이 되는 모델
- 코드가 정돈되어있어야, 이것으로부터 다양한 변화를 갖는데 효율적임
GBDT
Decision Tree
- 결정 트리는 최종 결정에 도달할때까지 True/False 질문을 하면서 학습
- 매우 직관적인 방법이긴 때문에 이해하기 쉬움
- 전형적인 분류 모델이지만, 회귀 문제에도 사용 가능
- 노드를 효율적으로 선정하고 배치하기 위해서는 정보 획득량과 엔트로피 이론 이해 필요
정보획득량: 어떤 사건이 얼마만큼의 정보를 줄 수 있는지를 수치화한 값
엔트로피: 주어진 거시적 상태에 대응하는 미시적 상태의 수의 로그/무질서도를 정량화해서 표현한 값
의사결정트리 최적화 방법: 입 노드들의 엔트로피 합계를 최소화하는 것
Gradient Boosting
- Boosting: weak classifier 를 결합하여 strong classifier를 만드는 방법
- Bagging : 데이터 샘플을 통해 모델을 다르게 학습하고, 각 모델에서 나온 값을 합하여 최종 결과값을 내는 방식
- Gradient - negative gradient(residual)를 이용해 모델을 순차적으로 학습해 나가는 것
특징 공학(Feature Engineer)
- 패턴 인식: 데이터를 분석하여 일정한 패턴이나 규칙을 찾아내는 것, 사람+머신
- 방법: 데이터 그대로 사용, 통계적 수치활용, 인사이트를 통한 변환, 도메인 지식을 활요
- 방식: 수치형 변수 변환, 범주형 변수 변환, 시계열 데이터 변환, 차원축소, 이미지/텍스트 특징 추출
UNIT 3-3 수치형 변수 변환
수치형 변수 변환
-수치형 변수는 기본적으로 모델 입력에 그대로 사여용할 수 있지만, 적절하게 변환하거나 가공하면 더 효과적인 특징을 만들어낼 수 있다.
수치형 변수를 변환하는 방법은 단일 수치형 변수를 변환하는 방법 여러 개의 변수를 조합해 만드는 방법으로 나눌 수 있음GBDT에서는 이미 어느정도 기본적인 변환에 대해서는 학습을 하기 때문에, 이전에 언급한것처럼 그저 값의 크기가 바뀌고 순서가 바뀌지 않는 것은 '큰' 영향을 미치지 못함.
통계량을 구해서 특징을 만드는 것은 효과적
단일 수치형 변수 변환방법- 스켕일링, 비선형 변환, 클리핑,구간분활, 순위분할,RankGauss
여러개 변수를 조합해 만드는 방법- 수치형변수끼리 조합, 수치형변수와 범주형 변수의 조합, 범주형변수끼리 조합
통계량을 구해서 특징을 만드는 방법- 단순 통계량 구하기, 시간 정보 통계량 구하기
비선형 변환
- log 변환: 한쪽으로 값이 치우져진 분포에 사용
- log(x+1) 변환: 한쪽으로 값이 치우쳐있는데, 값에 0이 포함될 때 사용
- 절댓값 log 변환: 한쪽으로 값이 치우져졌는데 음수가 포함될 때 사용
- Box - Cox변환: 로그 변환을 일반화한 방법
- Yeo-Johnson 변환: Box-Cox 변환에 사용하는 매개변수가 정규분포에 근접하도록 하는 방법
- 절댓값, 제곱근, 제곱, n제곱 ,이진변수화, 반올림, 올림, 버림
클리핑
- 상한과 하한을 설정하여 해당 범위 밖의 값은 제외하는 방법
- 일성 범위를 벗어난 이상치를 제거할 수 있음
- 사용 방법 1. 분포를 확인한 뒤 적당한 임계값을 직접 설정, 2. 분위점을 임계값으로 설정
구간 분할
- 수치형 변수를 구간별로 나누어 범주형 변수로 변혼하는 방법
1. 같은 간격으로 분홀
2. 분위점을 이용하여 분할
3. 구간 구분을 지정하여 분할
순위 분할
수치형 변수를 대소관계에 따른 순위로 변환하는 방법
대표적인 방법: RankGauss
- 수치형 변수를 순위로 변환한 뒤 순서를 유지한 채 반강제로 정규분포가 되도록 변환하는 방법
수치형 변수와 수치형 변수의 조합
수치형 변수를 사칙연산하여 새로운 특징을 생성
두 변수가 서로 같은지 비교하는 연산을 활용하기도 한다.
Tip) GBDT 모델은 덧셈, 뺄셈보다는 상대적으로 곱셈, 나눗셈의 관계성을 파악하기 어려움
수치형 변수와 범주형 변수의 조합
범주별로 수치형 변수의 평균이나 분산과 같은 통계량을 취해 새로운 특징 생성
기존 변수
- 범주형 변수: 강아지 종
- 수치형 변수: 몸무게
새로운 특징
- 강아지 종별 몸무게 평균
- 강아지 종별 몸무게 평균보다 얼마나 큰지 / 작은지
범주형 변수와 범주형 변수의 조합
범주형 변수를 세분화하는데 사용
데이터가 더 세분화 됨으로써 데이터가 충분히 많지 않으면 과적합의 위험성이 있음
ex) 강아지 종, 크기-> 푸들 대형(스탠다드 푸들), 푸들 중형, 푸들 소형(토이 푸들)
ex) 성별, 연령대 -> 10대 남성, 10대 여성, 20대 남성, 20대 여성,,,,
단순 통계량 구하기
- 행 카운트
- 유일한 카운트
- Boolean
- 합계, 평균, 비율
- 최대, 최소, 표준편차, 중앙값, 분위점, 첨도, 왜곡도
시간 정보 통계량 구하기
- 최초 데이터
- 최근 데이터
- 간격 또는 빈도 정보
- 이벤트 시점
- 이벤트 발생 간격
순서 및 연속 관련 정보
- 이벤트 발생 순서
- 동시 발생한 이벤트
- 연속 발생 횟수
UNIT 3-2 범주형 변수 변환
범주형 변수
범주형 변수는 머신러닝 모델에 사용하려면 변환을 해야함
수치값이더라도 범주형 변수로 취급해야 할 때가 있음
테스트 데이터에만 존재하는 범주가 있는 경우
1. 최빈값이나 예측으로 보완
2. 변환의 평균에 가까운 값 입력
범주형 변수의 변환
1. 원-핫 인코딩
2. 임베딩
레이블 인코딩
각 범주를 단순하게 정수로 변환 -> 정수이지만, 범주형 변수 느낌
le =LabelEncoder()
le.fit(train['음식'])
le.transform(train['음식'])
le.transform(test['음식'])
원-핫 인코딩
범주형 변수의 각 범주에 대해 해당 범주인지 여부를 나타내는 0과 1 두 값을 갖는 변수를 각각 생성하는 방식
범주의 가짓수 만큼의 변수를 갖게 됨 -> 단점: 계산 시간, 메모리가 늘어남
사용방법
- Pandas의 get_dummies() 함수로 수행 가능
- Scikit-learn의 OneHotEncoder로 가능
너무 가짓수가 많다면?
- 인코딩 방법 변경
- 범주를 적은 수의 그룹으로 묶어서 범주의 수를 줄이기
- 빈도가 낮은 범주를 '기타' 범주로 묶기
특징 해싱
변환 후의 특징 수를 먼저 정해주고, 해시 함수를 이용해서 표시할 위치를 결정
특징 수보다 적은 수로 매칭해서 인코딩 하는 방법
Scikit-learn.feature_extraction 모듈의 FeatureHaser이용
거의 쓰이지 않는 방법
프리퀀시 인코딩
각 범주의 출현 횟수 혹은 출현 빈도로 범주형 변수를 대체하는 방법
출현 빈도와 목적변수 간에 관련성이 있을 때 유효함
같은 값이 생길 수도 있으니 주의해야한다.
타깃 인코딩
목적 변수를 이용하여 범주형 변수를 수치형 변수로 변환하는 방법
범주형 변수의 각 범주 그룹에서 목적변수의 평균값을 학습 데이터로 집계하고 그 값으로 치환
구현 방법이 다양하지만, 정보가 누출되지 않을 수 있도록 해야함
즉. 학습하고자 하는 정답을 기반으로 계산하기 때문에, 평가/시험셋을 나눈 후에 계산!
임베딩
이산적인 표현을 연속적인 표현으로 변환하는 방법
범주형 변수값의 의미 추출
범주형 변수의 범주가 무의미한 기호가 아닌 어떤 의미를 지닐 때, 단순히 인코딩/임베딩하면 정보가 사라져버림
따라서, 의미를 추출하는 처리를 통해 특징을 만들 수 있음
UNIT 3-4 시계열 데이터 처리 및 변환
날짜변수와 시간 변수로 만드는 특징
- 연도 정보를 특징에 단순하게 추가
- 연도 정보를 특징에 단순하게 추가, 테스트 데이터에만 존재하는 연도를 학습 데이터의 최신 연도로 치환
- 연도 정보를 사용하여 학습 데이터로서의 사용 기간을 제한
- 월초, 월말, 월급날 등 특정 날짜에 해당하는지 변수를 만들기
- 연월, 주수, 일수, 사분기, 계절로 처리
- 공휴일과 휴일, 새로운 특징으로 만들어 처리
- 연휴의 몇번째 날인가
- 시간차
학습셋과 시험셋의 분할
시계열 데이터
- 시간의 추이와 함꼐 순차적으로 관측한 데이터
- 시계열 데이터를 판단하는 기준
1. 시간 정보를 가지는 변수가 있는지
2. 학습셋과 시험셋이 시계열로 나뉘어 있는지
3. 시계열에 의존하는 목적변수가 있는지
데이터 정보 누출 대비
예측 시점보다 과거 정보만 사용
다가오는 2022을 예측한다면, 2021년까지의 데이터만 사용
2018년의 데이터를 예측한다고 하였을 때, 2019년 이후의 데이터가 있더락도 사용하지 않는 것이 룰
전체 평균 데이터 등 2022년의 데이터가 간접적으로 포함되지 않도록 노력
Lag 특징
- 시간차
- 비슷한 데이터 ,경향이 있는 것과 시차를 구하는 것은 의미가 없다.
- 주기적인 움직임이 보인다면, 해당 주기에 따라 lag 특징을 구하는 것이 효과적
- 이동평균 = 일정 기간의 평균값을 얻는 처리
- 주기적인 움직임이 이을 때에는 해당 주기에 따라 이동평균에 구하면 그 영향을 없애고, 독립적으로 그 시점의 정보를 학습시킬 수 있음
ex) 7일의 이동평균을 취하면, 각 요일이 반드시 한번씩 포함되므로, 요일에 따른 변동의 영향이 사라져 해당 주의 전체적인 경향 파악 가능
데이터 정보 누출 대비
x_avg3 = x.shift.rolling(window=3).mean()
Lead 특징
lag 특징과는 반대로 미래의 값을 특징으로 생성할 수도 있습니다.
하지만, 우리가 구하고자하는 목적변수는 알 수 없으므로, 목적변수의 lead특징을 구할 수는 없습니다.
하지만, 매우 희귀한 케이스로, 우리가 구하고자 하는 날보다, 그 다음날과 같이 그 다음 미래가 예측하기 쉽다고 한다.
x_lead1 = x.shift(-1)
시점 관련 특징 생성
1. 특징을 생성하는 원본 데이터의 집계등을 통해 시점별 연계 변수를 구함
2. 필요에 따라 누적합이나 이동평균을 구하거나, 다른 변수와의 차 또는 비율을 구하는 처리 수행
3. 시점을 키로 삼아 학습 데이터와 결합
UNIT 3-5 차원 축소
PCA
- 주성분 분석
- 데이터 분포에서 주성분을 찾는 방법
- 통계 데이터 분석, 데이터 압축, 다중공산성 문제 해결, 노이즈 제거 등 다양한 활용
t-SNE
고차원의 벡터로 표현되는데 데이터 간의 이웃 구조를 보존하는 2차원의 embedding vector 학습
데이터 간의 거리를 stochastic probability로 변환하여 임베딩에 적용
데이터를 2차원 평면상에 차원 축소하여 시각화 목적으로 쓰임
AutoEncoder
신경망을 이용한 차원 축소 방법
입력 차원보다 작은 중간층을 이용하여 입력과 같은 값으로 출력하는 신경망을 학습함으로써, 원래의 데이터를 재현할 수 있는 저차원의 표현을 학습함
Denoising autoencoder는 입력에 노이즈를 일부로 넣고, 출력에서는 원래의 입력 그대로 나오도록 하여, 노이즈를 제거할 수 있도록 학습하는 방법
실습
github를 통해 확인
https://github.com/carpe1997/TIL/tree/main/Machine%20Learning/3%ED%9A%8C%EC%B0%A8
'빅데이터 관련 자료 > Machine Learning' 카테고리의 다른 글
머신러닝 데이터 분석 6회차 (0) | 2021.09.29 |
---|---|
머신러닝 데이터 분석 5회차 (0) | 2021.09.27 |
머신러닝 데이터 분석 4회차 (0) | 2021.09.17 |
머신러닝 데이터 분석 2회차 (0) | 2021.09.08 |
머신러닝 데이터 분석 1회차 (0) | 2021.09.07 |