책(혼공머신러닝) 을 보고 공부 중 이전에 학습했던 내용이 다시 나오는데 기억이 나지 않아 정리합니다.
train_scaled 데이터를 2D 배열 형태로 변환합니다. 이는 머신러닝 모델에서 데이터를 입력으로 사용할 수 있도록 준비하는 중요한 과정입니다.
train_scaled = train_scaled.reshape(-1, 28*28)
- reshape: NumPy 배열의 형태(차원)를 변경하는 메서드입니다. 데이터를 새롭게 구조화할 때 사용됩니다.
- -1: 이 위치에 들어갈 크기를 자동으로 계산하라는 의미입니다.
- NumPy는 전체 요소 수를 유지하면서, 다른 차원의 크기를 기준으로 이 값(-1)을 계산합니다.
- 28*28: Fashion MNIST 데이터의 각 이미지는 28x28 픽셀 크기의 2D 배열입니다. 이 값을 지정하여 2D 이미지를 1D 벡터로 변환합니다.
- 여기서는 28과 28을 곱하여 784(픽셀의 총 개수) 크기의 1D 벡터로 변환합니다.
reshape가 필요한 이유
SGDClassifier와 같은 전통적인 머신러닝 알고리즘은 1D 벡터 형태의 입력 데이터를 요구합니다.
- 원본 Fashion MNIST 데이터는 (이미지 개수, 28, 28) 형태의 3D 배열입니다.
- 예시: (60000, 28, 28) (60000개의 28x28 이미지를 포함)
- 이를 2D 형태의 입력 데이터로 변환해야 합니다.
- 변환 후: (60000, 784) (각 이미지가 길이 784의 벡터로 변환됨)
SGDClassifier는 각 벡터를 개별 데이터 포인트로 간주하며, 모든 픽셀 값을 입력 특성(feature)으로 사용하여 모델을 학습합니다.
코드 실행 결과 예시
변환 전:
- 데이터의 형태: (60000, 28, 28)
- 60000개의 28x28 픽셀 이미지를 포함한 3D 배열.
변환 후:
- 데이터의 형태: (60000, 784)
- 60000개의 길이 784(=28*28)인 벡터로 이루어진 2D 배열.
왜 -1을 사용하는가?
reshape 메서드에서 **-1**은 크기를 자동으로 계산하기 위한 편리한 방식입니다.
- 예를 들어, 데이터의 총 크기가 60000 x 28 x 28이라면, **28*28**을 고정했을 때, **60000**은 자동으로 계산됩니다.
- 따라서, **-1**을 사용하면 데이터 크기가 변경되더라도 코드를 수정할 필요가 없습니다.
최종적으로 데이터 준비 과정 요약
- 정규화:
train_scaled = train_input / 255.0
- 이미지를 255로 나누어 0~1 사이로 정규화하여 숫자 값을 축소합니다.
- 이 작업은 학습 안정성과 모델 성능을 개선하는 데 도움이 됩니다.
- 차원 변경:
train_scaled = train_scaled.reshape(-1, 28*28)
- 28x28 크기의 2D 이미지를 784 픽셀 길이의 1D 벡터로 변환합니다.
- 각 벡터가 SGDClassifier에 입력됩니다.
전체적인 맥락
SGDClassifier는 벡터 형태의 입력 데이터만 처리할 수 있기 때문에, 2D 이미지를 1D 벡터로 변환하는 reshape 작업이 필수입니다. 이 과정은 다른 전통적 머신러닝 알고리즘(예: SVM, Logistic Regression 등)에서도 동일하게 적용됩니다.