# Part 6: 머신러닝 모델링과 평가 **⬅️ 이전 시간: [Part 5: AI 핵심 라이브러리](./part_5_ai_core_libraries.md)** **➡️ 다음 시간: [Part 7: 딥러닝 기초와 PyTorch](./part_7_deep_learning.md)** --- ## 1. 학습 목표 (Learning Objectives) 이번 파트가 끝나면, 여러분은 다음을 할 수 있게 됩니다. - Matplotlib와 Seaborn을 사용하여 데이터의 분포, 관계, 추세를 시각화하고 인사이트를 도출할 수 있습니다. - 지도학습, 훈련/테스트 데이터 분할의 개념을 설명할 수 있습니다. - Scikit-learn의 `fit()`, `predict()` 인터페이스를 사용하여 머신러닝 모델을 훈련하고, 새로운 데이터에 대한 예측을 만들 수 있습니다. - 피처 스케일링(StandardScaler, MinMaxScaler)과 같은 핵심 전처리 기법을 모델 성능 향상을 위해 적용할 수 있습니다. - 데이터 불러오기부터 전처리, 훈련, 평가까지 이어지는 머신러닝의 전체 파이프라인을 코드로 구현할 수 있습니다. ## 2. 핵심 키워드 (Keywords) `데이터 시각화`, `Matplotlib`, `Seaborn`, `Scikit-learn`, `지도학습(Supervised Learning)`, `훈련/테스트 분리(Train/Test Split)`, `데이터 전처리(Preprocessing)`, `피처 스케일링(Feature Scaling)`, `모델 평가(Evaluation)`, `정확도(Accuracy)` ## 3. 도입: 데이터에서 지혜를 캐내는 기술 (Introduction) 이전 파트에서 우리는 NumPy와 Pandas로 데이터를 자유자재로 다루는 법을 배웠습니다. 하지만 숫자로만 가득한 표는 우리에게 많은 것을 알려주지 않습니다. 이번 파트에서는 데이터에 '생명'을 불어넣는 두 가지 핵심 기술, **시각화**와 **머신러닝**을 배웁니다. - **시각화**는 데이터 속에 숨겨진 패턴과 이야기를 발견하는 '눈'이 되어줄 것입니다. - **머신러닝**은 그 패턴을 학습하여 미래를 예측하는 '두뇌' 역할을 합니다. Scikit-learn이라는 강력한 도구를 통해, 우리는 이 모든 과정을 직접 체험해볼 것입니다. > [!TIP] > 본 파트의 모든 예제 코드는 `source_code/part_6_machine_learning.py` 파일에서 직접 실행하고 수정해볼 수 있습니다. --- ## 4. 데이터 시각화: 그림으로 데이터와 대화하기 > **🎯 1-2일차 목표:** Matplotlib와 Seaborn으로 데이터를 시각화하여 인사이트를 발견합니다. 데이터를 숫자로만 보는 것은 숲을 보지 못하고 나무만 보는 것과 같습니다. 시각화는 데이터 속에 숨겨진 패턴, 관계, 이상치를 한눈에 파악하게 해주는 강력한 도구입니다. - **Matplotlib**: 파이썬 시각화의 근간. 거의 모든 종류의 그래프를 그릴 수 있습니다. (비유: 하얀 도화지) - **Seaborn**: Matplotlib을 더 쉽고 예쁘게 사용하도록 만든 고수준 라이브러리. 통계 기능이 특화되어 있습니다. (비유: 밑그림과 색칠 도구가 갖춰진 스케치북) #### 4-1. 어떤 그래프를 언제 쓸까? - **선 그래프 (Line Plot)**: 시간에 따른 주가 변화처럼, 연속적인 데이터의 **추세**를 볼 때 - **막대 그래프 (Bar Plot)**: 반별 평균 키처럼, 여러 그룹 간의 값을 **비교**할 때 - **산점도 (Scatter Plot)**: 공부 시간과 성적처럼, 두 변수 간의 **관계**나 분포를 볼 때 - **히스토그램 (Histogram)**: 우리 반 학생들의 키 분포처럼, 데이터의 **분포**를 볼 때 - **히트맵 (Heatmap)**: 여러 변수들 간의 상관관계를 한눈에 **색상**으로 파악할 때 #### 4-2. Seaborn 실전 예제 ```python import matplotlib.pyplot as plt import seaborn as sns # Seaborn에 내장된 'tips' 데이터셋 사용 tips = sns.load_dataset("tips") # 1. 산점도: 총 식사 금액과 팁 사이의 관계 plt.figure(figsize=(8, 6)) sns.scatterplot(x="total_bill", y="tip", data=tips, hue="smoker", size="size") plt.title("Total Bill vs Tip Amount") plt.xlabel("Total Bill ($)") plt.ylabel("Tip ($)") plt.grid(True) plt.show() # 2. 막대 그래프: 요일별 평균 팁 plt.figure(figsize=(8, 6)) sns.barplot(x="day", y="tip", data=tips, errorbar=None) # errorbar=None은 신뢰구간 제거 plt.title("Average Tip by Day of the Week") plt.show() ``` --- ## 5. Scikit-learn으로 첫 머신러닝 모델 만들기 > **🎯 3-4일차 목표:** Scikit-learn을 사용하여 머신러닝의 기본 프로세스(학습, 예측, 평가)를 이해합니다. ### 5-1. 머신러닝의 핵심: 훈련과 시험 - **지도학습(Supervised Learning)**: **입력(문제)**과 **정답**이 있는 데이터를 사용해, 문제와 정답 사이의 '패턴'을 기계에 학습시키는 방법입니다. > **💡 비유: 머신러닝은 '공부'와 '시험' 과정입니다.** > - **훈련 데이터 (Training Data)**: 모델이 학습하는 데 사용하는 **'교과서/모의고사'**. > - **테스트 데이터 (Test Data)**: 모델의 최종 성능을 평가하기 위해, 학습 과정에서 **전혀 사용하지 않은 새로운 '수능 문제'**. > > 훈련 데이터로만 반복해서 시험 보면 100점이 나오겠지만, 진짜 실력이라고 할 수 없겠죠? 그래서 우리는 훈련/테스트 데이터를 엄격히 분리하여 모델의 **일반화 성능**(처음 보는 데이터에 대한 예측 능력)을 측정합니다. ### 5-2. Scikit-learn 기본 4단계 프로세스 Scikit-learn은 다음과 같은 통일된 인터페이스를 제공하여 누구나 쉽게 머신러닝 모델을 만들 수 있게 해줍니다. 1. **모델 객체 생성**: `model = ModelName()` 2. **모델 학습**: `model.fit(X_train, y_train)` (훈련 데이터로 공부) 3. **예측**: `predictions = model.predict(X_test)` (테스트 데이터로 시험) 4. **평가**: `score = accuracy_score(y_test, predictions)` (채점) ```python from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score import seaborn as sns import numpy as np # 데이터 로드 (붓꽃 데이터) iris = sns.load_dataset("iris") X, y = iris.drop("species", axis=1), iris["species"] # 1. 데이터 분리 (훈련 80%, 테스트 20%) # stratify=y : 훈련/테스트 데이터의 클래스 비율을 원본과 동일하게 유지 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y) # 2. 모델 생성 및 학습 model = DecisionTreeClassifier(random_state=42) model.fit(X_train, y_train) # 3. 예측 predictions = model.predict(X_test) # 4. 평가 (정확도) accuracy = accuracy_score(y_test, predictions) print(f"정확도: {accuracy:.4f}") ``` ### 5-3. 모델 성능을 높이는 데이터 전처리 모델의 성능은 알고리즘만큼이나 **'데이터의 품질'**에 크게 좌우됩니다. "Garbage In, Garbage Out" (쓰레기를 넣으면 쓰레기가 나온다) 라는 말이 있을 정도입니다. - **피처 스케일링(Feature Scaling)**: 변수들의 단위를 맞춰줍니다. (예: 키(cm)와 몸무게(kg) -> 0~1 사이 값으로 표준화) - **StandardScaler**: 평균 0, 표준편차 1로 변환. (분포가 정규분포에 가까울 때 효과적) - **MinMaxScaler**: 최솟값 0, 최댓값 1로 변환. (모든 값을 0과 1 사이로 만들고 싶을 때) ```python from sklearn.preprocessing import StandardScaler, MinMaxScaler import numpy as np data = np.array([[170, 70], [180, 85], [160, 55]], dtype=float) scaler_std = StandardScaler() scaled_std = scaler_std.fit_transform(data) print("StandardScaler 결과:\n", scaled_std) scaler_minmax = MinMaxScaler() scaled_minmax = scaler_minmax.fit_transform(data) print("\nMinMaxScaler 결과:\n", scaled_minmax) ``` --- ## 6. 직접 해보기 (Hands-on Lab): 타이타닉 생존자 예측 > **🎯 5일차 목표:** 데이터 전처리, 시각화, 모델링, 평가의 전 과정을 종합하여 문제를 해결합니다. 고전적인 '타이타닉' 데이터셋을 사용하여, 어떤 승객이 생존했을지 예측하는 모델을 만들어 봅시다. ### 문제: 1. Seaborn에서 `titanic` 데이터셋을 불러옵니다. 2. 간단한 탐색적 데이터 분석(EDA)을 수행하세요. (`survived`와 `pclass`, `sex` 간의 관계를 막대 그래프로 시각화) 3. 모델링에 사용할 특성(`features`)으로 `pclass`, `sex`, `age`, `sibsp`, `parch`, `fare`를, 타겟(`target`)으로 `survived`를 선택하세요. 4. 결측치가 있는 `age` 열을 `age` 열의 **중앙값(median)**으로 채워주세요. 5. `sex` 열의 문자열('male', 'female')을 숫자(0, 1)로 변환해주세요. 6. 데이터를 훈련/테스트 세트로 분리하고 `StandardScaler`를 적용하여 스케일링하세요. 7. `DecisionTreeClassifier`로 모델을 학습시키고, 테스트 데이터에 대한 **정확도**를 계산하세요. --- ## 7. 되짚어보기 (Summary) 이번 주 우리는 데이터에서 패턴을 찾아 미래를 예측하는 머신러닝의 세계를 여행했습니다. - **시각화는 눈**: Matplotlib와 Seaborn으로 데이터 속에 숨겨진 이야기를 보는 법을 배웠습니다. - **머신러닝은 뇌**: Scikit-learn을 사용해 '훈련'과 '시험'이라는 과정을 거쳐 예측 모델을 만드는 법을 익혔습니다. - **데이터는 생명**: "Garbage In, Garbage Out." 좋은 예측을 위해서는 결측치 처리, 피처 스케일링과 같은 데이터 전처리가 필수임을 이해했습니다. 이제 여러분은 데이터를 분석하고 예측 모델을 만들 수 있는 기본적인 역량을 갖추었습니다. ## 8. 더 깊이 알아보기 (Further Reading) - [Scikit-learn 공식 예제 갤러리](https://scikit-learn.org/stable/auto_examples/index.html): 다양한 모델과 데이터셋에 대한 예제 코드의 보고 - [Seaborn 공식 튜토리얼](https://seaborn.pydata.org/tutorial.html): 더 아름답고 전문적인 시각화를 위한 가이드 - [Kaggle](https://www.kaggle.com/): 전 세계 데이터 과학자들이 모여 경쟁하는 플랫폼. 'Titanic'과 같은 다양한 입문용 프로젝트를 체험할 수 있습니다. --- **➡️ 다음 시간: [Part 7: 딥러닝 기초와 PyTorch](./part_7_deep_learning.md)**