[SK쉴더스 루키즈 24기] 머신러닝 기초(1) 데이터 준비 및 지도학습

아굥·2024년 12월 23일
1

SK Shieldus Rookies

목록 보기
8/32

머신러닝 개요 및 지도학습 소개

1. 머신러닝 정의

데이터를 기반으로 스스로 학습하여 패턴을 발견하고, 이를 통해 미래의 결과를 예측 또는 의사결정을 내리는 기술

  • 컴퓨터가 데이터를 기반으로 학습을 통해 규칙(함수)를 만듦

입력(Features)과 출력(Target)의 개념

  • 입력: 모델이 학습할 때 사용하는 데이터의 특성
    ㄴ> 데이터를 구성하는 각 요소로, 예측이나 분류에 영향을 미치는 중요한 정보임
  • 출력: 모델이 예측해야 하는 결과 값, 문제의 정답 또는 구하고자 하는 목표

2. 지도학습과 비지도학습

1) 지도 학습

데이터와 함께 해당 데이터에 대한 정답(라벨)을 제공하여 모델이 학습하도록 하는 방법
-> 질문과 답을 주고 학습시키는 방식

  • 모델은 데이터-정답 관계를 학습하고, 이후 새로운 데이터가 입력되면 정답을 예측함
  • 예측 및 분류 작업 시 적용 가능

주요 알고리즘

  • 회귀(Regression): 연속적인 값(숫자)를 예측하는 문제를 해결
    ㄴ> 입력 데이터와 출력 값 간의 수학적 관계(선형/비선형)를 모델링
    선형 회귀(Linear Regression): 입력 변수-출력 변수 사이 관계를 직선으로 표현

  • 분류(Classification): 데이터를 미리 정의된 범주로 나누는 문제를 해결
    ㄴ> 입력 데이터를 보고 각 데이터가 어떤 범주에 속하는지 판단
    선형 회귀(Linear Classification): 출력 값을 특정 범주로 분류하고 그 결과는 0-1 사이 확률 값으로 나타냄 -> 특정 기준을 넘어가면 해당 범주로 분류

2) 비지도학습

데이터는 있지만 정답(라벨)은 주어지지 않은 상태에서 학습하는 방법
-> 질문만 주고 답은 스스로 찾도록 하는 방식

  • 모델이 스스로 데이터를 분석하여 패턴이나 그룹을 찾아냄
  • 데이터 이해 및 탐색 시 적용 가능

3. 데이터의 역할과 필요성

1) 학습의 기반

  • 모델이 학습하는데 필요한 정보를 제공함
  • 데이터를 통해 입력(Features)과 출력(Target) 사이 관계를 파악함

2) 패턴 발견 및 예측 가능

  • 데이터를 분석하여 숨겨진 패턴을 찾고, 이를 바탕으로 새로운 데이터를 예측함
    ㄴ> 데이터가 없으면 패턴을 학습할 수도 예측할 수도 없음

3) 모델 평가

  • 학습 후, 데이터를 통해 모델의 정확도를 테스트함
    ㄴ> 훈련 데이터와는 다른 검증 데이터로 성능을 평가

데이터 준비 및 탐색

학습 데이터와 테스트 데이터의 분리

모델이 데이터를 학습하는 과정과 평가하는 과정을 분리하기 위해 필요

  • 학습 데이터: 모델이 학습하는데 사용하는 데이터
  • 테스트 데이터: 학습이 끝난 모델의 성능을 평가하는데 사용하는 데이터

왜 분리해야 하는가?

  • 모델 과적합(Overfitting) 방지: 모델이 학습 데이터에 너무 특화되면 새로운 데이터(=테스트 데이터)에 대해 좋은 성능을 내지 못할 수 있음
  • 모델의 일반화 능력 평가: 학습하지 않은 데이터에 대해 얼마나 잘 예측하는지 평가할 수 있음

1) 데이터 분리 과정

① 특성과 타겟 분리

  • 특성(Feature): 예측에 사용할 데이터
  • 타겟(Target): 예측하고자 하는 값

② 학습 데이터와 테스트 데이터 분리


지도학습(1) - 회귀 알고리즘

1. 회귀 알고리즘의 이해

연속적인 숫자 데이터를 예측하는데 사용되는 지도학습 알고리즘

1) 회귀의 특징

  • 연속적인 출력 값: 예측 값은 숫자임 -> 즉 범주형 데이터 X
  • 독립 변수와 종속 변수의 관계: 독립 변수(입력 데이터)가 종속 변수(예측 값)에 어떤 영향을 주는지 분석

2) 회귀의 종류

  • 단순 선형 회귀: 입력 변수가 하나인 경우
  • 다중 선형 회귀: 입력 변수가 여러 개인 경우
  • 비선형 회귀: 입력 데이터와 출력 값 사이 관계가 선형이 아닌 경우

3) 동작 방식

① 학습 데이터 수집: 입력 데이터(독립 변수)와 정답(종속 변수)을 준비
② 모델 학습: 데이터를 이용하여 입력-출력 사이 수학적 관계를 찾음
③ 예측: 학습한 모델을 사용해 새로운 데이터를 입력 -> 그 결과를 예측


2. 선형 회귀의 원리 및 모델 학습

데이터 간의 직선 관계를 찾는 알고리즘

  • 입력 데이터(독립 변수)가 증가하거나 감소할 때 출력(종속 변수)이 어떻게 변하는지 예측 시 사용됨
  • y = mx + b
    x: 독립 변수
    y: 종속 변수
    m: 기울기
    b: y절편

모델 학습 과정

① 데이터 시각화: 데이터를 그래프에 표시
② 최적의 직선 찾기: 직선이 데이터 점과 얼마나 가까운지 측정 -> 이 거리(오차)를 측정하는 방법이 손실 함수
③ 손실 함수(MSE): 데이터 점-직선 사이의 거리(오차)의 제곱 평균
④ 기울기와 y절편 업데이트: MSE를 최소화하는 방향으로 기울기와 y절편을 조금씩 조정 -> 경사하강법
ㄴ> 반복적으로 업데이트하여 오차가 최소화될 때까지 학습
⑤ 모델 학습의 결과 시각화
⑥ 새로운 데이터 예측: 학습된 모델로 새로운 데이터 예측

import numpy as np
import matplotlib.pyplot as plt

# 1. 데이터 준비
X = np.array([1, 2, 3, 4, 5]) 				# 공부 시간(입력 데이터)
y = np.array([50, 55, 65, 70, 75]) 			# 시험 점수(출력 데이터)

# 2. 초기 값 설정
m = 0 										# 초기 기울기
b = 0 										# 초기 y절편
learning_rate = 0.01 						# 학습 속도
epochs = 1000 								# 학습 반복 횟수

# 3. 경사하강법을 이용한 학습
for _ in range(epochs):						
y_pred = m * X + b							# 예측 값 계산

error = y - y_pred							
mse = (error ** 2).mean()					# 손실 함수(MSE) 계산

m_gradient = -(2 / len(X)) * sum(X * error)	# 기울기(m)와 y절편(b)의 변화량 계산
b_gradient = -(2 / len(X)) * sum(error)

m -= learning_rate * m_gradient				# 기울기와 절편 업데이트
b -= learning_rate * b_gradient

# 4. 학습 결과 시각화
y_pred = m * X + b 							# 학습된 모델의 예측 값

plt.scatter(X, y, color='blue', label='실제 데이터')
plt.plot(X, y_pred, color='red', label='학습된 모델')
plt.xlabel('공부 시간 (시간)')
plt.ylabel('시험 점수 (점수)')
plt.legend()
plt.title('선형 회귀 학습 결과')
plt.show()

# 5. 새로운 데이터 예측
new_study_hours = np.array([6, 8, 10]) 		# 새로운 공부 시간
predicted_scores = m * new_study_hours + b

3. 손실 함수(MSE)와 성능 평가(Metrics)

1) 주요 성능 평가 지표

  • MSE(Mean Squared Error): 실제 값 - 예측 값의 제곱 평균 -> 오차가 클수록 더 큰 패널티를 줌 (제곱이니까)
  • RMSE(Root Mean Squared Error): MSE의 제곱근을 계산한 값 -> 단위를 실제와 동일하게 만들어 해석이 상대적으로 쉬움
  • MAE(Mean Absolute Error, 평균 절대 오차): 오차의 절대값 평균을 계산 -> 제곱을 사용하지 않아서 큰 오차의 영향이 덜함
  • R^2(R-squared, 결정 계수): 모델이 데이터를 얼마나 잘 설명하는지 -> 0-1 사이 값, 1에 가까울수록 잘 설명한다는 의미

2) 모델 학습 과정

① 데이터 준비
② 모델 학습: LinearRegression 객체를 생성 -> fit 메서드로 학습
③ 성능 평가: MSE, MAE, R^2
④ 결과 시각화
⑤ 예측

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 1. 데이터 준비
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)# 공부 시간 (2D 배열로 변환)
y = np.array([50, 55, 65, 70, 75]) 			# 시험 점수

# 2. 모델 학습
model = LinearRegression() 					# 선형 회귀 모델 생성
model.fit(X, y) 							# 모델 학습

# 3. 학습된 모델의 기울기와 절편 확인
m = model.coef_[0] 							# 기울기
b = model.intercept_						# 절편

# 4. 예측 값 계산
y_pred = model.predict(X) 					# 학습 데이터에 대한 예측 값

# 5. 성능 평가
mse = mean_squared_error(y, y_pred) 		# MSE 계산
rmse = np.sqrt(mse) 						# RMSE 계산
mae = mean_absolute_error(y, y_pred) 		# MAE 계산
r2 = r2_score(y, y_pred) 					# R^2 계산

# 6. 학습 결과 시각화
plt.scatter(X, y, color='blue', label='실제 데이터')
plt.plot(X, y_pred, color='red', label='학습된 모델')
plt.xlabel('공부 시간 (시간)')
plt.ylabel('시험 점수 (점수)')
plt.legend()
plt.title('Scikit-learn을 이용한 선형 회귀 학습 결과')
plt.show()

# 7. 새로운 데이터 예측
new_study_hours = np.array([6, 8, 10]).reshape(-1, 1)
predicted_scores = model.predict(new_study_hours)

3) 과적합(Overfitting)과 과소적합(Underfitting)

모델이 데이터에 너무 치우치거나 일반화를 잘하지 못할 때 발생

과적합(Overfitting)

데이터를 너무 많이 학습한 상태 -> 작은 노이즈까지 학습
ㄴ> 학습 데이터에서는 성능이 좋지만, 새로운 데이터(테스트 데이터)에서는 성능이 나쁨

해결 방법

  • 모델의 복잡도를 낮춤 -> 간단한 모델을 사용하거나 차원을 축소
  • 규제 적용: L1 -> 불필요한 특징 제거, L2 -> 가중치를 너무 크게 만드는 것을 방지
  • 더 많은 데이터를 수집하거나 교차 검증 사용

과소적합(Underfitting)

과소적합(Underfitting): 모델이 데이터를 제대로 학습하지 못한 상태
ㄴ> 학습 데이터와 테스트 데이터 모두에서 성능이 나쁨

해결 방법

  • 모델을 더 복잡하게 만듦 -> 더 많은 특징을 추가하거나 더 큰 모델을 사용함
  • 학습 데이터를 더 많이 수집하거나 학습 시간을 늘려 모델을 충분히 학습시켜야 함

지도학습(2) - 분류 알고리즘

1. 분류 문제의 개념

주어진 데이터를 특정 범주나 클래스로 분류하는 작업

  • 레이블을 학습하여 새로운 데이터가 주어졌을 때 올바른 클래스를 예측하도록 훈련

1) 주요 목표

  • 정확한 예측: 어떤 클래스에 속하는지 최대한 정확히 예측
  • 실용적 적용: 실제 문제에서 유용한 정보를 제공

2) 특징

  • 입력 데이터: 다양한 특징(Feature)을 가진 데이터
  • 출력 데이터: 데이터가 속한 범주나 클래스
  • 클래스 개수
    이진 분류: 두 개의 클래스만 예측 (ex. True/False, 0/1 등)
    다중 클래스 분류: 세 개 이상의 클래스 예측 (ex. 사과, 딸기, 귤 등)

3) 동작 방식

① 데이터 수집 및 전처리
② 모델 학습: 입력 데이터(특징)와 레이블(정답)을 활용하여 모델을 학습
③ 예측: 학습한 모델을 사용해 새로운 데이터를 입력 -> 그 결과를 예측
④ 평가: 모델 예측 결과를 평가하여 성능 지표를 측정함


2. 로지스틱 회귀 이해

데이터를 분석하고 특정 데이터가 특정 클래스에 속할 확률을 예측하는 알고리즘

1) 작동 원리

① 선형 회귀의 확장: 선형 회귀처럼 데이터를 학습하고, 예측 값을 분류 문제에 적합하도록 변환
② 시그모이드 함수 적용: 예측 값 z를 시그모이드 함수를 사용하여 0-1 사이 값으로 변환
③ 클래스 결정: 결과가 0.5 이상이면 1, 아니면 0으로 분류 -> 임계값 변경 가능

2) 로지스틱 회귀의 과정

① 가설 설정: 입력 데이터의 특징을 선형 결합하여 z 계산 -> 시그모이드 함수에 통과시켜 확률 계산
② 손실 함수 정의: 로그 손실 함수(Log Loss)를 사용함
③ 모델 학습: 경사 하강법을 사용하여 가중치와 절편 값 업데이트
ㄴ> 모델이 점점 정확히 데이터를 분류하도록 학습


3. 성능 평가 지표

모델 성능을 평가하기 위해 다양한 평가 지표가 사용되는데 이때 각 지표는 모델의 성능을 다양한 관점에서 분석하여 특정 문제에 더 적합한 지표를 선택 해야함

평가 지표

  • 정확도(Accuracy): 모델이 올바르게 예측한 비율 -> Accuracy = TP + TN / TP + TN + FP + FN
    장점: 전체적인 예측 성능을 간단히 측정
    단점: 데이터의 클래스 불균형 시 신뢰도 하락
    => 클래스가 균형 잡혀 있을 때 적합

  • 정밀도(Precision): 모델이 Positive로 예측한 것 중에 실제 Positive인 비율 -> Precision = TP / TP + FP
    장점: False Positive를 줄임
    단점: Positive 데이터를 놓칠 수 있음 (Recall도 낮아질 수 있음)
    => False Positive가 중요한 경우 적합

  • 재현율(Recall): 실제 Positive 중에 모델이 Positive로 올바르게 예측한 비율 -> Recall = TP / TP + FN
    장점: False Positive를 줄임
    단점: Positive로 예측하는 경향이 커져 정밀도 하락할 수 있음
    => False Negative가 중요한 경우 적합

  • F1-Score: 정밀도와 재현율의 조화 평균 -> F1-Score = 2 * precision * Recall / precision + Recall
    장점: 정밀도와 재현율 모두 종합적인 성능 평가 가능
    단점: 클래스 불균형이 심한 데이터에서는 추가적인 분석 필요
    => 정밀도와 재현율의 균형이 중요할 때 적합


모델 성능 향상 - KNN

1. KNN 알고리즘 이해

새로운 데이터 포인터가 주어졌을 때, 이를 가장 가까운 데이터 포인트들의 그룹(이웃)으로 분류하거나 값을 예측할 때 사용

  • 데이터 패턴이 비선형적이고 복잡할 때 적합
    ㄴ> 데이터가 많거나 고차원인 경우는 성능 저하될 수 있음 -> 차원 축소나 데이터 전처리 필요

1) 작동 원리

① 훈련 데이터 준비: 여러 개의 특성으로 구성된 데이터 -> 각 데이터는 특정 레이블이나 값을 갖고 있음
② 거리 계산: 새로운 데이터 포인트(예측하려는 데이터)와 훈련 데이터 사이 거리를 계산
ㄴ> 유클리드 거리 공식 사용
③ K개의 이웃 선택: 가장 가까운 K개의 데이터 포인트 선택 -> 값에 따라 모델 성능이 달라짐
④ 결과 결정

  • 분류: 선택된 K개의 이웃 중 가장 많은 빈도로 나타나는 레이블 선택
  • 회귀: 선택된 K개의 이웃의 값을 평균 내고 예측 값 결정

2) 특징

  • 모델 학습 필요 X: 훈련 과정에서 데이터 저장하고, 새로운 데이터가 들어오면 실시간 계산
  • 단순성: 수학적 계산 없음, 데이터 간 거리를 비교하여 예측을 수행함
  • 다양한 응용: 분류, 회귀 문제 모두에 사용 가능
from sklearn.datasets import load_iris 
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, accuracy_score 

# 1. 데이터 로드 및 확인
iris = load_iris() 							# Iris 데이터셋 로드
X = iris.data 								# 특성 데이터 (꽃잎/꽃받침의 길이와 너비)
y = iris.target 							# 레이블 데이터 (품종: Setosa, Versicolor, Virginica)

# 2. 데이터 분리 (훈련 세트와 테스트 세트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. KNN 모델 생성
k = 3 										# 가장 가까운 이웃의 개수
knn = KNeighborsClassifier(n_neighbors=k) 	# KNN 분류기 생성

# 4. 모델 학습
knn.fit(X_train, y_train) 					# 훈련 데이터로 모델 학습

# 5. 모델 평가
y_pred = knn.predict(X_test) 				# 테스트 데이터 예측
accuracy = accuracy_score(y_test, y_pred) 	# 정확도 계산

# 6. 분류 성능 세부 보고서 출력
print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 7. 새로운 데이터 예측
new_data = [[5.0, 3.5, 1.3, 0.3]] 			
prediction = knn.predict(new_data) 			
predicted_class = iris.target_names[prediction][0]

2. K 값의 선택과 영향

  • K는 모델이 예측할 때 고려하는 가장 가까운 이웃의 수

K값이 작다면

  • 모델이 데이터의 세부 패턴을 잘 잡아냄
  • 국소적(local) 특징에 민감하므로 복잡한 데이터를 처리하는데 적합함
  • 과적합(Overfitting) 위험 증가
  • 노이즈(잘못된 데이터)에 의해 결과가 영향 받을 수 있음
  • 작은 데이터 변화에도 모델의 결과가 달라짐

고려사항

  • 데이터 크기
    작은 데이터셋: 값을 작게 설정
    큰 데이터셋: 값을 크게 설정

  • 홀수 값의 선택: 보통 홀수로 설정하는 것이 좋음 -> 동률을 방지

  • 성능 평가를 위한 테스트교차 검증: 다양한 K값을 시도하면서 모델 성능(정확도)를 비교 -> 최적의 K값 선택


3. 모델의 성능 향상 및 하이퍼파라미터 튜닝

  • KNN 알고리즘 성능을 최적화 하기 위해선 데이터 전처리, 거리 계산 방식, K값을 신중히 조정해야 함

성능 향상 방법

  • 데이터 전처리: 스케일링, 이상치 제거, 특성 선택
  • 거리 계산 방식: 유클리드, 맨해튼, 민코프스키 등 데이터 특성에 맞게 선택
  • 하이퍼파라미터 튜닝: 최적의 K값을 교차 검증으로 선택 -> 가중치를 부여하여 더 나은 성능 도출
profile
열심히 살아보아요

0개의 댓글