ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 혼공머신 Ch 02 데이터 다루기
    Study/머신러닝 딥러닝 2025. 9. 22. 15:15

     

    목차

    1. 들어가며: 올바른 모델 평가의 첫걸음
    2. 훈련 세트와 테스트 세트
      • 샘플링 편향 문제
      • numpy를 활용한 데이터 무작위 분리
    3. 데이터 전처리
      • 데이터 스케일 문제
      • 표준화를 통한 문제 해결
      • 전처리 시 주의사항
    4. 마치며: 신뢰할 수 있는 모델을 위한 기초

     

    들어가며: 올바른 모델 평가의 첫걸음

    머신러닝 모델의 성능을 신뢰할 수 있으려면 어떻게 해야 할까요?

    좋은 알고리즘을 선택하는 것만큼 중요한 것이 바로 데이터를 올바르게 다루는 것입니다.

     

    이 포스트에서는 모델을 공정하게 평가하기 위한 훈련 세트와 테스트 세트 분리 방법과, 모델의 예측력을 높이는 필수 과정인 데이터 전처리의 중요성에 대해 알아보겠습니다. 이 두 가지 기본 단계를 통해 어떻게 모델의 신뢰도를 높일 수 있는지 살펴보겠습니다.

     

     


    1. 훈련 세트와 테스트 세트

    머신러닝 모델을 올바르게 평가하기 위해 데이터를 훈련용과 테스트용으로 나누는 과정과 샘플링 편향 문제를 해결하는 방법입니다.

    1-1: 샘플링 편향 문제

    설명: 
    훈련 데이터와 테스트 데이터에 특정 종류의 샘플이 편중되어 있으면 모델이 제대로 평가되지 않는 문제입니다.
    예를 들어, 도미와 빙어 데이터가 순서대로 있을 때, 앞부분(도미)으로만 훈련하고 뒷부분(빙어)으로 테스트하면 모델은 새로운 데이터를 전혀 맞추지 못하게 됩니다.

    사용 라이브러리: sklearn.neighbors

    # 데이터를 순서대로 훈련 세트와 테스트 세트로 나눔
    train_input = fish_data[:35]  # 앞 35개는 모두 도미 데이터
    train_target = fish_target[:35]
    test_input = fish_data[35:]   # 뒤 14개는 모두 빙어 데이터
    test_target = fish_target[35:]
    
    # 모델 훈련 및 평가
    kn.fit(train_input, train_target)
    score = kn.score(test_input, test_target)
    print(score)
    # 출력: 0.0 (정확도 0%)
    

    1-2: numpy를 활용한 데이터 무작위 분리

    설명: 
    샘플링 편향 문제를 해결하기 위해 데이터를 무작위로 섞어주는 과정이 필요합니다. 
    numpy 배열로 데이터를 변환하고, np.random.shuffle() 함수로 인덱스를 섞어주면 훈련 세트와 테스트 세트에 데이터가 고르게 분포되어 올바른 평가가 가능해집니다. np.random.seed()를 사용하면 재현 가능한 결과를 얻을 수 있습니다.

     

    사용 라이브러리: numpy

    import numpy as np
    
    input_arr = np.array(fish_data)
    target_arr = np.array(fish_target)
    
    # 인덱스를 무작위로 섞음
    np.random.seed(42)
    index = np.arange(49)
    np.random.shuffle(index)
    
    # 섞인 인덱스를 사용하여 훈련 세트와 테스트 세트를 나눔
    train_input = input_arr[index[:35]]
    train_target = target_arr[index[:35]]
    test_input = input_arr[index[35:]]
    test_target = target_arr[index[35:]]
    
    # 모델 훈련 및 평가
    kn.fit(train_input, train_target)
    score = kn.score(test_input, test_target)
    print(score)
    # 출력: 1.0 (정확도 100%)
    

     


    2. 데이터 전처리

    데이터의 특성(feature)들 간 스케일 차이를 조정하여 머신러닝 모델의 성능을 향상시키는 전처리 과정입니다.

    2-1: 데이터 스케일 문제

    설명: 

    k-최근접 이웃처럼 거리를 기반으로 하는 알고리즘은 특성의 스케일에 민감합니다.

    예를 들어 생선의 '길이'는 cm 단위이고 '무게'는 g 단위일 때, 값의 범위가 훨씬 큰 '무게'가 예측에 더 큰 영향을 미쳐 결과가 왜곡될 수

    있습니다.

    # 스케일 조정 전 데이터로 훈련
    kn.fit(train_input, train_target)
    
    # 길이 25cm, 무게 150g인 생선 예측
    prediction = kn.predict([[25, 150]])
    print(prediction)
    # 출력: [0.] (빙어로 잘못 예측)
    

    2-2: 표준화를 통한 문제 해결

    설명: 

    이 문제를 해결하기 위해 표준 점수(Standard Score)를 사용한 표준화(Standardization)를 진행합니다. 각 특성 값에서 평균을 빼고 표준편차로 나누어, 모든 특성의 평균을 0, 표준편차를 1로 맞추는 과정입니다. 이를 통해 모든 특성이 동일한 스케일로 모델에 기여하게

    됩니다.

     

    사용 라이브러리: numpy

    # 훈련 세트의 평균과 표준편차 계산
    mean = np.mean(train_input, axis=0)
    std = np.std(train_input, axis=0)
    
    # 훈련 세트 표준화
    train_scaled = (train_input - mean) / std
    
    # 새로운 데이터도 동일한 기준으로 표준화
    new = ([25, 150] - mean) / std
    
    # 표준화된 데이터로 모델 훈련 및 예측
    kn.fit(train_scaled, train_target)
    prediction = kn.predict([new])
    print(prediction)
    # 출력: [1.] (도미로 정확하게 예측)
    

    2-3: 전처리 시 주의사항

    설명: 

    매우 중요한 점은, "반드시 훈련 세트의 평균과 표준편차를 사용하여 테스트 세트도 변환해야 한다"는 것입니다.

    테스트 세트의 기준으로 따로 전처리하거나, 전체 데이터를 한 번에 전처리하면 테스트 데이터의 정보가 모델 훈련에 미리 영향을 주는 '데이터 누출(data leakage)'이 발생하여 모델의 성능 평가가 오염될 수 있습니다.

     


     

    마치며: 신뢰할 수 있는 모델을 위한 기초

    지금까지 살펴본 것처럼, 데이터를 무작위로 공정하게 나누는 것 특성의 스케일을 올바르게 맞춰주는 것은 성공적인 머신러닝 모델 개발의 가장 기본적인 단계입니다. 샘플링 편향을 피해야 모델의 일반화 성능을 제대로 측정할 수 있고, 데이터 전처리를 통해 알고리즘이 가진 잠재력을 최대한 이끌어낼 수 있습니다. 이 두 가지 원칙을 잘 지키는 것이 신뢰도 높은 모델을 만드는 탄탄한 기초가 될 것입니다.

     

     


     

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

     

    hg-mldl2/02-1.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=SUpUPXXhE6g&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=5

     

     

     

Designed by Tistory.