"데이터가 뛰어노는 AI놀이터, 캐글" 참고하여 스터디를 진행하였고 책을 바탕으로 발표용 ppt를 만들었습니다.
문제가 있을 시 댓글 남겨주시거나 이메일 totoma3@naver.com 으로 연락주시기 바랍니다!
목차
주성분 분석
데이터 준비
import numpy as np
import pandas as pd
# train_x는 학습 데이터, train_y는 목적 변수, test_x는 테스트 데이터
# pandas의 DataFrame, Series의 자료형 사용(numpy의 array로 값을 저장하기도 함.)
train = pd.read_csv('C:/Users/Administrator/Desktop/2021년 1학기/tave동아리/후반기 활동/ppt/input/train_preprocessed_onehot.csv')
train_x = train.drop(['target'], axis=1)
train_y = train['target']
test_x = pd.read_csv('C:/Users/Administrator/Desktop/2021년 1학기/tave동아리/후반기 활동/ppt/input/test_preprocessed_onehot.csv')
# 설명용으로 학습 데이터와 테스트 데이터의 원래 상태를 복제해 두기
train_x_saved = train_x.copy()
test_x_saved = test_x.copy()
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# 표준화한 학습 데이터와 테스트 데이터를 반환하는 함수
def load_standarized_data():
train_x, test_x = train_x_saved.copy(), test_x_saved.copy()
scaler = StandardScaler()
scaler.fit(train_x)
train_x = scaler.transform(train_x)
test_x = scaler.transform(test_x)
return pd.DataFrame(train_x), pd.DataFrame(test_x)
# MinMax 스케일링을 수행한 학습 데이터와 테스트 데이터를 반환하는 함수
def load_minmax_scaled_data():
train_x, test_x = train_x_saved.copy(), test_x_saved.copy()
# Min-Max Scaling 진행
scaler = MinMaxScaler()
scaler.fit(pd.concat([train_x, test_x], axis=0))
train_x = scaler.transform(train_x)
test_x = scaler.transform(test_x)
return pd.DataFrame(train_x), pd.DataFrame(test_x)
PCA
train_x, test_x = load_standarized_data()
# PCA
from sklearn.decomposition import PCA
# 데이터는 표준화 등의 스케일을 갖추기 위한 전처리가 이루어져야 함
# 학습 데이터를 기반으로 PCA에 의한 변환을 정의
pca = PCA(n_components=5)
pca.fit(train_x)
#n_components : 투영할 차원 수, 0.0~1.0 사이로 값을 설정 시 해당 분산의 비율이 필요한 차원 수로 설정됨
# 변환 적용
train_x = pca.transform(train_x)
test_x = pca.transform(test_x)
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
# TruncatedSVD
#Truncated SVD는 Sigma 행렬에 있는 대각원소 ,즉 특이값 중 상위 일부 데이터만 추출해 분해하는 방식이다.
from sklearn.decomposition import TruncatedSVD
# 데이터는 표준화 등의 스케일을 갖추기 위한 전처리가 이루어져야 함
# 학습 데이터를 기반으로 SVD를 통한 변환 정의
출처: https://seongyun-dev.tistory.com/5 [스어엉의 기술블로그]
svd = TruncatedSVD(n_components=5, random_state=71)
svd.fit(train_x)
# 변환 적용
train_x = svd.transform(train_x)
test_x = svd.transform(test_x)
음수 미포함 행렬 분해(NMF)
음수 미포함 행렬 분해는 음수를 포함하지 않은 행렬 데이터를, 음수를 포함하지 않은 행렬들의 곱의 형태로 만드는 방법이다. 음수가 아닌 데이터에만 사용할 수 있지만 PCA와는 달리 벡터의 합 형태로 나타낼 수 있다.
# 비음수의 값이기 때문에 MinMax스케일링을 수행한 데이터를 이용
train_x, test_x = load_minmax_scaled_data()
from sklearn.decomposition import NMF
# 데이터는 음수가 아닌 값으로 구성
# 학습 데이터를 기반으로 NMF에 의한 변환 정의
model = NMF(n_components=5, init='random', random_state=71)
model.fit(train_x)
# 변환 적용
train_x = model.transform(train_x)
test_x = model.transform(test_x)
잠재 디리클레 할당(LDA)
-잠재 디리클레 할당(LDA)은 자연어 처리에서 문서를 분류하는 토픽 모델(topic model)에서 쓰이는 기법으로 확률적 생성 모델의 일종이다.
-LDA는 베이즈 추론을 이용하여 이 행렬에서 각 문서를 확률적으로 토픽으로 분류한다.
(베이즈 추론(Bayesian inference)은 통계적 추론의 한 방법으로, 추론 대상의 사전 확률과 추가적인 정보를 통해 해당 대상의 사후 확률을 추론하는 방법이다.)
-문서를 분류할 뿐만 아니라 각 토픽에 각 단어가 어느 정도의 확률로 출현하는지도 계산 가능
# LatentDirichletAllocation
# MinMax스케일링을 수행한 데이터를 이용
# 카운트 행렬은 아니지만, 음수가 아닌 값이면 계산 가능
train_x, test_x = load_minmax_scaled_data()
from sklearn.decomposition import LatentDirichletAllocation
# 데이터는 단어-문서의 카운트 행렬 등으로 함
# 학습 데이터를 기반으로 LDA에 의한 변환을 정의
model = LatentDirichletAllocation(n_components=5, random_state=71)
model.fit(train_x)
# 변환 적용
train_x = model.transform(train_x)
test_x = model.transform(test_x)
선형판별분석(linear discriminant analysis)(LDA)
-선형판별분석은 지도 학습의 분류 문제에서 차원축소를 실시하는 방법이다.
-학습 데이터가 n행의 행 데이터와 f개의 특징으로 이루어진 n X f 행렬이라 할 때 f X K의 변환 행렬을 곱함으로써 n X K 행렬로 변환한다.
-차원축소 후의 차원 수 k는 클래스 수보다 줄어들고, 이진 분류일 때는 변환 후에 1차원 값이 된다.
# LinearDiscriminantAnalysis
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# 데이터는 단어-문서의 카운트 행렬 등으로 함
# 학습 데이터를 기반으로 LDA에 의한 변환을 정의
lda = LDA(n_components=1)
lda.fit(train_x, train_y)
# 변환 적용
train_x = lda.transform(train_x)
test_x = lda.transform(test_x)
T-SNE
-데이터를 2차원 평면상에 압축하여 시각화 목적으로 쓰일 때가 많다.
-시각화 방법론이라고 한다.
-사이킷런의 manifold 모듈에도 TSNE가 있지만 아직은 활용이 어려우므로 python-bhtsne를 사용하는 게 좋다.
-코드로 하면 오류가 나는데 python3 재설치를 하는 방법, 주피터 노트북 사용하지 않는 방법 등이 있다.
pip install bhtsne
# t-sne
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
import bhtsne
# 데이터는 표준화 등의 스케일을 갖추기 위한 전처리가 이루어져야 함
# t-sne에 의한 변환
data = pd.concat([train_x, test_x])
embedded = bhtsne.tsne(data.astype(np.float64), dimensions=2, rand_seed=71)
UMAP
-UMAP는 2018년 제안된 새로운 기법으로, t-SNE와 마찬가지로 원래의 특징 공간상에서 가까운 점이 압축
후에도 가까워지도록 표현된다.
-2차원이나 3차원을 넘는 압축도 가능하다고 알려졌다.
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
import umap
# 데이터는 표준화 등의 스케일을 갖추는 전처리가 이루어져야 함
# 학습 데이터를 기반으로 UMAP에 의한 변환을 정의
um = umap.UMAP()
um.fit(train_x)
# 변환 적용
train_x = um.transform(train_x)
test_x = um.transform(test_x)
오토인코더
-오토인코더는 신경망을 이용한 차원 압축 방법이다. 입력 차원보다 작은 중간층을 이용하여 입력과 같은 값으로 출력하는 신경망을 학습함으로써, 원래의 데이터를 재현할 수 있는 더 저차원의 표현을 학습한다.
-오토인코더에는 몇 가지 종류가 있는데 그 중에서도 잡음 제거 오토인코더는 캐글대회의 1위 솔루션에 사용된 적이 있다.
-잡음 제거 오토인코더는 입력된 잡음(노이즈)를 얹어 해당 노이즈를 제거할 수 있도록 학습하는 방법이다.
군집화
클러스터링이라고 부르는 군집화는 데이터를 여러 그룹으로 나누는 비지도 학습이다.
사이킷런의 cluster 모듈로 사용할 수 있다.
-K-means: 고속 계산할 때는 Mini-Batch K-Means도 사용
-DBSCAN
-병합군집: 응집형 계층 클러스터링
MiniBatchKMeans
- 데이터를 미니배치 크기만큼 무작위로 분리하여 K-평균 클러스터링 적용
- K-평균 클러스터링 알고리즘에 중심 위치와 모든 데이터 사이의 거리를 계산해야 하기 때문에 데이터의 개수가 많아지면 계산량도 늘어남
- 데이터의 수가 너무 많을 때는 미니배치 K-평균 클러스터링 알고리즘을 사용하면 계산량을 줄일 수 있음
# 클러스터링
표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
from sklearn.cluster import MiniBatchKMeans
데이터는 표준화 등의 스케일을 갖추는 전처리가 이루어져야 함
학습 데이터를 기반으로 Mini-Batch K-Means를 통한 변환 정의
kmeans = MiniBatchKMeans(n_clusters=10, random_state=71)
kmeans.fit(train_x)
해당 클러스터를 예측
train_clusters = kmeans.predict(train_x)
test_clusters = kmeans.predict(test_x)
각 클러스터 중심까지의 거리를 저장
train_distances = kmeans.transform(train_x)
test_distances = kmeans.transform(test_x)
# 기타 기법
## 배경 메커니즘의 이해
### 사용자 행동에 주목
-사용자 성격, 행동 특징, 행동 사이클을 표현하는 특징 만들기
-이용 목적의 클러스터로 나눠 생각하기
-특정 상품에 대한 선호도가 있을지 생각하기
-같은 물건을 이미 구매한 경우 등 행동 저해 요소는 없을지 생각하기
-사용자가 웹사이트에서 어떤 식으로 화면을 이동하여 상품을 구매했는지 살펴보기
### 서비스 제공 측의 동향 주목
-어떤 상품의 판매 개수가 0이라 해도, 수요 자체가 없었다기보다는 무언가의 사정으로 재고가 없었던 경우일 가능성
-휴가나 유지보수 작업이 그 전후 기간의 서비스 이용에 미치는 영향
-앱/웹 서비스로 검색하면 맨 위에 표시될지 여부와 상관관계가 있을 법한 특징 생성
-앱/웹 서비스에서의 검색이나 리스트 박스의 선택사항을 고려
### 업계에서 주로 사용하는 분석 방법
-RFM 분석이라는 고객 분석 기법을 이용하여 사용자 분류와 특징을 생성
-개인의 신용 리스크를 심사할 때 어떤 항목이 대상이 될 수 있는지 관련 단어로 조사
-질병 진단 기준과 관련해 어떤 식의 점수 책정 방법이나 조건 분기 규칙으로 진단되는지, 어떤 특징과의 조합이 고려되는지 조사
### 여러 변수를 조합하여 지수 작성
-신장이나 체중으로부터 BMI를 구하거나 기온 및 습도에서 불쾌지수를 구하는 등 여러 개의 변수를 조합한 지수를 작성하는 것도 유효할 수 있다.
### 자연 현상의 메커니즘에 주목
-강우량 예측처럼 그 대상이 자연 현상인 문제에서는 해당 분야의 도메인 지식으로 유효한 특징을 생성할 때가 많다.
경진 대회의 대상 서비스 이용
-경진 대회의 대상이 되는 서비스에 실제로 등록하거나 이용해보면 힌트를 얻을 수 있다.
## 행 데이터의 관계성에 주목
-각 행 데이터가 독립적이고 상호 관계를 특정하기 어려운 데이터가 있는 반면, 행 데이터끼리 일부 강한 관계성을 지니는 데이터도 있다.
-행 데이터 간에 일련의 관계성이 있다면 그에 주목하여 새로운 특징을 만들 수 있다.
### 캐글 Caterpillar Tube Pricing 대회
-이 대회의 문제는 기계용 튜브와 구매량의 조합별로 가격을 예측하는 것이었다. 구매량 조합에서 패턴을 찾을 수 있었는데 어떤 구매량 패턴에 해당하는지를 특징으로 삼은게 유효했다.
### 캐글 Quora Question Pairs 대회
-이 대회는 쿼라 웹사이트에 올라오는 질문들을 두 개씩 비교해서 같은 질문 내용인지 여부를 판정하는 이진 분류 문제를 다룬다. 이 대회에서는 질문들이 어떻게 쌍을 이루어 분류되는지 그 관계성을 파악함으로써 점수를 크게 올릴 수 있었다.
### 캐글 Bosch Production Line Performance 대회
-이 경진 대회는 보쉬의 생산 라인 전 과정에서 수집된 복잡한 데이터에 기반을 두고 각 제품의 불량품 여부를 예측하는 데이터 분석 문제를 다루었다. 이때 각 센서의 통과 여부에 관한 패턴을 가시화함으로써, 몇 개의 센서 통과 패턴으로 나눌 수 있는지와 각 제품이 어떤 패턴에 속하는지를 특징으로 생성할 수 있었고 또한 센서를 통과한 다른 제품의 정보를 특징으로 만드는 방법이 활용되었다.
## 상대값에 주목
-어떤 사용자의 값과 그 사용자가 속한 그룹의 평균값의 차이 또는 비율을 구하는 것처럼, 다른 값과 비교했을 때의 차이나 비율과 같은 상대값에 주목하는 것도 효과적이다.
## 위치 정보에 주목
-위도나 경도 등의 위치 정보가 데이터에 포함될 경우 위치 간 거리를 특징으로 고려할 수 있다.
## 자연어 처리 기법
### Bag-of-word(BoW)
-문장 등의 텍스트를 단어로 분할하고, 각 단어의 출현 수를 순서에 상관없이 단순하게 세는 방식이다.
-사이킷런 feature_extraction.text 모듈의 CountVectorizer에서 처리할 수 있다.
### N-gram
-Bow에서 분할하는 단위를, 단어가 아닌 연속되는 단어 뭉치 단위로 끊는 방법이다.
예를 들어 ‘This is a sentence’라는 문장에서 [this, is, a, sentence]라는 4개의 단어를 추출할 수 있지만 2-gram에서는 [This-is, is-a, a-sentence]라는 3개의 단어 뭉치를 추출한다.
-단어 분할에 비해 텍스트에 포함된 정보를 유지하기는 좋지만, 출현 가능한 종류의 수가 크게 늘어날 뿐만 아니라 희소 데이터가 된다.
### Tf-idf
-BoW에서 작성한 단어-문서 카운트 행렬을 변환하는 기법이다.
-단어 빈도(TF): 어떤 텍스트에서의 특정 단어의 출현 비율
-역문서 빈도(IDF): tf와 반대되는 개념으로 특정 단어가 나타나는 문서의 수.
-CounterVectorizer 클래스 등으로 작성된 행렬에 사이킷런 feature_extraction.text 모듈의 Tfidf Transformer를 적용함으로써 이 기법을 처리할 수 있다.
### 단어 임베딩
-단어를 수치 벡터로 변환하는 방법을 단어 임베딩이라고 한다.
## 자연어 처리 기법의 응용
-BoW나 n-gram, tf-idf와 같이 자연어 처리에서 많이 사용되는 기법은 실제 자연어와 관계 없는 데이터에도 적용할 수 있다.
## 토픽 모델을 활용한 범주형 변수 변환
-토픽 모델이라는 문서 분류 기법을 응용하여, 다른 범주형 변수와의 동시출현정보로부터 범주형 변수를 수치 벡터로 변환하는 방법이 있다.
## 이미지 특징을 다루는 방법
-이미지 데이터를 특징으로 만들 때는 이미지넷 데이터로 학습한 신경망으로 이미지를 예측하고, 출력층에 가까운 층의 출력값을 특징으로 하는 방법을 사용한다.
## 결정 트리의 특징 변환
-결정 트리를 작성한 뒤, 각 행 데이터가 분기에 따라 어느 잎 노드으로 떨어지는지를 범주형 변수의 특징으로 만들어 다른 모델에 투입하는 독특한 기술이다.
## 익명화 데이터의 원래 값 추출
-경진 대회에서는 주최자의 의향에 따라 각 변수의 의미가 숨겨져 있거나 또는 값에 표준화와 같은 처리를 가한 상태의 데이터를 제공할 때가 있다. 그러나 데이터를 주의 깊게 관찰하면 변환 전 원래의 값으로 되돌릴 수 있기도 하다.
## 데이터 오류 수정
-일부 데이터가 사용자나 데이터 작성자의 입력 오류로 인해 잘못되었다고 추측될 경우, 수정을 거치면서 품질이 더 좋은 데이터로 학습시킬 수 있다.
'TAVE 활동 > Kaggle study' 카테고리의 다른 글
캐글 스터디 5주차(최종) 앙상블기법 (0) | 2021.07.15 |
---|---|
캐글 스터디 4주차 모델평가 (0) | 2021.07.15 |
캐글 스터디 2주차 특징생성 (0) | 2021.07.15 |
캐글 스터디 1주차 평가지표 (0) | 2021.07.15 |