Post

머신러닝 이론과 기본 - AI의 핵심 개념 이해

머신러닝 이론과 기본 - AI의 핵심 개념 이해

머신러닝 이론과 기본 - AI의 핵심 개념 이해

개요

머신러닝의 기본 이론과 핵심 개념을 학습합니다:

  • AI 용어: 인공지능, 머신러닝, 딥러닝의 차이점
  • 학습 방법: 지도학습, 비지도학습, 강화학습
  • 데이터 속성: 피처, 레이블, 데이터셋 분할
  • 핵심 문제: 과적합과 과소적합

1. 머신러닝 이론

1-1. AI 용어 및 종류

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print("=== AI 용어 정리 ===")

print("1. 인공지능 (Artificial Intelligence)")
print("   - 사람처럼 똑똑한 기계")
print("   - 인간의 지능을 모방한 시스템")
print("   - 포괄적인 개념")

print("\n2. 머신러닝 (Machine Learning)")
print("   - 인공지능을 구현하는데 성공한 방법")
print("   - 기계학습")
print("   - 데이터로부터 패턴을 학습하는 알고리즘")

print("\n3. 딥러닝 (Deep Learning)")
print("   - 머신러닝보다 더 똑똑한 인공지능을 구현하는 방법")
print("   - 인간의 뉴런과 비슷한 인공신경망 기반")
print("   - 다층 신경망을 활용한 학습")

1-2. 기계학습(머신러닝) 분류

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print("=== 머신러닝 학습 방법 분류 ===")

print("1. 지도학습 (Supervised Learning)")
print("   - 정답을 알려주며 학습시키는 방법")
print("   - 입력(X)과 출력(Y)의 쌍으로 학습")
print("   - 분류: 이메일 스팸/정상 분류, 이미지 분류")
print("   - 회귀: 집값 예측, 주식 가격 예측")

print("\n2. 비지도학습 (Unsupervised Learning)")
print("   - 정답을 알려주지 않고 규칙을 스스로 발견")
print("   - 입력(X)만으로 학습")
print("   - 군집화: 고객 세분화, 유전자 분석")
print("   - 연관규칙: 장바구니 분석, 추천 시스템")

print("\n3. 강화학습 (Reinforcement Learning)")
print("   - 실패와 성공의 과정을 반복하며 학습")
print("   - 보상 기반 학습")
print("   - 게임 AI (알파고), 자율주행, 로봇 제어")
print("   - 환경과의 상호작용을 통한 학습")

2. 머신러닝 기본

2-1. 기계학습 모델

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
print("=== 기계학습 모델 유형 ===")

print("1. 지도학습: 예측(회귀)")
print("   - 주어진 입력과 출력의 쌍을 학습")
print("   - 새로운 데이터를 입력했을 때 합리적인 출력값 예측")
print("   - 예시: 농어 길이로 무게 예측, 집 크기로 가격 예측")

print("\n2. 지도학습: 분류")
print("   - 훈련 데이터에 각각 레이블을 지정하고 학습")
print("   - 새로운 데이터를 미리 정의된 클래스로 분류")
print("   - 예시: 이메일 스팸 분류, 의료 진단, 이미지 인식")

print("\n3. 비지도학습: 군집")
print("   - 답(레이블)없이 문제로만 학습")
print("   - 스스로 데이터 간의 패턴을 찾아 분류 기준 발견")
print("   - 비슷한 유형의 데이터끼리 그룹핑하여 군집 생성")
print("   - 예시: 고객 세분화, 유전자 클러스터링")

2-2. 데이터 속성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
print("=== 데이터 속성 ===")

print("1. 피처 (Feature)")
print("   - 데이터셋의 일반 속성")
print("   - 레이블을 제외한 나머지 모든 속성")
print("   - 모델의 입력 변수")
print("   - 예시: 나이, 소득, 교육수준, 거주지역")

print("\n2. 레이블 (Label)")
print("   - 데이터의 학습을 위해 주어진 정답 데이터")
print("   - 모델이 예측해야 하는 목표 변수")
print("   - 지도학습에서만 존재")
print("   - 예시: 스팸/정상, 집 가격, 고객 등급")

print("\n3. 데이터셋 구성")
print("   - X (피처): 입력 데이터")
print("   - y (레이블): 출력 데이터 (지도학습)")
print("   - (X, y) 쌍으로 학습")

2-3. 머신러닝 워크플로우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
print("=== 머신러닝 워크플로우 ===")

print("1. 데이터 수집")
print("   - 원시 데이터 수집")
print("   - 데이터 소스 확인")
print("   - 데이터 품질 검사")

print("\n2. 데이터 전처리")
print("   - 결측값 처리")
print("   - 이상치 제거")
print("   - 데이터 정규화/표준화")
print("   - 피처 엔지니어링")

print("\n3. 데이터 분할")
print("   - 훈련 데이터: 학습하기 위한 데이터")
print("   - 검증 데이터: 모델 튜닝용 데이터")
print("   - 테스트 데이터: 최종 성능 평가용 데이터")

print("\n4. 모델 학습")
print("   - 알고리즘 선택")
print("   - 하이퍼파라미터 설정")
print("   - 훈련 데이터로 학습")

print("\n5. 모델 평가")
print("   - 성능 지표 계산")
print("   - 과적합/과소적합 확인")
print("   - 모델 개선")

print("\n6. 모델 배포")
print("   - 프로덕션 환경 배포")
print("   - 모니터링")
print("   - 지속적 개선")

3. 데이터 세트 분할

3-1. 데이터 분할의 중요성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

print("=== 데이터 세트 분할 ===")

# 샘플 데이터 생성
np.random.seed(42)
n_samples = 1000

data = {
    'feature1': np.random.normal(0, 1, n_samples),
    'feature2': np.random.normal(0, 1, n_samples),
    'feature3': np.random.normal(0, 1, n_samples),
    'target': np.random.choice([0, 1], n_samples, p=[0.7, 0.3])
}

df = pd.DataFrame(data)
X = df[['feature1', 'feature2', 'feature3']]
y = df['target']

print(f"전체 데이터 크기: {df.shape}")
print(f"피처 데이터 크기: {X.shape}")
print(f"레이블 데이터 크기: {y.shape}")

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2, 
    random_state=42,
    stratify=y
)

print(f"\n훈련 데이터 크기: {X_train.shape}")
print(f"테스트 데이터 크기: {X_test.shape}")
print(f"훈련 레이블 크기: {y_train.shape}")
print(f"테스트 레이블 크기: {y_test.shape}")

# 클래스 분포 확인
print(f"\n전체 클래스 분포: {y.value_counts().to_dict()}")
print(f"훈련 클래스 분포: {y_train.value_counts().to_dict()}")
print(f"테스트 클래스 분포: {y_test.value_counts().to_dict()}")

3-2. 데이터 분할 전략

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
print("=== 데이터 분할 전략 ===")

print("1. 일반적인 분할 비율")
print("   - 훈련: 70-80%")
print("   - 검증: 10-15%")
print("   - 테스트: 10-15%")

print("\n2. 계층적 샘플링 (Stratified Sampling)")
print("   - 클래스 비율을 유지하며 분할")
print("   - 불균형 데이터셋에서 중요")
print("   - train_test_split(..., stratify=y)")

print("\n3. 시계열 데이터 분할")
print("   - 시간 순서를 고려한 분할")
print("   - 과거 데이터로 훈련, 미래 데이터로 테스트")
print("   - TimeSeriesSplit 사용")

print("\n4. 교차 검증 (Cross Validation)")
print("   - k-fold 교차 검증")
print("   - 데이터를 k개 그룹으로 나누어 검증")
print("   - 더 안정적인 성능 평가")

4. 언더피팅 vs 오버피팅

4-1. 과소적합 (Underfitting)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
print("=== 과소적합 (Underfitting) ===")

print("정의:")
print("- 학습이 부족한 상태")
print("- 지나친 단순화로 인해 에러가 많이 발생")
print("- 훈련 데이터와 테스트 데이터 모두에서 성능이 낮음")

print("\n원인:")
print("- 모델이 너무 단순함")
print("- 피처가 부족함")
print("- 정규화가 과도함")
print("- 학습 데이터가 부족함")

print("\n해결 방법:")
print("- 모델 복잡도 증가")
print("- 더 많은 피처 추가")
print("- 정규화 강도 감소")
print("- 더 많은 데이터 수집")
print("- 학습률 증가")

print("\n특징:")
print("- 훈련 정확도: 낮음")
print("- 테스트 정확도: 낮음")
print("- 편향(Bias): 높음")
print("- 분산(Variance): 낮음")

4-2. 과적합 (Overfitting)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
print("=== 과적합 (Overfitting) ===")

print("정의:")
print("- 학습이 너무 많이 된 상태")
print("- 훈련 데이터에 대해 과하게 학습")
print("- 훈련 데이터 이외의 데이터에 대해 성능이 떨어짐")

print("\n원인:")
print("- 모델이 너무 복잡함")
print("- 훈련 데이터가 부족함")
print("- 정규화가 부족함")
print("- 노이즈가 많은 데이터")

print("\n해결 방법:")
print("- 모델 복잡도 감소")
print("- 정규화 강화 (L1, L2)")
print("- 더 많은 데이터 수집")
print("- 드롭아웃 사용")
print("- 조기 종료 (Early Stopping)")

print("\n특징:")
print("- 훈련 정확도: 높음")
print("- 테스트 정확도: 낮음")
print("- 편향(Bias): 낮음")
print("- 분산(Variance): 높음")

4-3. 편향-분산 트레이드오프

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import matplotlib.pyplot as plt
import numpy as np

# 편향-분산 트레이드오프 시각화
def plot_bias_variance_tradeoff():
    """편향-분산 트레이드오프 시각화"""
    
    # 모델 복잡도 (x축)
    complexity = np.linspace(0, 10, 100)
    
    # 편향 (Bias) - 복잡도가 낮을수록 높음
    bias = 1 / (complexity + 1) + 0.1
    
    # 분산 (Variance) - 복잡도가 높을수록 높음
    variance = complexity * 0.1 + 0.05
    
    # 총 오차 (Bias² + Variance + Noise)
    total_error = bias**2 + variance + 0.1
    
    plt.figure(figsize=(12, 8))
    
    plt.subplot(2, 1, 1)
    plt.plot(complexity, bias, 'b-', label='Bias', linewidth=2)
    plt.plot(complexity, variance, 'r-', label='Variance', linewidth=2)
    plt.plot(complexity, total_error, 'g-', label='Total Error', linewidth=2)
    plt.xlabel('Model Complexity')
    plt.ylabel('Error')
    plt.title('Bias-Variance Tradeoff')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 과소적합, 적절한 적합, 과적합 영역 표시
    plt.axvspan(0, 3, alpha=0.2, color='blue', label='Underfitting')
    plt.axvspan(3, 7, alpha=0.2, color='green', label='Good Fit')
    plt.axvspan(7, 10, alpha=0.2, color='red', label='Overfitting')
    
    plt.subplot(2, 1, 2)
    # 훈련/테스트 성능 비교
    train_score = 1 - (complexity * 0.05 + 0.1)  # 복잡도가 높을수록 훈련 성능 향상
    test_score = 1 - total_error  # 총 오차가 낮을수록 테스트 성능 향상
    
    plt.plot(complexity, train_score, 'b-', label='Training Score', linewidth=2)
    plt.plot(complexity, test_score, 'r-', label='Test Score', linewidth=2)
    plt.xlabel('Model Complexity')
    plt.ylabel('Score')
    plt.title('Training vs Test Performance')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

# 시각화 실행
plot_bias_variance_tradeoff()

5. 티쳐블머신 모델 생성

5-1. 티쳐블머신 소개

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print("=== 티쳐블머신 (Teachable Machine) ===")

print("개요:")
print("- Google에서 개발한 머신러닝 모델 학습 도구")
print("- 웹 브라우저에서 바로 사용 가능")
print("- 코딩 없이 머신러닝 모델 생성")
print("- URL: https://teachablemachine.withgoogle.com/")

print("\n지원하는 모델 유형:")
print("1. 이미지 분류")
print("   - 사진, 그림, 손글씨 등")
print("   - CNN 기반")
print("   - 실시간 웹캠 지원")

print("\n2. 음성 분류")
print("   - 음성 명령, 소리 분류")
print("   - 마이크 입력 지원")
print("   - 실시간 음성 인식")

print("\n3. 포즈 분류")
print("   - 사람의 자세, 동작 인식")
print("   - 웹캠을 통한 실시간 감지")
print("   - 게임, 피트니스 앱에 활용")

5-2. 이미지 분류 모델 생성 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
print("=== 이미지 분류 모델 생성 예제 ===")

print("1. 데이터 준비")
print("   - Class1: 치와와 사진 6개")
print("   - Class2: 푸들 사진 6개")
print("   - 각 클래스별로 충분한 데이터 수집")

print("\n2. 모델 학습 과정")
print("   - 웹사이트 접속")
print("   - '이미지 프로젝트' 선택")
print("   - 클래스별로 이미지 업로드")
print("   - '모델 훈련' 버튼 클릭")
print("   - 학습 완료 후 테스트")

print("\n3. 모델 활용")
print("   - 실시간 웹캠 테스트")
print("   - 새로운 이미지 업로드 테스트")
print("   - 모델 다운로드 (TensorFlow.js)")
print("   - 웹 애플리케이션에 통합")

print("\n4. 학습 팁")
print("   - 다양한 각도, 조명의 이미지 수집")
print("   - 각 클래스별로 동일한 수의 이미지")
print("   - 고품질 이미지 사용")
print("   - 배경이 다른 이미지 포함")

5-3. 실무 활용 사례

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
print("=== 티쳐블머신 실무 활용 사례 ===")

print("1. 교육 분야")
print("   - 학생들의 학습 도구")
print("   - 머신러닝 개념 이해")
print("   - 프로토타이핑 도구")

print("\n2. 프로토타이핑")
print("   - 빠른 아이디어 검증")
print("   - MVP 개발")
print("   - 개념 증명 (PoC)")

print("\n3. 개인 프로젝트")
print("   - 취미 프로젝트")
print("   - 개인 앱 개발")
print("   - 창작 활동")

print("\n4. 비즈니스 활용")
print("   - 제품 분류 시스템")
print("   - 품질 검사 자동화")
print("   - 고객 서비스 개선")

print("\n5. 한계점")
print("   - 복잡한 모델 생성 어려움")
print("   - 대용량 데이터 처리 제한")
print("   - 커스터마이징 제한")
print("   - 프로덕션 환경 부적합")

6. 머신러닝 성능 평가

6-1. 기본 성능 지표

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print("=== 머신러닝 성능 평가 ===")

print("1. 분류 문제")
print("   - 정확도 (Accuracy): 전체 예측 중 맞춘 비율")
print("   - 정밀도 (Precision): 양성 예측 중 실제 양성 비율")
print("   - 재현율 (Recall): 실제 양성 중 예측한 양성 비율")
print("   - F1-Score: 정밀도와 재현율의 조화평균")

print("\n2. 회귀 문제")
print("   - MSE (Mean Squared Error): 평균 제곱 오차")
print("   - RMSE (Root Mean Squared Error): 평균 제곱근 오차")
print("   - MAE (Mean Absolute Error): 평균 절대 오차")
print("   - R² (R-squared): 결정계수")

print("\n3. 모델 선택 기준")
print("   - 훈련 성능 vs 테스트 성능")
print("   - 과적합/과소적합 확인")
print("   - 교차 검증 결과")
print("   - 비즈니스 요구사항")

6-2. 모델 평가 실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 간단한 분류 모델 평가 예제
def evaluate_classification_model():
    """분류 모델 평가 예제"""
    
    # 모델 학습
    model = LogisticRegression(random_state=42)
    model.fit(X_train, y_train)
    
    # 예측
    y_train_pred = model.predict(X_train)
    y_test_pred = model.predict(X_test)
    
    # 성능 평가
    train_accuracy = accuracy_score(y_train, y_train_pred)
    test_accuracy = accuracy_score(y_test, y_test_pred)
    
    print("=== 분류 모델 성능 평가 ===")
    print(f"훈련 정확도: {train_accuracy:.4f}")
    print(f"테스트 정확도: {test_accuracy:.4f}")
    
    # 과적합/과소적합 판단
    if train_accuracy - test_accuracy > 0.1:
        print("⚠️ 과적합 의심: 훈련 성능이 테스트 성능보다 크게 높음")
    elif test_accuracy - train_accuracy > 0.05:
        print("⚠️ 과소적합 의심: 테스트 성능이 훈련 성능보다 높음")
    else:
        print("✅ 적절한 일반화: 훈련과 테스트 성능이 비슷함")
    
    # 상세 분류 리포트
    print("\n=== 상세 분류 리포트 ===")
    print(classification_report(y_test, y_test_pred))
    
    # 혼동 행렬
    print("\n=== 혼동 행렬 ===")
    cm = confusion_matrix(y_test, y_test_pred)
    print(cm)

# 모델 평가 실행
evaluate_classification_model()

7. 머신러닝 프로젝트 체크리스트

7-1. 프로젝트 시작 전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print("=== 머신러닝 프로젝트 체크리스트 ===")

print("1. 문제 정의")
print("   - 비즈니스 문제를 머신러닝 문제로 변환")
print("   - 성공 기준 정의")
print("   - 제약사항 파악")
print("   - 데이터 가용성 확인")

print("\n2. 데이터 수집")
print("   - 필요한 데이터 식별")
print("   - 데이터 소스 확인")
print("   - 데이터 품질 검사")
print("   - 개인정보 보호 고려")

print("\n3. 탐색적 데이터 분석")
print("   - 데이터 분포 확인")
print("   - 결측값, 이상치 분석")
print("   - 변수 간 관계 파악")
print("   - 시각화를 통한 인사이트 도출")

7-2. 모델 개발 과정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
print("=== 모델 개발 과정 ===")

print("1. 데이터 전처리")
print("   - 결측값 처리")
print("   - 이상치 제거/수정")
print("   - 피처 스케일링")
print("   - 인코딩 (범주형 변수)")

print("\n2. 피처 엔지니어링")
print("   - 도메인 지식 활용")
print("   - 피처 선택")
print("   - 피처 생성")
print("   - 차원 축소")

print("\n3. 모델 선택")
print("   - 문제 유형에 맞는 알고리즘 선택")
print("   - 여러 모델 비교")
print("   - 하이퍼파라미터 튜닝")
print("   - 앙상블 방법 고려")

print("\n4. 모델 평가")
print("   - 적절한 평가 지표 선택")
print("   - 교차 검증 수행")
print("   - 과적합/과소적합 확인")
print("   - 비즈니스 임팩트 평가")

7-3. 모델 배포 및 모니터링

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print("=== 모델 배포 및 모니터링 ===")

print("1. 모델 배포")
print("   - 프로덕션 환경 준비")
print("   - API 개발")
print("   - 성능 최적화")
print("   - 보안 고려사항")

print("\n2. 모니터링")
print("   - 모델 성능 지속적 모니터링")
print("   - 데이터 드리프트 감지")
print("   - 시스템 성능 모니터링")
print("   - 사용자 피드백 수집")

print("\n3. 지속적 개선")
print("   - 새로운 데이터로 재학습")
print("   - 모델 업데이트")
print("   - A/B 테스트 수행")
print("   - 비즈니스 요구사항 반영")

마무리

머신러닝의 기본 이론과 핵심 개념을 학습했습니다:

핵심 학습 내용

  • AI 용어: 인공지능, 머신러닝, 딥러닝의 차이점과 관계
  • 학습 방법: 지도학습, 비지도학습, 강화학습의 특성과 활용
  • 데이터 속성: 피처, 레이블, 데이터셋 분할의 중요성
  • 핵심 문제: 과적합과 과소적합의 원인과 해결방법

실무 적용

  • 워크플로우: 체계적인 머신러닝 프로젝트 진행 방법
  • 성능 평가: 적절한 평가 지표 선택과 모델 성능 분석
  • 도구 활용: 티쳐블머신을 통한 빠른 프로토타이핑
  • 프로젝트 관리: 체크리스트를 통한 완성도 높은 프로젝트

머신러닝의 기본 이론을 바탕으로 실제 프로젝트에서 효과적인 모델을 개발할 수 있는 기반을 마련했습니다.

This post is licensed under CC BY 4.0 by the author.