캐글 스터디 3주차 차원 축소와 비지도학습의 특징, 기타 기법

7 minute read

슬라이드3_1

목차

슬라이드3_2

주성분 분석

슬라이드3_3

데이터 준비

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-평균 클러스터링 알고리즘을 사용하면 계산량을 줄일 수 있음 ```python

    클러스터링

표준화된 데이터를 사용

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와 같이 자연어 처리에서 많이 사용되는 기법은 실제 자연어와 관계 없는 데이터에도 적용할 수 있다.

토픽 모델을 활용한 범주형 변수 변환

-토픽 모델이라는 문서 분류 기법을 응용하여, 다른 범주형 변수와의 동시출현정보로부터 범주형 변수를 수치 벡터로 변환하는 방법이 있다.

이미지 특징을 다루는 방법

-이미지 데이터를 특징으로 만들 때는 이미지넷 데이터로 학습한 신경망으로 이미지를 예측하고, 출력층에 가까운 층의 출력값을 특징으로 하는 방법을 사용한다.

결정 트리의 특징 변환

-결정 트리를 작성한 뒤, 각 행 데이터가 분기에 따라 어느 잎 노드으로 떨어지는지를 범주형 변수의 특징으로 만들어 다른 모델에 투입하는 독특한 기술이다.

익명화 데이터의 원래 값 추출

-경진 대회에서는 주최자의 의향에 따라 각 변수의 의미가 숨겨져 있거나 또는 값에 표준화와 같은 처리를 가한 상태의 데이터를 제공할 때가 있다. 그러나 데이터를 주의 깊게 관찰하면 변환 전 원래의 값으로 되돌릴 수 있기도 하다.

데이터 오류 수정

-일부 데이터가 사용자나 데이터 작성자의 입력 오류로 인해 잘못되었다고 추측될 경우, 수정을 거치면서 품질이 더 좋은 데이터로 학습시킬 수 있다.

Leave a comment