ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 혼공머신 Ch 01 나의 첫 머신러닝
    Study/머신러닝 딥러닝 2025. 9. 21. 16:10

     

     

    머신러닝 첫걸음: k-최근접 이웃(k-NN)으로 생선 종류 구분하기

    목차

    1. 들어가며: AI, 머신러닝, 딥러닝? 개념 잡고 시작하기
    2. 1단계: 데이터와 친해지기 (데이터 준비 및 분석)
    3. 2단계: 똑똑한 분류 모델 만들기 (k-최근접 이웃 알고리즘)
    4. 마치며: 첫 모델의 의미와 다음 단계

    1. 들어가며: AI, 머신러닝, 딥러닝? 개념 잡고 시작하기

     

     

    '인공지능', '머신러닝', '딥러닝'. 최근 뉴스나 기술 문서에서 정말 자주 보이는 단어들이지만,

    많은 분들이 그 차이를 명확히 구분하기 어려워합니다. 본격적인 실습에 앞서, 이들의 관계를 간단히 정리하고 넘어가겠습니다.

     

    • 인공지능 (Artificial Intelligence, AI):
      가장 넓은 개념입니다. 인간의 학습, 추론, 지각 능력 등을 컴퓨터를 통해 구현하는 모든 기술을 의미합니다.
      마치 사람처럼 생각하고 행동하는 기계를 만들려는 거대한 목표라고 할 수 있습니다.
    • 머신러닝 (Machine Learning, ML):
      인공지능을 구현하는 하나의 방법입니다. 기
      계에게 명시적인 규칙을 프로그래밍하는 대신, 데이터를 주고 스스로 학습하게 하여 특정 패턴이나 규칙을 찾아내게 하는 방식입니다.
    • 딥러닝 (Deep Learning, DL):
      머신러닝의 한 분야로, 인간의 뇌 신경망을 모방한 '인공 신경망'을 깊게(Deep) 쌓아올려 학습하는 기술입니다.
      특히 이미지나 음성 인식처럼 복잡하고 방대한 데이터 속에서 패턴을 찾아내는 데 아주 뛰어난 성능을 보입니다.

    쉽게 말해 AI > 머신러닝 > 딥러닝 순으로 포함되는 관계입니다.
    이 글에서는 인공지능을 구현하는 핵심 방법론인 머신러닝의 세계에 첫발을 내디뎌 보겠습니다.

    '도미'와 '빙어'라는 두 생선 데이터를 가지고, 데이터 준비부터 모델 훈련, 예측까지의 전 과정을 쉽고 재미있게 따라가 보겠습니다.

     


    2.  1단계: 데이터와 친해지기 (데이터 준비 및 분석)

     

    모든 머신러닝 프로젝트의 시작은 데이터를 이해하는 것입니다.

    우리가 가진 데이터가 어떤 특징을 가지고 있는지 파악해야만 좋은 모델을 만들 수 있습니다.

     

    2-1 데이터 준비: 특징(Features)과 정답(Target) 나누기

    먼저, 분석에 사용할 도미와 빙어의 길이(length) 무게(weight) 데이터를 준비합니다.

    머신러닝에서는 모델이 학습해야 할 문제지, 즉 입력 특성(features)과 정답지인 정답 레이블(target)을 명확하게 구분해야 합니다.

    • 입력 특성(Features): 생선의 길이와 무게
    • 정답 레이블(Target): 생선의 종류 (도미 또는 빙어)
    Python
     
    import matplotlib.pyplot as plt
    
    # 도미(bream) 데이터
    bream_length = [25.4, 26.3, 26.5, 27.0, 27.0, 27.0, 27.0, 27.5, 27.5, 27.7, 28.0, 28.0, 28.0, 28.5, 28.5, 28.7, 28.7, 29.0, 29.0, 29.0, 29.5, 29.5, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
    bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 650.0, 700.0, 750.0, 800.0, 820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0, 1000.0, 950.0]
    
    # 빙어(smelt) 데이터
    smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
    smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
    

     

    2-2 데이터 시각화: 산점도로 패턴 찾기 

     

    데이터를 눈으로 직접 확인하는 것만큼 확실한 방법은 없습니다.

    산점도(Scatter plot)를 그려보면 길이와 무게에 따라 두 생선 그룹이 어떻게 분포하는지 한눈에 파악할 수 있습니다.

     
    # 산점도 시각화
    plt.scatter(bream_length, bream_weight)
    plt.scatter(smelt_length, smelt_weight)
    plt.xlabel('length')
    plt.ylabel('weight')
    plt.show()
    

     

     

    위 그래프를 보면 두 생선 그룹이 길이와 무게에 따라 명확히 구분되는 것을 확인할 수 있습니다.

    이런 데이터라면 머신러닝 모델이 아주 쉽게 분류를 해낼 수 있겠죠?

     


    3.  2단계: 똑똑한 분류 모델 만들기 (k-최근접 이웃 알고리즘)

     

    이제 준비된 데이터를 바탕으로 본격적으로 분류 모델을 만들어 보겠습니다.

     

    3-1 k-최근접 이웃(k-NN) 알고리즘이란?

    k-NN은 "주변의 가장 가까운 k개 데이터를 보고 내 정체를 결정한다"는 아주 간단하고 직관적인 원리를 가진 알고리즘입니다.

    예를 들어, 새로운 생선 데이터가 주어졌을 때, 그 생선과 가장 가까운 거리에 있는 기존 생선 k개를 찾아봅니다.

    그 k개 중에서 도미가 더 많으면 '도미', 빙어가 더 많으면 '빙어'라고 예측하는 방식이죠.

    3-2 모델 훈련 및 평가

    scikit-learn 라이브러리를 사용하면 k-NN 모델을 몇 줄의 코드로 간단히 구현할 수 있습니다. 먼저,

    데이터를 scikit-learn이 이해할 수 있는 형태로 가공하고, 모델을 생성하여 훈련(fit)시킵니다.

     
    from sklearn.neighbors import KNeighborsClassifier
    
    # 1. 데이터 합치기 및 scikit-learn 입력 형태로 변환
    length = bream_length + smelt_length
    weight = bream_weight + smelt_weight
    
    # 입력 데이터: [[길이, 무게], [길이, 무게], ...]
    fish_data = [[l, w] for l, w in zip(length, weight)]
    # 정답 데이터: [1, 1, ..., 0, 0, ...] (도미=1, 빙어=0)
    fish_target = [1] * 35 + [0] * 14
    
    # 2. k-NN 모델 생성 및 훈련
    kn = KNeighborsClassifier()
    kn.fit(fish_data, fish_target)
    
    # 3. 모델 성능 평가 (정확도)
    score = kn.score(fish_data, fish_target)
    print(score)
    # 출력 결과: 1.0
    

     

    score() 메서드로 확인한 모델의 정확도(Accuracy) 1.0, 즉 100%가 나왔습니다.

    이는 모델이 우리가 가진 모든 훈련 데이터를 완벽하게 분류해냈다는 의미입니다.

    3-3 새로운 데이터로 예측하기

    이제 훈련된 모델이 실제로 잘 작동하는지 테스트해 볼 시간입니다.

    예를 들어, 길이가 30cm이고 무게가 600g인 새로운 생선이 있다면 어떤 종류일까요? 

    predict() 메서드로 확인해 보겠습니다.

     
    # 새로운 데이터 예측
    prediction = kn.predict([[30, 600]])
    print(prediction)
    # 출력 결과: [1]
    

     

    모델은 이 생선을 [1], 즉 도미라고 정확하게 예측했습니다.

    우리의 첫 머신러닝 모델이 성공적으로 새로운 데이터를 분류해낸 순간입니다!

     


    4. 마치며: 첫 모델의 의미와 다음 단계

    오늘 우리는 도미와 빙어 데이터를 가지고 데이터 분석부터 모델 훈련, 평가, 예측에 이르는 머신러닝의 전체 과정을 경험했습니다.

    비록 간단한 예제였지만, 이 과정을 통해 머신러닝이 데이터를 기반으로 어떻게 패턴을 학습하고 예측을 수행하는지에 대한 핵심적인 아이디어를 얻으셨을 겁니다.

     

    물론, 실제 프로젝트에서는 데이터를 더 정교하게 다듬고, 다양한 알고리즘을 비교하며, 모델의 성능을 더욱 끌어올리는 과정이 필요합니다. 하지만 모든 위대한 여정은 첫걸음부터 시작하는 법이죠. 오늘 여러분이 내디딘 이 첫걸음이 앞으로 더 복잡하고 흥미로운 머신러닝의 세계를 탐험하는 훌륭한 시작점이 되기를 바랍니다.

     

     

    코드 출처: https://github.com/rickiepark/hg-mldl2/blob/main/01-3.ipynb

     

    hg-mldl2/01-3.ipynb at main · rickiepark/hg-mldl2

    <혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.

    github.com

    자료 및 강의 출처:

    https://www.youtube.com/watch?v=ImZwjGjwVqI&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=2

     

Designed by Tistory.