[머신러닝] 지도 학습
지도 학습(Supervised Learning)은 기계학습(machine learning)의 한 분야로, 입력(input)과 해당 출력(output) 즉, 예측하려는 타겟(target) 데이터 사이의 관계를 모델링하는 과정입니다. 이러한 학습 방법은 미리 준비된, 레이블(label) 또는 타겟(target)이 지정된 학습 데이터(훈련 데이터)를 사용하여 이루어지며, 이 데이터를 통해 알고리즘이 패턴이나 규칙을 학습합니다. 지도 학습의 목표는 새로운 미지의 데이터에 대해 정확한 예측 또는 분류를 할 수 있는 모델을 만드는 것입니다.
지도 학습의 중요성은 데이터에서 의미있는 정보를 추출하여 예측(predictive) 모델링을 가능하게 한다는 점에서 찾을 수 있습니다. 이는 다양한 실생활 적용 분야에서 큰 가치를 발휘합니다. 예를 들면, 은행은 지도 학습을 사용하여 고객의 대출 상환 능력을 예측할 수 있으며, 이메일 서비스는 스팸 메일을 필터링하기 위해 지도 학습 모델을 사용합니다. 의료 분야에서는 의사가 환자의 진단 데이터를 바탕으로 병의 유무를 예측하는 데 지도 학습을 활용할 수 있습니다. 이외에도 자율주행 자동차, 얼굴 인식, 금융 사기 탐지 등 다양한 최첨단 기술 분야에서도 지도 학습이 중요한 역할을 합니다.
지도 학습의 적용 분야는 광범위하며, 여기에는 분류(Classification)와 회귀(Regression)가 주요 유형으로 포함됩니다. 분류는 입력 데이터를 주어진 카테고리 중 하나로 할당하는 작업(예: 이메일이 스팸인지 아닌지 결정하기), 회귀는 연속적인 숫자(예: 부동산의 가격 예측)를 예측하는 작업입니다. 두 유형 모두 다양한 실제 문제 해결에 널리 사용됩니다.
Python 예시:
지도 학습 프로세스를 간단한 선형 회귀 예시로 살펴보겠습니다. 선형 회귀는 가장 기본적인 지도 학습 알고리즘 중 하나로, 데이터 포인트 사이의 선형 관계를 모델링합니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 임의의 데이터 생성
X = np.array([5, 15, 25, 35, 45, 55]).reshape((-1, 1)) # 입력 데이터
Y = np.array([5, 20, 14, 32, 22, 38]) # 타겟 데이터
# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X, Y)
# 예측하기
X_new = np.array([60]).reshape((-1, 1))
Y_pred = model.predict(X_new)
print(f"예측값: {Y_pred[0]}")
# 데이터와 회귀선 시각화
plt.scatter(X, Y, color='blue')
plt.plot(X, model.predict(X), color='red')
plt.title('Linear Regression')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
이 예시에서 사용된 선형 회귀 모델은 지도 학습의 한 예로, 주어진 타겟에 대한 입력 데이터의 선형 관계를 학습합니다. 여기서 학습된 모델은 새로운 데이터에 대한 예측을 수행할 수 있음을 보여줍니다.
지도 학습은 데이터 과학과 인공 지능 분야에 있어서 필수적인 기법 중 하나이며, 그 중요성과 적용 분야는 앞으로도 계속해서 확장될 것입니다. 이를 통해 우리는 복잡한 문제를 해결하고, 기술 발전을 촉진시키며, 삶의 질을 향상시킬 수 있는 새로운 기회를 창출할 수 있습니다.
지도 학습의 핵심 요소
지도 학습은 머신러닝의 가장 널리 사용되는 접근 방식 중 하나로, 모델이 입력 데이터로부터 타겟 값을 예측하도록 훈련하는 과정입니다. 이 과정에서 중추적인 역할을 하는 요소들이 있으며, 가장 핵심적인 것들은 레이블된 데이터, 특성(Features), 그리고 타겟(Target)입니다.
레이블된 데이터
레이블된 데이터는 각 입력 데이터 포인트에 대해 정답(타겟)이 주어진 데이터 세트입니다. 예를 들어, 개와 고양이의 이미지를 분류하는 모델을 훈련시키는 경우, 각 이미지(입력 데이터)에는 '개' 또는 '고양이'라는 레이블(타겟)이 붙어 있습니다. 이 레이블은 모델이 예측을 수행하는 데 기준점으로 사용됩니다.
레이블된 데이터의 중요성은 뚜렷합니다. 레이블은 모델이 올바른 예측을 하는지 평가하는 기준을 제공하기 때문입니다. 또한, 모델이 데이터의 패턴을 학습하고 그 패턴을 새로운 데이터에 적용하여 예측을 수행할 수 있게 해줍니다.
특성(Features)과 타겟(Target)
특성(입력 변수)의 정의
특성은 모델이 예측을 수행하기 위해 입력으로 사용하는 데이터 포인트입니다. 예를 들어, 주택 가격을 예측하는 모델을 생각해 보겠습니다. 주택의 위치, 크기, 방의 개수, 건축 연도 등은 모두 주택 가격(타겟)을 예측하기 위해 사용될 수 있는 특성입니다. 이러한 특성들은 모델에게 주택 가격에 영향을 줄 수 있는 다양한 측면의 정보를 제공합니다.
타겟(출력 변수)의 정의
타겟은 모델이 예측하고자 하는 값을 의미합니다. 위의 예시에서는 주택의 가격이 타겟이 됩니다. 지도 학습 과정에서 모델은 주어진 특성을 바탕으로 타겟 값을 정확히 예측하도록 훈련됩니다.
예시를 통한 특성과 타겟의 이해
간단한 선형 회귀 예시를 통해 특성과 타겟의 개념을 더 깊게 이해해 보겠습니다.
이메일 마케팅 캠페인의 성공을 예측하는 모델을 구축한다고 가정해 봅시다. 여기서 목표는 이메일이 사용자에게 얼마나 잘 전달되는지(예: 열린 비율)를 예측하는 것입니다. 이 경우, 특성은 다음과 같을 수 있습니다:
- 이메일을 보낸 시간
- 이메일의 제목 길이
- 이메일의 주제 카테고리
타겟은 이메일이 열릴 확률, 즉 '열린 비율'입니다.
import pandas as pd
# 예를 들어, 이메일 마케팅 데이터가 다음과 같다고 가정합니다.
data = {
'Sent Time': ['Morning', 'Afternoon', 'Night'],
'Subject Length': [10, 35, 25],
'Category': ['Promotion', 'Newsletter', 'Update'],
'Open Rate': [0.15, 0.04, 0.10] # 타겟 변수
}
df = pd.DataFrame(data)
print(df)
이 예시에서 세 가지 특성은 이메일 캠페인의 성공을 예측하기 위해 사용됩니다. 모델은 이 데이터를 사용하여 주어진 특성으로부터 'Open Rate'을 예측하는 방식을 학습합니다.
지도 학습의 주요 유형
지도 학습은 머신러닝의 핵심 분야로, 입력 데이터와 그에 대응하는 결과 값(라벨) 사이의 관계를 모델링하는 과정입니다. 지도 학습의 주요 목표는 새로운, 미지의 데이터에 대한 예측을 수행하는 데 있습니다. 이 과정은 크게 두 가지 주요 유형으로 나눌 수 있습니다: 분류와 회귀입니다.
분류(Classification)
분류는 데이터를 미리 정의된 여러 클래스 중 하나로 분류하는 과업입니다. 이 과정에서 모델은 입력 데이터를 기반으로 해당 데이터가 어떤 카테고리에 속하는지를 판단합니다.
-
분류의 개념: 분류는 범주형 목표 변수를 예측하는 과정입니다. 예를 들어, 이메일이 스팸인지 아닌지를 판별하거나, 은행 거래가 사기인지 아닌지를 구별하는 경우가 분류 문제에 해당합니다.
-
이진 분류와 다중 분류의 차이:
-
이진 분류(Binary Classification): 출력 클래스가 두 개인 경우입니다. 예를 들면, 이메일이 '스팸' 또는 '정상'과 같이 두 가지 상태만을 분류합니다.
-
다중 분류(Multiclass Classification): 세 개 이상의 클래스로 데이터를 분류하는 경우입니다. 예를 들어, 이메일을 '업무', '개인', '스팸' 등 여러 카테고리로 분류하는 상황입니다.
-
Python 예시: 이진 분류
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# 데이터 로드
data = load_breast_cancer()
X, y = data.data, data.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = LogisticRegression()
model.fit(X_train, y_train)
# 예측
predictions = model.predict(X_test)
회귀(Regression)
회귀는 연속적인 값을 예측하는 과업입니다. 예를 들어, 집의 크기나 위치 등을 바탕으로 집의 가격을 예측하는 것이 회귀 문제에 해당합니다.
-
회귀의 개념: 회귀는 하나 이상의 독립변수와 연속적인 종속변수와의 관계를 모델링합니다. 목표는 독립변수의 값을 바탕으로 종속변수의 값을 예측하는 것입니다.
-
선형 회귀와 비선형 회귀의 차이점:
-
선형 회귀(Linear Regression): 독립변수와 종속변수 사이의 관계가 선형적, 즉 직선으로 표현될 수 있는 경우입니다. 가장 기본적이고 널리 사용되는 회귀 방법 중 하나입니다.
-
비선형 회귀(Non-linear Regression): 독립변수와 종속변수 사이의 관계가 비선형적인, 즉 직선 이외의 형태(곡선 등)로 표현되는 경우입니다. 선형 회귀로는 적절히 모델링할 수 없는 복잡한 데이터 구조를 다룰 때 사용됩니다.
-
Python 예시: 선형 회귀
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# 데이터 로드
data = load_boston()
X, y = data.data, data.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)
# 예측
predictions = model.predict(X_test)
이렇게 분류와 회귀는 지도 학습의 두 가지 주요 유형으로, 각기 다른 유형의 예측 문제를 해결하는 데 사용됩니다. 분류는 범주형 결과를, 회귀는 연속적인 결과를 예측하는 데 적합합니다.
학습 과정
지도 학습은 머신러닝의 중심적 접근 방식 중 하나로, 데이터와 그에 대응하는 정답(라벨)을 통해 모델을 훈련시키는 과정입니다. 이 과정은 크게 데이터 준비, 모델 선택, 모델 훈련, 그리고 모델 평가의 단계로 나누어집니다. 각 부분은 머신러닝 모델을 성공적으로 구축하기 위한 필수적인 단계입니다.
데이터 준비
데이터 수집 및 정제:
데이터 준비는 지도 학습의 핵심입니다. 첫 번째 단계는 관련 데이터를 수집하는 것입니다. 이 데이터는 웹 스크래핑, API, 공공 데이터 세트 등 다양한 방법으로 수집할 수 있습니다. 수집한 데이터는 종종 누락된 값, 이상치, 중복 또는 불필요한 속성을 포함하고 있습니다. 데이터 정제는 이러한 문제를 해결하여 데이터의 품질을 향상시키는 과정입니다.
훈련 세트와 테스트 세트 분리:
모델이 학습한 내용을 정확하게 평가하기 위해 원본 데이터 세트를 훈련 세트와 테스트 세트로 분리합니다. 일반적으로 데이터의 약 70%~80%를 훈련 세트로 사용하고 나머지 20%~30%를 테스트 세트로 사용합니다. 이 분리는 과적합을 방지하고 모델의 일반화 능력을 평가하는 데 중요합니다.
모델 선택
기본적인 지도 학습 알고리즘 소개:
지도 학습 알고리즘에는 선형 회귀, 로지스틱 회귀, 서포트 벡터 머신(SVM), 결정 트리, 랜덤 포레스트 등이 있습니다. 각 알고리즘은 데이터의 특징과 해결하려는 문제의 유형(회귀 또는 분류)에 따라 다르게 적용됩니다.
어떤 경우에 어떤 모델을 선택할지에 대한 가이드라인:
- 회귀 문제(예: 집 가격 예측)의 경우 선형 회귀나 결정 트리 회귀를 고려할 수 있습니다.
- 분류 문제(예: 이메일 스팸 분류)의 경우 로지스틱 회귀, SVM, 또는 랜덤 포레스트와 같은 알고리즘을 사용할 수 있습니다.
- 데이터의 특성(예: 비선형 관계, 고차원)에 따라서는 SVM이나 결정 트리 기반의 알고리즘이 더 적합할 수 있습니다.
모델 훈련
모델을 학습하는 과정:
모델 훈련은 선택한 알고리즘에 훈련 데이터를 공급하여 진행됩니다. 이 과정에서 모델은 주어진 입력(특성)에서 출력(라벨)을 예측하기 위한 내부 매개변수를 조정합니다.
손실 함수와 최적화 방법:
손실 함수는 모델의 예측이 실제 값과 얼마나 차이가 나는지를 나타내는 지표입니다. 대표적인 예로, 회귀 문제에서는 평균 제곱 오차(MSE), 분류 문제에서는 크로스 엔트로피 손실을 사용합니다. 최적화 방법은 손실 함수의 값을 최소화하는 모델의 매개변수를 찾는 과정입니다. 경사 하강법이 가장 널리 사용되는 최적화 기법 중 하나입니다.
모델 평가
정확도, 정밀도, 재현율 등 주요 평가 지표:
모델의 성능을 평가하기 위해 사용되는 지표로는 정확도, 정밀도, 재현율, F1 점수 등이 있습니다. 이러한 지표들은 모델이 얼마나 잘 작동하는지를 다양한 각도에서 측정합니다.
테스트 세트를 이용한 모델 평가 방법:
훈련 과정에서는 본 적이 없는 데이터인 테스트 세트를 사용하여 모델을 평가합니다. 이를 통해 모델이 훈련 데이터에 과적합되었는지, 아니면 일반화를 잘하는지를 평가할 수 있습니다. 모델의 성능은 앞서 언급한 평가 지표를 사용하여 측정됩니다.
모델 개선
하이퍼파라미터 튜닝
하이퍼파라미터는 모델의 학습 과정이나 구조를 조절하는 데 사용되는 외부 설정 값들입니다. 이들은 모델 학습 전에 설정되며, 모델의 성능에 큰 영향을 미칩니다. 예를 들어, 결정 트리의 깊이, 학습률, 배치 크기 등이 있습니다. 하이퍼파라미터의 최적 조합을 찾는 과정은 모델 성능을 개선하는 데 있어 필수적입니다.
기본적인 튜닝 방법 소개
- 그리드 탐색 (Grid Search): 하이퍼파라미터의 여러 조합을 사전에 정의해두고, 이 조합들을 모두 시도해보며 최적의 조합을 찾아내는 방법입니다. 매우 직관적이지만, 시간이 많이 소요될 수 있습니다.
- 랜덤 탐색 (Random Search): 하이퍼파라미터의 범위를 지정해두고, 그 안에서 랜덤하게 조합을 선택하여 시도해보는 방법입니다. 그리드 탐색에 비해 더 빠르게 좋은 결과를 얻을 수 있을 때가 많습니다.
- 베이지안 최적화 (Bayesian Optimization): 이전의 평가 결과를 바탕으로 하이퍼파라미터의 가장 유망한 조합을 예측하고, 그 예측을 바탕으로 새로운 하이퍼파라미터를 선택하는 방법입니다. 효율적이고 체계적인 탐색이 가능합니다.
# 사이킷런을 사용한 그리드 탐색 예시 코드
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
# 탐색할 하이퍼파라미터 그리드 정의
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [5, 10, 15]
}
# 모델 초기화
rf = RandomForestClassifier()
# 그리드 탐색 수행
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 최적의 하이퍼파라미터 출력
print(grid_search.best_params_)
교차 검증
교차 검증은 모델을 학습시키고 평가하는 방법 중 하나로, 데이터의 특정 부분을 훈련용으로, 나머지를 검증용으로 반복적으로 나누어 테스트하는 과정입니다. 이 방법을 통해 모델의 일반화 능력을 평가할 수 있습니다.
교차 검증의 중요성
교차 검증은 데이터의 과적합(overfitting)을 방지하고, 모델의 실질적인 성능을 더 잘 평가할 수 있게 해줍니다. 특히 데이터가 부족할 때 효과적입니다. 모든 데이터를 훈련과 검증에 활용할 수 있기 때문에, 데이터 활용도가 높아집니다.
기본 방법
- K-겹 교차 검증 (K-Fold Cross Validation): 데이터셋을 K개의 부분으로 나누고, K번의 실험을 각각 다른 테스트 세트를 가지고 반복하여, 모델의 성능을 평가하는 방법입니다.
- 리브-P-아웃 교차 검증 (Leave-P-Out Cross Validation): 데이터셋에서 P개의 샘플을 빼고 나머지로 모델을 훈련시킨 후, 뺀 샘플을 가지고 평가를 반복하는 과정입니다. 모든 가능한 조합을 테스트합니다.
# 사이킷런을 사용한 K-겹 교차 검증 예시 코드
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# 모델 초기화
rf = RandomForestClassifier(n_estimators=100, max_depth=10)
# 교차 검증 수행 (5-겹)
scores = cross_val_score(rf, X, y, cv=5)
# 평균 성능 출력
print("Average Score:", np.mean(scores))
하이퍼파라미터 튜닝과 교차 검증을 통해 모델의 성능을 체계적으로 개선할 수 있습니다. 이 과정은 모델이 가진 잠재력을 최대한 발휘하게 함으로써, 실제 문제에 대한 최적의 해결 방안을 찾아내는 데 큰 기여를 합니다.