Overview
머신러닝을 처음 접하는 사람이라면 "지도학습과 비지도학습이 뭐가 다른가요?" 라는 질문을 자주 하게 된다.
이 글에서는 과일 분류와 붓꽃(Iris) 데이터 예제를 통해
- 지도학습(정답이 있는 데이터로 분류/예측)
- 비지도학습(정답 없이 데이터 패턴만으로 그룹화)
- 유사도(데이터 간의 닮은 정도)
- 호환성(함께 있을 때의 조합 적합도)
등 머신러닝의 핵심 개념을 직관적으로 설명한다.
실제 Python 코드를 통해
- DecisionTree, SVM, KNN, LogisticRegression 등 다양한 분류 알고리즘
- KMeans 군집화, Cosine Similarity 등
을 실습하며, 지도학습과 비지도학습의 원리와 차이, 그리고 실전에서의 해석 방법까지 단계별로 경험할 수 있다.

머신러닝의 두 갈래: 지도학습과 비지도학습
지도학습(Supervised Learning) – “정답이 주어진다”
"이 과일은 사과입니다"
→ 정답(라벨)이 주어진 상태에서 학습하는 방식
| 특징 | 설명 |
| 입력값 | 과일의 색, 크기, 당도 등 |
| 출력값 | 라벨 (예: 사과, 바나나, 포도) |
| 목적 | 주어진 입력을 보고 정답을 예측하는 모델 학습 |
| 예시 | 과일 이미지 → 사과/바나나/포도 예측 |
예시
입력: [색=빨강, 크기=작음, 당도=높음]
출력: 사과 (label)
비지도학습(Unsupervised Learning) – “정답 없이 스스로 찾는다”
"이 과일들은 비슷해 보여. 같은 그룹일 거야!"
→ 정답이 없이, 데이터 간의 구조를 스스로 파악하는 방식
| 특징 | 설명 |
| 입력값 | 과일의 색, 크기, 당도 등 |
| 출력값 | 없음 (라벨 없이 군집만 찾음) |
| 목적 | 유사한 데이터를 묶거나 특징을 추출 |
| 예시 | 과일을 색/크기에 따라 자동으로 군집화 |
예시
입력: 다양한 과일 특성 데이터
출력: Cluster 1 = 사과 유사 그룹, Cluster 2 = 바나나 유사 그룹
유사도(Similarity) vs 호환성(Compatibility)
머신러닝에서 유사도와 호환성은 종종 비슷하게 느껴지지만, 실제론 목적과 계산 방식이 다르다.
유사도 (Similarity)
"사과와 배는 모양이 비슷하다."
→ 두 객체 간의 거리 또는 형태가 얼마나 가까운지를 측정
| 특징 | 설명 |
| 핵심 질문 | 얼마나 닮았는가? |
| 수학적 표현 | Cosine Similarity, Euclidean Distance 등 |
| 사용 예 | 추천 시스템, 군집화, 유사 이미지 검색 등 |
예
- 사과와 배의 색상/당도/크기 차이 → 거리 계산
- 거리 0이면 거의 같은 과일
호환성 (Compatibility)
"사과는 꿀과 잘 어울리고, 바나나는 우유랑 잘 어울린다."
→ 두 개체가 함께 있을 때 조합이 얼마나 좋은지를 평가
| 특징 | 설명 |
| 핵심 질문 | 함께 있을 때 잘 맞는가? |
| 수학적 표현 | 점수 기반 (상호작용 모델, co-occurrence 등) |
| 사용 예 | 커플 매칭, 상품 연관 추천, 음식 조합 추천 |
예
- 사과 + 꿀 조합 점수 = 9.1
- 사과 + 된장 조합 점수 = 2.3
정리: 과일로 보는 머신러닝 주요 개념
| 구분 | 설명 | 예시 |
| 지도학습 | 정답을 보고 배우는 학습 | 과일 사진 → 사과인지 예측 |
| 비지도학습 | 정답 없이 스스로 그룹 찾기 | 유사한 과일끼리 묶기 |
| 유사도 | 얼마나 닮았는가? | 사과 vs 배 |
| 호환성 | 함께 있을 때 잘 맞는가? | 사과 + 꿀 |
실제 Python 코드 실습 (로컬에서 실행 가능)
실습 1: 과일 분류기 만들기 (Scikit-Learn)
https://github.com/somaz94/ml-basics/tree/main/intro
ml-basics/intro at main · somaz94/ml-basics
ml-basics. Contribute to somaz94/ml-basics development by creating an account on GitHub.
github.com
가상환경 생성 및 활성화(권장)
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
의존성 설치
pip3 install -r requirements.txt
`requirements.txt`
scikit-learn
numpy
matplotlib
예제 실행
python3 fruit_ml_examples.py
`supervised_vs_unsupervised.py`
from sklearn.tree import DecisionTreeClassifier
from sklearn.cluster import KMeans
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import matplotlib.pyplot as plt
# --------------------------------
# 한글 폰트 설정
# --------------------------------
plt.rcParams['font.family'] = 'AppleGothic' # macOS 한글 폰트
plt.rcParams['axes.unicode_minus'] = False
# -----------------------
# 지도학습: 과일 분류기
# -----------------------
print("📘 지도학습 - Decision Tree로 과일 예측")
# 과일의 [색, 크기, 당도]
X = [[1, 1, 9], [1, 2, 10], [3, 4, 3], [2, 4, 4], [4, 1, 8]]
y = [0, 0, 1, 1, 2] # 0:사과, 1:바나나, 2:포도
clf = DecisionTreeClassifier()
clf.fit(X, y)
pred = clf.predict([[1, 1, 10]])
print("예측 결과 (라벨):", pred)
# -----------------------
# 비지도학습: 과일 군집화
# -----------------------
print("\n📘 비지도학습 - KMeans로 군집화")
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X)
print("군집 결과:", clusters)
# 시각화
plt.scatter([x[0] for x in X], [x[2] for x in X], c=clusters)
plt.xlabel("색상")
plt.ylabel("당도")
plt.title("KMeans 과일 군집화")
plt.show()
# -----------------------
# 유사도 비교 (Cosine)
# -----------------------
print("\n📘 유사도 - Cosine Similarity")
apple = np.array([[1, 1, 9]])
pear = np.array([[2, 1, 9]])
banana = np.array([[3, 4, 3]])
sim_apple_pear = cosine_similarity(apple, pear)
sim_apple_banana = cosine_similarity(apple, banana)
print("사과-배 유사도:", sim_apple_pear)
print("사과-바나나 유사도:", sim_apple_banana)
결과 확인

종료하면 아래와 같이 나온다.
python3 fruit_ml_examples.py
📘 지도학습 - Decision Tree로 과일 예측
예측 결과 (라벨): [0]
📘 비지도학습 - KMeans로 군집화
군집 결과: [0 0 1 1 2]
📘 유사도 - Cosine Similarity
사과-배 유사도: [[0.9942395]]
사과-바나나 유사도: [[0.64003012]]
실습 1: 과일 분류기 만들기 (Scikit-Learn) 설명
지도학습 - Decision Tree로 과일 예측
- 설명
- 입력 데이터(X)는 과일의 [색, 크기, 당도] 특성이고, y는 과일의 종류(0:사과, 1:바나나, 2:포도) 이다.
- DecisionTreeClassifier로 학습 후, [1, 1, 10] 특성을 가진 과일을 예측했다.
- 결과
- 예측 결과 (라벨): [0]
입력값이 사과(0)로 분류됨을 의미한다.
비지도학습 - KMeans로 군집화
- 설명
- 같은 과일 특성 데이터(X)를 KMeans 알고리즘으로 3개의 군집(클러스터)로 나눴다.
- 군집화는 정답(y) 없이, 데이터의 패턴만 보고 자동으로 그룹을 나눈다.
- 결과
- 군집 결과: [0 0 1 1 2]
각 데이터가 어느 군집에 속하는지(0, 1, 2) 표시
예를 들어, 첫 번째/두 번째 과일은 0번 군집, 세 번째/네 번째는 1번, 다섯 번째는 2번 군집에 속함
유사도 - Cosine Similarity
- 설명
- 사과, 배, 바나나의 특성 벡터(색, 크기, 당도)를 비교하여,
코사인 유사도
(두 벡터의 방향이 얼마나 비슷한지)를 계산한다.
- 결과
- 사과-배 유사도: [[0.9942395]]
사과와 배는 특성이 매우 비슷함(1에 가까울수록 유사)
- 사과-바나나 유사도: [[0.64003012]]
사과와 바나나는 덜 비슷함(0.6 정도)
요약
- 지도학습
- 정답(라벨)이 있는 데이터로 분류/예측
- 예: 사과/바나나/포도 분류
- 비지도학습
- 정답 없이 데이터 패턴만으로 그룹화
- 예: 과일 특성만 보고 자동으로 군집 나누기
- 유사도 비교
- 두 데이터(과일)의 특성이 얼마나 비슷한지 수치로 계산
- 예: 사과와 배는 매우 비슷, 사과와 바나나는 덜 비슷
실습 2 : 붓꽃(Iris) 데이터 분류/군집화
https://github.com/somaz94/ml-basics/tree/main/iris_classification
ml-basics/iris_classification at main · somaz94/ml-basics
ml-basics. Contribute to somaz94/ml-basics development by creating an account on GitHub.
github.com
가상환경 생성 및 활성화(권장)
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
의존성 설치
pip3 install -r requirements.txt
`requirements.txt`
scikit-learn
numpy
matplotlib
pandas
예제 실행
python3 iris_classification.py
결과 확인


종료하면 아래와 같이 나온다.
python3 iris_classification.py
📘 지도학습 - SVM, KNN, LogisticRegression로 품종 분류
SVM 정확도: 1.000
KNN 정확도: 1.000
LogisticRegression 정확도: 1.000
📘 비지도학습 - KMeans로 군집화 및 실제 품종과 비교
KMeans 군집 결과(0~2): [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 0 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 0 0 0 0 2 0 0 0 0
0 0 2 2 0 0 0 0 2 0 2 0 2 0 0 2 2 0 0 0 0 0 2 0 0 0 0 2 0 0 0 2 0 0 0 2 0
0 2]
실제 품종 라벨(0~2): [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
군집-실제 라벨 혼동 행렬:
[[ 0 50 0]
[ 3 0 47]
[36 0 14]]
실습 2 : 붓꽃(Iris) 데이터 분류/군집화 설명
지도학습 - SVM, KNN, LogisticRegression로 품종 분류
- 설명
- SVM, KNN, LogisticRegression 세 가지 분류 알고리즘으로 붓꽃의 품종(0: setosa, 1: versicolor, 2: virginica)을 예측했다.
- 데이터셋을 학습/테스트로 나누고, 각 모델의 정확도를 평가했다.
- 결과
- SVM 정확도: 1.000
- KNN 정확도: 1.000
- LogisticRegression 정확도: 1.000
모두 100% 정확도로 테스트셋의 품종을 완벽하게 분류했다.
- 붓꽃 데이터는 특성이 잘 분리되어 있어, 대표적인 분류 알고리즘들이 모두 높은 성능을 보인다.
비지도학습 - KMeans로 군집화 및 실제 품종과 비교
- 설명
- KMeans 알고리즘으로 라벨(정답) 없이 데이터를 3개의 군집으로 나눴다.
- 군집 결과와 실제 품종 라벨을 비교하여, 군집화가 실제 품종 분류와 얼마나 일치하는지 확인한다.
- 결과
- KMeans 군집 결과(0~2): ...
→ 각 데이터가 어느 군집(0, 1, 2)에 속하는지 배열로 표시
- 실제 품종 라벨(0~2): ...
→ 실제 붓꽃 품종(0: setosa, 1: versicolor, 2: virginica)
- 군집
혼동 행렬(Confusion Matrix) 해석
- 행: 실제 품종(0, 1, 2)
- 열: KMeans가 할당한 군집(0, 1, 2)
| 군집0 | 군집1 | 군집2 | |
| 실제0(setosa) | 0 | 50 | 0 |
| 실제1(versicolor) | 3 | 0 | 47 |
| 실제2(virginica) | 36 | 0 | 14 |
- 실제 setosa(0): 모두 군집1로 잘 묶임 (50개)
- 실제 versicolor(1): 대부분 군집2(47개), 일부 군집0(3개)
- 실제 virginica(2): 군집0(36개), 군집2(14개)로 분산
요약
- KMeans는 setosa(0)는 완벽하게 구분하지만, versicolor(1)와 virginica(2)는 일부 혼동이 있다.
- 이는 비지도학습(정답 없이 패턴만 보고 그룹화)의 한계이자, 실제 데이터의 분포 특성 때문이다.
- 지도학습(분류): 정답(라벨)이 있을 때, SVM/KNN/LogisticRegression 모두 100% 정확도로 품종을 예측할 수 있다.
- 비지도학습(군집화): 정답 없이 데이터 패턴만으로 그룹을 나누면, 일부 품종(setosa)은 잘 구분되지만, 나머지는 혼동이 발생할 수 있다.
- 혼동 행렬을 통해 군집화 결과와 실제 라벨의 일치/불일치를 정량적으로 확인할 수 있다.
더 쉽게 얘기해보자면,
- K-Means는 답을 모르고, 꽃의 모양(데이터 패턴)만 보고 종류를 나누는 방법이다.
→ 이 방식으로는 Setosa는 확실히 구분되지만, 나머지 두 품종은 헷갈릴 수 있다.
- 반면 SVM, KNN, 로지스틱 회귀 같은 방법은 답(품종 이름)을 알고 배우기 때문에
→ 세 품종 모두 아주 정확하게 맞출 수 있다.
실습 3 : 와인 품질 데이터 분류/회귀/군집화 실습
기본설정은 실습 1,2와 동일하다. 아래의 Repo를 참고하길 바란다.
https://github.com/somaz94/ml-basics/tree/main/wine_quality
ml-basics/wine_quality at main · somaz94/ml-basics
ml-basics. Contribute to somaz94/ml-basics development by creating an account on GitHub.
github.com
예제 실행
python3 wine_quality.py
...
와인 품질 데이터 로드 중...
데이터 shape: (1599, 11), 타겟 shape: (1599,)
📘 지도학습 - RandomForest로 와인 품질 등급 분류
RandomForest 분류 정확도: 0.665
📘 지도학습 - LinearRegression으로 와인 품질 점수 예측
LinearRegression MSE: 0.411
📘 비지도학습 - KMeans로 와인 군집화
KMeans 군집 결과(0~2): [855 504 240]
실제 품질 등급 분포: [ 0 0 0 10 53 681 638 199 18]

이외에도 다양한 실습을 할 수 있다.









궁금한 점: 왜 지도학습과 비지도학습 둘 다 필요할까요?
지도 학습이 필요한 이유
1. 정확한 예측이 필요한 경우
- 예시: 의료 진단
- 입력: 환자의 증상, 검사 결과
- 정답: 실제 진단 결과 (암/정상)
- 목적: 새로운 환자의 진단을 정확히 예측
비지도학습의 한계 : 증상만 보고 "비슷한 그룹"으로 나눌수는 있지만, "이 환자가 암인지 아닌지"는 정확히 알 수 없다.
2. 명확한 목표가 있는 비즈니스 문제
- 예시: 신용카드 사기 탐지
- 입력: 거래 패턴, 금액, 시간 등
- 정답: 실제 사기 여부(사기/정상)
- 목적: 새로운 거래의 사기 여부를 정확히 판단
비지도 학습의 한계: "이상한 패턴"은 찾을 수 있지만, "정말 사기인지"는 확신할 수 없다.
3. 라벨링턴 데이터가 충분한 경우
- 예시: 이미지 분류
- 입력: 고양이/강아지 사진
- 정답: 실제 동물 종류
- 목적: 새로운 사진의 동물 종류 예측
비지도 학습이 필요한 이유
1. 라벨링된 데이터가 없는 경우
- 실제 상황: 대부분의 데이터는 라벨이 없음
- 웹사이트 방문 로그
- 소셜미디어 포스트
- 센서 데이터
- 고객 구매 기록
지도 학습의 한계: 라벨이 없으면 학습할 수 없다.
2. 숨겨진 패턴을 발견하고 싶은 경우
- 예시: 연구 데이터 분석
- 입력: 복잡한 실험 데이터
- 목적: 데이터의 구조와 관계 파악
- 결과: 예상치 못한 패턴 발견
실제 프로젝트에서의 활용
단계별 접근법
- 1단계: 비지도학습으로 데이터 탐색 → "어떤 패턴이 있나?" 파악
- 2단계: 지도학습으로 정확한 예측 → "이 패턴이 무엇을 의미하냐?" 학습
예시: 온라인 쇼핑몰
- 비지도학습: 고객 구매 패턴 분석
- "이 고객들은 비슷한 상품을 산다"
- "이 그룹은 주로 주말에 구매한다"
- 지도학습: 구매 예측 모델
- "이 고객이 다음에 무엇을 살 확률이 높다"
- "이 고객이 이탈할 확률이 높다"
각각의 장단점 비교
| 구분 | 지도학습 | 비지도학습 |
| 장점 | 정확한 예측 가능명확한 목표 | 라벨 불필요새로운 패턴 발견 |
| 단점 | 라벨링된 데이터 필요비용과 시간 소요 | 정확도 보장 어려움해석이 주관적 |
| 적합한 상황 | 정확한 예측이 중요한 경우 | 데이터 탐색이 목적인 경우 |
지도학습은 "정답을 알려주는 것"이 아니라, "정답을 바탕으로 미래를 예측하는 것"이다. 비지도학습은 "정답 없이 패턴을 찾는 것"이다.
둘 다 각자의 역할이 있고, 함께 사용할 때 가장 강력하다.
UCI Machine Learning Repository란?
- 미국 캘리포니아 대학교 어바인(UCI)에서 운영하는 공개 데이터셋 저장소이다.
- 머신러닝(Machine Learning) 및 데이터 사이언스(Data Science) 분야의 연구자들과 학습자들이 가장 많이 참고하는 대표적인 데이터셋 모음이다.
- 공식 사이트: https://archive.ics.uci.edu/ml
주요 특징
- 다양한 분야의 데이터셋 제공
예: 건강, 금융, 생물학, 문자 분류, 이미지 인식 등 - 정답(Label)이 있는 데이터셋 위주
→ 분류(Classification), 회귀(Regression) 문제를 연습하기에 적합 - 논문, 강의, 튜토리얼에서 자주 사용됨
→ 알고리즘 성능 비교(벤치마크)나 실습에 활용됨 - 무료로 누구나 접근 가능
마무리
머신러닝의 세계는 “정답이 있는가, 없는가”에서 출발한다.
- 지도학습은 정답(라벨)이 있는 데이터로부터 예측 모델을 만들고,
- 비지도학습은 정답 없이 데이터의 숨겨진 구조나 패턴을 찾아낸다.
실습을 통해 알 수 있듯,
- 지도학습은 높은 정확도로 분류가 가능하지만,
- 비지도학습은 데이터의 특성에 따라 군집이 완벽히 일치하지 않을 수 있다.
또한,
- 유사도는 데이터 간의 닮은 정도를 수치로 표현하고,
- 호환성은 두 개체가 함께 있을 때의 조합 적합도를 평가한다.
이처럼 머신러닝의 다양한 개념을 실제 데이터와 코드로 실습해보면,
이론적 정의뿐 아니라 실제 데이터에서의 한계와 해석까지 자연스럽게 이해할 수 있다.
Reference
- Scikit-learn 공식문서
- Scikit-learn: Supervised vs Unsupervised Learning
- Iris 데이터셋 설명
- Towards Data Science – Supervised vs Unsupervised Learning
- Google Developers – Recommendation Systems (Similarity/Compatibility)
- Cosine Similarity 설명
- KMeans Clustering 공식 예제
'AI > Machine Learning' 카테고리의 다른 글
| 데이터셋을 선택할 때 고려해야 할 "적합성(Suitability)"과 "기반 개념(Underlying Concept)" (0) | 2025.10.29 |
|---|