# Part 6: 머신러닝 모델링과 평가 (6주차) **⬅️ 이전 시간: [Part 5: AI 핵심 라이브러리](./part_5_ai_core_libraries.md)** | **➡️ 다음 시간: [Part 7: 딥러닝 기초와 PyTorch](./part_7_deep_learning.md)** --- ## 📜 실습 코드 바로가기 - **`part_6_machine_learning.py`**: [바로가기](./source_code/part_6_machine_learning.py) - 본 파트에서 다루는 Matplotlib, Seaborn, Scikit-learn의 핵심 기능 예제 코드를 직접 실행하고 수정해볼 수 있습니다. --- ### 🎯 6주차 학습 목표 - **[Matplotlib](./glossary.md#matplotlib--seaborn)**과 **[Seaborn](./glossary.md#matplotlib--seaborn)**으로 데이터를 시각화하여 인사이트를 발견합니다. - **[Scikit-learn](./glossary.md#scikit-learn)을 사용하여 머신러닝의 기본 프로세스(학습, 예측, 평가)를 이해합니다. - 모델 성능을 높이기 위한 핵심 데이터 전처리 기법을 학습합니다. --- ## 1-2일차(월-화): 데이터 시각화 - 그림으로 데이터 보기 데이터를 숫자로만 보는 것은 마치 숲을 보지 못하고 나무 하나하나만 보는 것과 같습니다. 시각화는 데이터 속에 숨겨진 패턴, 관계, 이상치를 한눈에 파악하게 해주는 강력한 도구입니다. - **[Matplotlib](./glossary.md#matplotlib--seaborn)**: 파이썬 시각화의 근간. 거의 모든 종류의 그래프를 그릴 수 있는 강력한 라이브러리. (비유: 하얀 도화지) - **[Seaborn](./glossary.md#matplotlib--seaborn)**: Matplotlib을 더 쉽고 예쁘게 사용할 수 있도록 만든 고수준 라이브러리. 통계적인 그래프 기능이 특화되어 있습니다. (비유: 밑그림과 색칠 도구가 갖춰진 스케치북) #### 💡 쉽게 이해하기: 어떤 그래프를 언제 쓸까? > - **선 그래프 (Line Plot)**: '시간'에 따른 주가 변화처럼, 연속적인 데이터의 '추세'를 볼 때 > - **막대 그래프 (Bar Plot)**: 반별 평균 키처럼, 여러 '그룹' 간의 값을 '비교'할 때 > - **산점도 (Scatter Plot)**: 공부 시간과 성적처럼, 두 변수 간의 '관계'나 '분포'를 볼 때 > - **히스토그램 (Histogram)**: 우리 반 학생들의 키 분포처럼, 특정 데이터 구간에 얼마나 많은 값이 있는지 '분포'를 볼 때 > - **히트맵 (Heatmap)**: 여러 변수들 간의 상관관계를 한눈에 '색상'으로 파악할 때 ```python import matplotlib.pyplot as plt import seaborn as sns import pandas as pd # 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.savefig("scatter_plot.png") # 그래프를 파일로 저장 plt.show() # 2. 막대 그래프: 요일별 평균 팁 plt.figure(figsize=(8, 6)) sns.barplot(x="day", y="tip", data=tips, errorbar=None) plt.title("Average Tip by Day of the Week") plt.xlabel("Day") plt.ylabel("Average Tip ($)") plt.show() ``` --- ## 3-4일차(수-목): 첫 머신러닝 모델 만들기 ### 1. 머신러닝이란? - **[지도학습](./glossary.md#지도학습-supervised-learning)**: **입력(문제)**과 **정답**이 있는 데이터를 사용해, 문제와 정답 사이의 '패턴'을 기계에 학습시키는 방법. #### 💡 쉽게 이해하기: '훈련'과 '시험' > 머신러닝 모델 평가는 '공부'와 '시험' 과정과 같습니다. > - **[훈련 데이터](./glossary.md#훈련-데이터-vs-테스트-데이터) (교과서/모의고사)**: 모델이 학습하는 데 사용하는 데이터입니다. > - **[테스트 데이터](./glossary.md#훈련-데이터-vs-테스트-데이터) (수능)**: 모델의 최종 성능을 평가하기 위해, 학습 과정에서 **전혀 사용하지 않은** 새로운 데이터입니다. > > 훈련 데이터로만 반복해서 시험 보면 100점이 나오겠지만, 진짜 실력이라고 할 수 없겠죠? 그래서 우리는 훈련/테스트 데이터를 엄격히 분리하여 모델의 **일반화 성능**(처음 보는 데이터에 대한 예측 능력)을 측정합니다. ### 2. Scikit-learn 기본 사용법 [Scikit-learn](./glossary.md#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) print("예측값:", predictions) # 4. 평가 (정확도) accuracy = accuracy_score(y_test, predictions) print(f"정확도: {accuracy:.4f}") # 새로운 데이터 예측해보기 # 꽃받침 길이, 너비, 꽃잎 길이, 너비 new_data = np.array([[5.0, 3.5, 1.5, 0.2]]) # 'setosa' 품종으로 예상 new_prediction = model.predict(new_data) print(f"새로운 데이터 예측 결과: {new_prediction[0]}") ``` --- ## 5일차(금): 모델 성능 향상을 위한 데이터 전처리 모델의 성능은 알고리즘만큼이나 **'데이터의 품질'**에 크게 좌우됩니다. "Garbage In, Garbage Out" (쓰레기를 넣으면 쓰레기가 나온다) 라는 말이 있을 정도입니다. - **결측치 처리**: 비어있는 값을 채우거나(평균, 중앙값 등) 해당 행/열을 제거합니다. - **[피처 스케일링](./glossary.md#피처-스케일링feature-scaling)**: 변수들의 단위를 맞춰줍니다. (예: 키(cm)와 몸무게(kg) -> 0~1 사이 값으로 표준화) - **StandardScaler**: 평균 0, 표준편차 1로 변환. - **MinMaxScaler**: 최솟값 0, 최댓값 1로 변환. ```python from sklearn.preprocessing import StandardScaler, MinMaxScaler import numpy as np data = np.array([[170, 70], [180, 85], [160, 55]], dtype=float) # StandardScaler scaler_std = StandardScaler() scaled_std = scaler_std.fit_transform(data) print("StandardScaler 결과:\n", scaled_std) # MinMaxScaler scaler_minmax = MinMaxScaler() scaled_minmax = scaler_minmax.fit_transform(data) print("\nMinMaxScaler 결과:\n", scaled_minmax) ``` ### 📚 6주차 마무리 및 다음 단계 이번 주 우리는 데이터를 시각적으로 탐색하고, Scikit-learn을 사용해 머신러닝의 전 과정을 직접 체험했습니다. 이제 여러분은 데이터를 분석하고 예측 모델을 만들 수 있는 기본적인 역량을 갖추었습니다. 다음 시간에는 드디어 **딥러닝**의 세계로 들어갑니다. **PyTorch**를 사용하여 인공 신경망을 직접 만들고, 컴퓨터 비전과 자연어 처리의 기초를 맛보는 흥미로운 여정이 시작됩니다. **➡️ 다음 시간: [Part 7: 딥러닝 기초와 PyTorch](./part_7_deep_learning.md)**