<읽어보면 좋은 글 - Don't learn machine learning - 머신러닝 공부하지 마세요!>
머신(Machine)이란?
학습(Learning)이란?
데이터는 피처(feature)와 라벨(label)로 구성됨
라벨은 y로 표기하며, 라벨의 유무로 지도학습, 비지도학습을 구분함
데이터 X의 특징, 혹은 항목을 의미
N
: 데이터 샘플 개수, D
: 피처의 개수
주어진 데이터(입력값) 말고, 모델이 가지고 있는 학습 가능한 파라미터
w_0
, w_1
,…, w_D
심장병 발생에 혈액형, 나이, 성별이라는 feature가 있을 때 각각의 feature가 심장병 발생에 끼치는 영향력
모델 학습에 있어, 인간이 정해야하는 변수들
학습률, 배치 크기 등등
지도학습은 말 그대로 정답이 있는 데이터를 활용해 데이터를 학습시키는 것.
입력값(X
)이 주어지면 입력값에 대한 Label(Y
)를 주어 학습시키며 대표적으로 분류, 회귀 문제가 있다.
X
에 22, 45 등을 주고 라벨 데이터 셋을 입력 데이터 셋의 정답인 4, 20등을 주면 해당 모델은 주어지지 않은 데이터 5*5 등의 정답을 해결할 수 있다.분류는 주어진 데이터를 정해진 카테고리(라벨)에 따라 분류하는 문제를 말한다.
O, X여부를 판별하는 이진분류 문제, 사과, 바나나, 포도 등 2가지 이상으로 분류하는 다중 분류 문제가 있다.
회귀는 어떤 데이터들의 Feature를 기준으로, 연속된 값(그래프)을 예측하는 문제로 주로 어떤 패턴이나 트렌드, 경향을 예측할 때 사용된다.
분류와 다르게 예측값이 어떤 수나 실수로 표현된다.
앙상블 기법 이란 여러 개의 개별 모델을 조합하여 최적의 모델로 일반화 하는 방법.
Weak classifier 들을 결합하여 strong classifier를 만드는 것.
앙상블 기법에는 voting, bagging, boosting, stacking이 있다.
보팅(Voting)
보팅은 다양한 머신 러닝 알고리즘들이 투표를 통해 결합하여 예측을 수행하는 방법이다.
보팅은 크게 하드 보팅과 소프트 보팅으로 나뉜다.
하드 보팅
소프트 보팅
예측 결과에 대한 확률을 고려하여 최종 예측을 수행하므로, 소프트 보팅이 더 선호된다.
베깅 (bagging)
부스트랩을 집계 (Boostrap aggregating)
각각의 분류기들이 학습 시 상호 영향을 주지 않은 상황에서 학습이 끝난 다음 결과를 종합하는 기법이다.
배깅은 보팅과 비슷하게 보이지만 사진처럼 차이가 있다.
보팅은 각각 다른 알고리즘을 이용한 분류기를 결합하는 방식으로 최종 예측 값을 투표하는 방식이다.
배깅은 서로 같은 알고리즘을 이용한 분류기가 데이터 샘플링을 각자 다르게 가져가면서 학습을 수행하는 방식이다.
부스팅(boosting)
부스팅 알고리즘은 여러 개의 학습기를 순차적으로 학습/예측 하면서 잘못 예측한 데이터나 학습 트리에 가중치를 부여해 오류를 개선해 나가면서 학습하는 방식이다.
병렬적으로 처리해 평균을 내는 배깅과 달리 순차적으로 모델을 실행한다는 것이 다른 점이다.
부스팅은 대표적으로 AdaBoost와 Gradient Boost(GBM) 그리고 GMB기반의 다른 모델인 XGBoost 등이 있다.
각각의 모델마다 장단점이 있기 때문에 자신의 데이터 셋에 맞는 모델을 선정하는게 중요하다.
비지도 학습은 레이블이 지정되지 않은 데이터 세트를 분석하고 군집화 한다.
일반적인 비지도 학습 접근 방식은 아래 3가지가 있다.
군집화(Clustering)
레이블이 지정되지 않은 데이터를 유사점 또는 차이점에 따라 그룹화 하는 기술.
군집화 알고리즘 유형
배타적 군집화 : 하나의 군집에 하나의 데이터 요소만 포함 (예 : K-평균 군집화)
중첩적 군집화 : 데이터 요소가 여러 군집에 포함될 수 있음 (예 : 퍼지 K-평균 군집화)
계층적 군집화 : 데이터 요소를 반복적으로 병합하거나 분리 (예 :HCA)
확률적 군집화 : 특정 분포에 속할 가능성에 따라 군집화 (예 : 가우스 혼합 모델, GMM)
연관 규칙 (Association Rules)
특정 데이터 세트에서 변수 간의 관계를 발견하여 규칙을 생성하는 방법
활용 예시 : 장바구니 분석, 추천 엔진 (예 : Amazon의 “이 상품을 구매한 고객이 함께 구입한 상품“)
알고리즘 예시 : Apriori 알고리즘 – 빈발 항목 집합을 식별하고 소비 가능성을 예측
차원 축소 (Dimensionality Reduction)
목적 : 데이터의 많은 차원을 줄여 성능 최적화 및 시각화 용이성 증가
방법
주성분 분석 (PCA)
원리 : 데이터 변환을 통해 분산을 최대화하는 주성분 추출
특징 : 중복 최소화, 데이터 압축
비정칙 값 분해(SVD)
오토인코더 (Autoencoder)
특징 : 신경망을 사용한 데이터 압축 및 재생성
구조 : 인코딩과 디코딩 단계로 나뉨 (입력 -> 압축 -> 출력)
예제 코드
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 랜덤한 2D 데이터를 생성합니다.
np.random.seed(0)
X = np.random.rand(100, 2)
# K-평균 클러스터링을 사용하여 데이터를 군집화합니다.
k = 3 # 군집의 개수
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(X)
# 각 데이터 포인트의 군집 레이블을 예측합니다.
labels = kmeans.labels_
# 각 군집의 중심점을 얻어옵니다.
centers = kmeans.cluster_centers_
# 데이터를 시각화합니다.
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', marker='o')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='x')
plt.title("K-Means Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
강화학습은 머신러닝의 한 부류로, 비지도 및 지도 학습과 달리 정적 데이터셋에 의존하지 않고 역동적인 환경에서 수집된 경험을 통해 학습한다.
이는 환경과 소프트웨어 에이전트 간의 시행착오 상호작용을 통해 데이터를 수집하기 때문에, 별도의 데이터 수집, 전처리 및 레이블 지정이 필요하지 않다.
적절한 인센티브가 주어지면 강화학습 모델은 인간의 개입 없이 학습을 시작할 수 있다.
강화학습의 주요 응용 분야
고급 제어 : 비선형 시스템을 제어하는 데 사용된다.
자율주행 : 카메라와 라이다 등의 센서를 기반으로 주행 결정을 내린다.
로봇공학 : 픽앤플레이스 등의 응용 분야에서 로봇 팔 학습에 사용된다. 또한 인간-로봇 및 로봇-로봇 협업에도 적용될 수 있다.
스케줄링 : 신호등 제어와 공장 리소스 배치 등 다양한 조합 최적화 문제에 활용된다.
보정 : ECU(Electronic Control Unit) 보정 등 파라미터의 수동 보정이 필요한 분야에 효과적이다.
예제 코드
import numpy as np
import gym
import warnings
# DeprecationWarning 무시
warnings.filterwarnings("ignore", category=DeprecationWarning)
# FrozenLake 환경을 불러옵니다.
env = gym.make("FrozenLake-v1", is_slippery=False, render_mode='human')
# Q-테이블 초기화
Q = np.zeros((env.observation_space.n, env.action_space.n))
# 하이퍼파라미터들
learning_rate = 0.8
discount_factor = 0.95
num_episodes = 1000
# 탐험 및 탐사에 대한 설정(Epsilon-Greedy)
epsilon = 0.1
max_steps_per_episode = 100
# 학습 과정
for episode in range(num_episodes):
state = env.reset()
state = state[0] if isinstance(state, (tuple, list)) else state # 상태가 튜플 또는 리스트인 경우 첫 번째 요소 선택
done = False
step = 0
while not done and step < max_steps_per_episode:
# Epsilon-Greedy 정책
if np.random.uniform(0, 1) < epsilon:
action = env.action_space.sample()
else:
action = np.argmax(Q[state, :])
# 행동을 취하고 환경으로부터 보상 및 앞으로의 상태를 얻습니다.
new_state, reward, done, truncated, _ = env.step(action)
new_state = new_state[0] if isinstance(new_state, (tuple, list)) else new_state # 상태가 튜플인 경우 첫 번째 요소 선택
# Q-값 업데이트 식
Q[state, action] = Q[state, action] + learning_rate * (reward + discount_factor * np.max(Q[new_state, :]) - Q[state, action])
# 상태 업데이트
state = new_state
step += 1
# 학습이 끝난 후의 Q-테이블
print("훈련된 Q-테이블:")
print(Q)
# 환경에서 랜더링하면서 에이전트가 학습한 정책을 시각적으로 확인합니다.
state = env.reset()
state = state[0] if isinstance(state, (tuple, list)) else state # 상태가 튜플인 경우 첫 번째 요소 선택
done = False
step = 0
env.render()
while not done and step < max_steps_per_episode:
action = np.argmax(Q[state, :])
new_state, reward, done, truncated, _ = env.step(action)
new_state = new_state[0] if isinstance(new_state, (tuple, list)) else new_state # 상태가 튜플인 경우 첫 번째 요소 선택
env.render()
state = new_state
step += 1
env.close()
Y(라벨) ML 규칙 : 정답지를 모델에게 주면 안됨.
학습데이터 0.8, 테스트데이터 0.2. 둘다 X와 y가 존재함.
학습 시에는 무조건 학습데이터만 사용하고 평가데이터를 사용하면 안됨.
평가 데이터를 모델 학습에 사용해선 안된다.
학습 데이터에서는 y를 모델에게 주면 안된다.
학습 데이터도 x로 예측만 시키고, 그 예측 값을 받아서 y와 비교하는 것.
그리고 얼마나 틀렸는지 오류 값을 다시 머신에게 넘겨줌. 이걸 순환하면서 작동함.