🌸 [머신러닝 입문] 세상에서 가장 유명한 데이터, 붓꽃(Iris) 품종 예측하기
1. Iris 데이터셋이란? (이론)
프랑스의 국화이기도 한 붓꽃(Iris)은 '좋은 소식', '사랑의 메세지'라는 예쁜 꽃말을 가지고 있습니다. 이 붓꽃 데이터는 1936년 통계학자 로널드 피셔(Ronald Fisher)의 논문에서 처음 사용된 이후, 머신러닝 분류(Classification) 문제의 교과서처럼 쓰이고 있습니다.
우리의 목표는 붓꽃의 형태(데이터)를 보고, 이 붓꽃이 3가지 품종(Setosa, Versicolor, Virginica) 중 어디에 속하는지 컴퓨터가 스스로 맞추게 하는 것입니다.
컴퓨터에게 힌트를 줄 데이터(Feature)는 총 4가지입니다.
- Sepal Length: 꽃받침의 길이
- Sepal Width: 꽃받침의 폭(너비)
- Petal Length: 꽃잎의 길이
- Petal Width: 꽃잎의 폭(너비)
2. 데이터 가져오기 및 탐색 (실무)
파이썬의 대표적인 머신러닝 라이브러리인 scikit-learn(사이킷런)은 연습용 데이터(Toy dataset)를 내장하고 있습니다.
💻 scikit-learn 데이터셋 로드하기
from sklearn.datasets import load_iris
# 데이터 불러오기
iris = load_iris()
print(type(iris))
print(iris.keys())
사이킷런의 데이터셋은 딕셔너리와 유사한 Bunch 객체로 되어 있습니다. keys()를 통해 어떤 정보가 들어있는지 확인해 보면 다음과 같은 핵심 구성 요소를 볼 수 있습니다.
- data: Feature (입력 데이터, X) - 꽃잎과 꽃받침의 길이/너비 숫자들
- target: Label (정답 데이터, y) - 0, 1, 2 로 표현된 품종
- target_names: 정답의 진짜 이름 - ['setosa', 'versicolor', 'virginica']
- feature_names: 입력 데이터 컬럼 이름
- DESCR: 데이터셋에 대한 상세 설명서
💻 데이터를 Pandas 데이터프레임으로 예쁘게 보기
숫자만 보면 어지러우니 Pandas를 이용해 엑셀 표처럼 예쁘게 만들어 봅시다.
import pandas as pd
# 입력 데이터(X)로 데이터프레임 생성
df = pd.DataFrame(iris['data'], columns=iris['feature_names'])
# 정답(y) 컬럼 추가
df['품종'] = iris['target']
# 0, 1, 2 대신 진짜 품종 이름으로 변환 (apply 함수와 lambda 활용)
df['품종_이름'] = df['품종'].apply(lambda i : iris['target_names'][i])
df.head()
- 💡 핵심 이론: .apply(함수)는 데이터프레임의 컬럼 데이터들을 일괄적으로 처리할 때 사용하는 마법의 메소드입니다. 여기서는 0, 1, 2 숫자를 배열의 인덱스로 삼아 실제 이름으로 맵핑했습니다.
3. 규칙 기반 vs 머신러닝 (이론)
만약 어떤 꽃의 꽃받침(Sepal)이 길이 5cm, 폭 3.5cm 이고 꽃잎(Petal)이 길이 1.4cm, 폭 0.25cm 라면 무슨 종일까요?
- 규칙 기반 (전통적 프로그래밍): 프로그래머가 직접 데이터를 보고 if (sepal_length < 5.5) and (petal_length < 2): return 'Setosa' 처럼 규칙을 하나하나 코딩해야 합니다. 조건이 복잡해지면 인간이 규칙을 찾을 수 없습니다.
- 머신러닝: 컴퓨터에게 "데이터와 정답을 줄 테니, 넌 규칙(패턴)만 알아서 찾아내!" 라고 시키는 것입니다.

4. 결정 트리(Decision Tree)로 모델 만들기 (실무)

결정 트리(Decision Tree)는 스무고개 놀이처럼 "꽃잎 길이가 2.45cm 이하인가요?" 같은 질문을 던지며 데이터를 분류해 나가는 직관적인 알고리즘입니다.
머신러닝 모델 구현은 딱 4단계만 기억하세요!
💻 모델 4단계 프로세스
import numpy as np
from sklearn.tree import DecisionTreeClassifier
# 1. 모델 import
# (분류 문제이므로 Classifier를 사용합니다)
# 2. 모델 생성
model = DecisionTreeClassifier()
# 3. 모델 학습 시키기 (fit)
# 입력 데이터(iris.data)와 정답(iris.target)을 던져주고 규칙을 찾게 합니다.
model.fit(iris.data, iris.target)
# 4. 새로운 데이터 예측하기 (predict)
new_data = np.array([
[5, 3.5, 1.4, 0.25],
[2, 2.2, 5.3, 2.2]
])
result = model.predict(new_data)
for label in result:
print(label, iris.target_names[label])
짜잔! 모델이 새로운 데이터를 보고 스스로 품종을 예측해 냈습니다.
5. 진짜 좋은 모델일까? (데이터 분할과 평가)
우리가 만든 모델이 진짜 똑똑한지 어떻게 알 수 있을까요? 방금은 학습에 사용한 데이터를 그대로 가지고 훈련만 시킨 상태입니다. 마치 모의고사 문제와 답지를 통째로 외우게 한 뒤, 똑같은 모의고사로 수능을 보게 하는 것과 같습니다. 당연히 100점이 나오겠죠? (이를 과적합, Overfitting이라고 합니다)
💻 Train / Test 분할하기
진짜 실력을 평가하려면 공부할 데이터(Train)와 시험 볼 데이터(Test)를 나눠야 합니다. 통상적으로 8:2 비율로 나눕니다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
iris.data,
iris.target,
test_size=0.2, # 테스트 데이터를 20%로 설정
stratify=iris.target, # ★중요: 정답(Class)의 비율을 원본과 동일하게 맞춤
random_state=0 # 데이터를 랜덤으로 섞을 때 결과가 매번 안 바뀌게 시드 고정
)
💻 재학습 및 평가 (정확도 & 혼동행렬)
이제 분할된 훈련 데이터(X_train, y_train)로만 다시 학습시키고, 시험 데이터(X_test, y_test)로 평가를 해봅시다.
from sklearn.metrics import accuracy_score, confusion_matrix
# 모델 다시 생성 및 학습 (Train 데이터로만!)
tree_model = DecisionTreeClassifier(random_state=0)
tree_model.fit(X_train, y_train)
# 예측 수행 (Test 데이터의 정답을 가리고 문제만 줌)
pred_test = tree_model.predict(X_test)
# 1. 정확도(Accuracy) 평가: 전체 중에 몇 개나 맞췄어?
acc_test = accuracy_score(y_test, pred_test)
print(f"Testset 정확도: {acc_test:.5f}")
# 2. 혼동행렬(Confusion Matrix): 대체 뭘 틀린 거야?
cm_test = confusion_matrix(y_test, pred_test)
print(pd.DataFrame(cm_test))
- 정확도(Accuracy)는 전체 문제 중 정답을 맞춘 비율입니다.
- 혼동행렬(Confusion Matrix)은 행(Row)은 '실제 정답', 열(Column)은 '모델이 예측한 값'을 나타내는 표입니다. 모델이 특별히 어떤 품종을 다른 품종으로 헷갈려하는지 정밀하게 분석할 때 사용합니다.
📝 [실습 TODO] 내 손으로 직접 해보기!
오늘 배운 전체 프로세스를 바탕으로 빈 셀에 직접 코드를 작성해 보세요. 에러가 나면 블로그의 위 코드를 참고하면서 해결해 보는 것이 최고의 공부입니다!
- TODO 1: DecisionTreeClassifier 모델을 생성할 때, max_depth=3 이라는 옵션을 넣어서 모델을 만들어 보세요. (예: DecisionTreeClassifier(max_depth=3))
- TODO 2: 생성한 모델을 X_train, y_train 데이터를 이용해 학습(fit)시켜 보세요.
- TODO 3: X_test 데이터를 넣어 예측(predict)을 수행하고 결과를 my_pred라는 변수에 저장하세요.
- TODO 4: 실제 정답인 y_test와 내가 예측한 my_pred를 비교하여 accuracy_score (정확도)를 출력해 보세요. 과연 몇 퍼센트의 정확도가 나올까요?
'두두 IT > 파이썬' 카테고리의 다른 글
| [머신러닝 3-2] 데이터셋 분할 & 교차 검증 (0) | 2026.05.12 |
|---|---|
| [머신러닝 3-1] 데이터셋 분리와 모델 검증 (0) | 2026.05.12 |
| [PYTHON] NumPy 데이터 다루기 (0) | 2026.05.08 |
| [PYTHON] 파이썬 데이터 분석 기초 Numpy (0) | 2026.05.08 |
| [PYTHON] 시각화 3가지 방식 비교 (1) | 2026.05.08 |