본문 바로가기
Drawing (AI)/DeepLearning

Udemy - 딥러닝의 모든 것(SOM)-(2)

by 생각하는 이상훈 2024. 1. 3.
728x90

간단한 예시

SOM의 개념에 대해서 공부한 글에서 살펴봤듯 자기 조직화 지도(SOM) 방식은 각 포인트들이 범위를 설정하여 주변 노드들을 끌어당겨 각각에 맞는 노드들을 갖게 되어 특정한 topology를 그려내는 것이다.

weight를 어떻게 잡느냐에 따라 위와 같이 색별로 모여서 map을 완성하는 것을 볼 수 있다.


Advanced SOM

아래 사진은 미국 국회의원들의 각 이슈에 대한 투표 결과를 통해 자기 조직화 지도를 그린 모습이다. 실제 정당별 의원은 세번째 사진에 나타나있다.

첫번째 'Clusters' 사진은 오직 두개의 부류만 있다고 했을때 어떻게 분류했는지 그 결과를 나타내는 것이다.

두번째 'Unified Distance Matrix'에서는 밝을 수록 unit끼리 가깝다는 뜻이므로 실제와 유사하게 다른 부류가 만난 중앙부에서는 유닛간의 거리가 멀 것이므로 색이 어두운것을 볼 수 있다.

세번째는 정당에 따라 분류가 된 것이고 그외의 나머지 SOM은 각 사안에 대해 red가 찬성 blue가 반대 투표를 한 것을 나타낸 것이다.

이때 노란 색은 위의 노드들이 각각 1대1 대응이 아니기 때문에 예를 들어 1대4로 대응된 노드에서 4명이 모두 찬성을 하면 진한 빨강으로 나타나고 2명만 찬성을 하면 노란색으로 나타는 것이다. 


실습

아래와 같은 신용카드 이용 데이터를 활용하여 잠재적 사기 발생 가능성 고객을 찾아내는 모델을 만들어 볼 것이다.

이때 고차원의 데이터에서 이진분류를 해내기 위해 비지도학습을 이용할 것이고 그중 SOM을 이용해볼 것이다.

class는 신용카드가 승인되었으면 1, 승인되지 않았으면 0으로 분류되어있다.

비지도 학습을 진행할 것이기 때문에 class 부분은 학습할때는 제거하고 진행할 것이다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 데이터셋을 불러옵니다.
dataset = pd.read_csv('Credit_Card_Applications.csv')

# 데이터셋을 특성(features)과 레이블(labels)로 분리합니다.
X = dataset.iloc[:, :-1].values  # 모든 행, 마지막 열을 제외한 모든 열
y = dataset.iloc[:, -1].values  # 모든 행, 마지막 열만

# 특성 스케일링: 모든 값을 0과 1 사이로 조정합니다.
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0,1))
X = sc.fit_transform(X)

# MiniSom 객체를 생성합니다.
from minisom import MiniSom
som = MiniSom(x=10, y=10, input_len= 15, sigma= 1.0, learning_rate = 0.5)

# 가중치를 초기화하고 훈련합니다.
som.random_weights_init(X)
som.train_random(data = X, num_iteration = 100)

# SOM의 결과를 시각화합니다.
from pylab import bone, pcolor, colorbar, plot, show
bone()  # 배경 생성
pcolor(som.distance_map().T)  # 거리 맵을 플롯
colorbar()  # 컬러바 추가
markers = ['o', 's']  # 마커 설정
colors = ['r', 'g']  # 컬러 설정
for i, x in enumerate(X):
    w = som.winner(x)  # 각 샘플의 우승 노드를 찾습니다.
    plot(w[0] + 0.5,  # 플롯 위치 X 조정
         w[1] + 0.5,  # 플롯 위치 Y 조정
         markers[y[i]],  # 마커 형태
         markeredgecolor = colors[y[i]],  # 마커 테두리 색상
         markerfacecolor = 'None',  # 마커 내부 색상 없음
         markersize = 10,  # 마커 크기
         markeredgewidth = 2)  # 마커 테두리 너비
show()

# SOM에서 각 노드에 매핑된 데이터를 추출합니다.
mappings = som.win_map(X)

# 사기 거래로 추정되는 데이터를 선택합니다.
frauds = np.concatenate((mappings[(8,1)], mappings[(6,8)]), axis = 0)

# 역스케일링을 통해 원래 데이터로 복원합니다.
frauds = sc.inverse_transform(frauds)

# 사기 거래 고객 ID를 출력합니다.
print('Fraud Customer IDs')
for i in frauds[:, 0]:
  print(int(i))

SOM 결과 시각화

 

예상 사기 고객 출력 결과

위와 같이 사기를 칠것으로 예상되는 위험 고객 리스트를 뽑았고 실무에서 은행은 위 고객들을 대상으로 심층 감시를 통해 범죄를 예방할 수 있을 것이다.


 

728x90