머신러닝을 처음 접할 때 가장 많이 사용하는 예제가 바로 Iris 데이터다. 이 데이터는 붓꽃의 꽃잎과 꽃받침의 길이·너비를 보고 어떤 품종인지 분류하는 문제다. 이번 글에서는 이 데이터를 이용해 의사결정나무 모델을 학습하고, 예측하고, 그래프 시각화까지 진행한다.
1. Iris 데이터란?
Iris 데이터는 총 150개의 샘플로 구성되어 있고, 각 샘플에는 다음 네 가지 특성이 있다.
- 꽃받침 길이 (sepal length)
- 꽃받침 너비 (sepal width)
- 꽃잎 길이 (petal length)
- 꽃잎 너비 (petal width)
그리고 각 샘플은 세 가지 품종 중 하나에 속한다.
- setosa
- versicolor
- virginica
즉, 4개의 숫자로 이루어진 특성을 보고 어떤 품종인지 맞추는 것이 목표다.
2. 데이터 불러오기와 분리
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 데이터 불러오기
iris = load_iris()
iris_data = iris.data # 입력 데이터
iris_label = iris.target # 품종 정답
# 학습용과 테스트용 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
iris_data, iris_label,
test_size=0.2, # 20%는 테스트용
random_state=42 # 결과 고정
)
여기서 train_test_split 함수는 데이터를 학습용과 테스트용으로 나누는 역할을 한다. 학습에만 사용하면 모델이 외운 것만 잘 맞추고 새로운 데이터는 못 맞출 수 있기 때문에, 모델이 보지 못한 데이터를 따로 남겨두고 그걸로 평가하는 것이 중요하다.
3. 의사결정나무 모델 학습
from sklearn.tree import DecisionTreeClassifier
# 모델 생성
model = DecisionTreeClassifier(random_state=42)
# 모델 학습
model.fit(X_train, y_train)
의사결정나무는 데이터를 여러 조건으로 나누어가며 최종적으로 분류하는 방식이다. 예를 들어 “꽃잎 길이가 2.5cm보다 짧으면 setosa, 길면 다른 품종” 같은 식으로 나무 형태의 규칙을 만든다. 이 모델은 직관적이고 시각화가 쉬운 장점이 있다.
4. 예측과 정확도 평가
from sklearn.metrics import accuracy_score
# 테스트 데이터로 예측
y_pred = model.predict(X_test)
# 정확도 평가
acc = accuracy_score(y_test, y_pred)
print("예측 결과:", y_pred)
print("실제 정답:", y_test)
print("모델 정확도:", acc)
테스트 데이터로 예측을 해보면 거의 모든 경우를 맞춘다. iris 데이터는 구조가 단순하기 때문에 의사결정나무만으로도 높은 정확도를 낼 수 있다.
5. 의사결정나무 시각화
이제 학습된 의사결정나무를 직접 시각화해보자. 모델이 어떤 규칙으로 품종을 분류했는지 한눈에 볼 수 있다.
from sklearn import tree
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
tree.plot_tree(model,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True)
plt.show()
- feature_names: 꽃받침/꽃잎 길이와 너비 이름
- class_names: 세 가지 품종 이름
- filled=True: 노드를 색칠해 품종을 구분
결과로 나오는 나무 그래프에는 각 분기점에서 어떤 기준으로 나누는지, 각 노드에 어느 품종이 많은지가 표시된다.
6. 전체 코드
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import tree
import matplotlib.pyplot as plt
# 데이터 로드
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.2, random_state=42
)
# 모델 생성 및 학습
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
print("모델 정확도:", accuracy_score(y_test, y_pred))
# 의사결정나무 시각화
plt.figure(figsize=(12,8))
tree.plot_tree(model,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True)
plt.show()

7. 정리
- Iris 데이터는 꽃의 특성을 이용해 품종을 분류하는 간단한 예제 데이터다.
- 학습과 테스트 데이터를 나눠야 모델의 진짜 실력을 평가할 수 있다.
- 의사결정나무는 규칙을 쉽게 이해하고 시각화할 수 있는 모델이다.
- 시각화된 나무를 보면 어떤 기준으로 나누는지 직관적으로 알 수 있다.
이 과정을 이해하면 이후 더 복잡한 데이터와 모델을 다룰 때도 기본 흐름을 쉽게 따라갈 수 있다.