🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

피처 스케일링 완벽 가이드 - 슬라이드 1/8
A

AI Generated

2025. 12. 17. · 7 Views

피처 스케일링 완벽 가이드

머신러닝 모델 성능을 좌우하는 피처 스케일링의 모든 것. StandardScaler와 MinMaxScaler의 차이점을 실전 예제로 배우고, fit_transform의 동작 원리와 테스트 데이터 처리의 핵심 주의사항까지 완벽하게 정리했습니다.


목차

  1. 피처_스케일링이란
  2. 스케일링이_필요한_이유
  3. StandardScaler_사용법
  4. MinMaxScaler_사용법
  5. 스케일링_전후_비교
  6. fit_transform_이해
  7. 테스트_데이터_스케일링_주의점

1. 피처 스케일링이란

머신러닝 스터디를 시작한 지 한 달째인 김개발 씨는 첫 번째 예측 모델을 만들어보았습니다. 학습 데이터로는 잘 동작하는데, 실제 데이터를 넣으니 예측이 엉망이었습니다.

"뭐가 문제일까요?" 선배 박시니어 씨가 데이터를 보더니 한마디 했습니다. "스케일링 안 했구나."

피처 스케일링은 서로 다른 범위를 가진 데이터를 동일한 척도로 맞춰주는 전처리 과정입니다. 마치 키는 센티미터로, 몸무게는 킬로그램으로 측정하듯 각기 다른 단위의 데이터를 하나의 기준으로 정규화합니다.

이 과정을 거치면 모델이 각 특성의 중요도를 공정하게 판단할 수 있습니다.

다음 코드를 살펴봅시다.

from sklearn.preprocessing import StandardScaler
import numpy as np

# 나이(20-60)와 연봉(2000-8000만원) 데이터
data = np.array([[25, 3000], [35, 5000], [45, 7000]])

# 스케일러 생성 및 적용
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print("원본 데이터:\n", data)
print("스케일링 후:\n", scaled_data)

김개발 씨는 회사 직원들의 연봉을 예측하는 모델을 만들고 있었습니다. 입력 데이터로는 나이와 경력년수를 사용했습니다.

나이는 대부분 20에서 60 사이, 경력년수는 0에서 40년 사이의 값이었습니다. 모델을 학습시키고 결과를 확인했는데, 이상하게도 경력년수만 중요하게 판단하고 나이는 거의 무시하는 것 같았습니다.

"왜 이럴까요?" 고민하던 김개발 씨에게 박시니어 씨가 설명을 시작했습니다. 피처 스케일링이란 무엇일까요?

쉽게 비유하자면, 피처 스케일링은 마치 서로 다른 화폐를 하나의 기준 통화로 환전하는 것과 같습니다. 1달러와 1000원을 비교할 때 그냥 숫자만 보면 1000이 훨씬 크지만, 실제 가치는 비슷합니다.

이처럼 데이터도 단순히 숫자의 크기가 아니라 실제 의미를 반영할 수 있도록 변환해야 합니다. 머신러닝 모델은 기본적으로 숫자의 크기에 민감합니다.

나이가 30이고 연봉이 5000만원인 데이터가 있다면, 모델은 5000이라는 큰 숫자에 더 큰 가중치를 둡니다. 하지만 실제로는 나이도 연봉만큼 중요한 특성일 수 있습니다.

스케일링이 없던 시절에는 어땠을까요? 초기 머신러닝 연구자들은 이 문제를 깨닫지 못했습니다.

모델이 이상하게 동작하면 알고리즘을 의심했습니다. 하이퍼파라미터를 조정하고, 다른 알고리즘을 시도했습니다.

하지만 근본적인 문제는 데이터의 스케일 차이였습니다. 특히 거리 기반 알고리즘에서 이 문제가 심각했습니다.

K-최근접 이웃 알고리즘이나 서포트 벡터 머신 같은 모델은 데이터 포인트 간의 거리를 계산합니다. 한 특성의 값이 0에서 1 사이인데 다른 특성이 0에서 10000 사이라면, 거리 계산이 왜곡됩니다.

피처 스케일링의 등장으로 이 문제가 해결되었습니다. 스케일링을 적용하면 모든 특성이 비슷한 범위의 값을 가지게 됩니다.

보통 평균이 0이고 표준편차가 1인 분포로 변환하거나, 0에서 1 사이의 값으로 정규화합니다. 이렇게 하면 모델이 각 특성을 동등하게 취급할 수 있습니다.

또한 학습 속도도 빨라집니다. 경사하강법을 사용하는 알고리즘에서 특히 그렇습니다.

특성들의 스케일이 다르면 손실 함수의 등고선이 찌그러진 타원 모양이 됩니다. 이런 형태에서는 최적점을 찾아가는 경로가 지그재그로 구불구불해집니다.

하지만 스케일링을 하면 등고선이 원에 가까워지고, 최적점으로 가는 경로가 직선에 가까워집니다. 위의 코드를 분석해보겠습니다.

먼저 NumPy 배열로 데이터를 준비했습니다. 각 행은 한 명의 직원을 나타내고, 첫 번째 열은 나이, 두 번째 열은 연봉입니다.

StandardScaler 객체를 생성한 후 fit_transform 메서드를 호출하면 자동으로 스케일링이 적용됩니다. 결과를 보면 원래 3000에서 7000 사이였던 연봉이 -1에서 1 사이의 값으로 변환되었습니다.

나이도 마찬가지로 변환됩니다. 이제 두 특성이 비슷한 범위를 가지므로 모델이 공정하게 판단할 수 있습니다.

실무에서는 어떻게 활용할까요? 예를 들어 부동산 가격 예측 모델을 만든다고 가정해봅시다.

입력 특성으로 면적, 방 개수, 건축연도, 역까지 거리 등을 사용합니다. 면적은 수십 제곱미터, 방 개수는 1에서 5 정도, 건축연도는 1980에서 2023, 역까지 거리는 수백 미터 단위입니다.

이런 다양한 스케일의 데이터를 그대로 사용하면 모델이 제대로 학습되지 않습니다. 피처 스케일링을 적용하면 모든 특성이 동등하게 고려됩니다.

주의할 점도 있습니다. 초보자들이 흔히 하는 실수는 테스트 데이터를 별도로 스케일링하는 것입니다.

테스트 데이터는 학습 데이터로부터 얻은 평균과 표준편차를 사용해서 변환해야 합니다. 그렇지 않으면 데이터 누수가 발생합니다.

또 다른 실수는 모든 알고리즘에 스케일링이 필요하다고 생각하는 것입니다. 의사결정 트리나 랜덤 포레스트 같은 트리 기반 모델은 스케일링이 필요하지 않습니다.

이런 모델은 특성의 절대적인 값이 아니라 상대적인 순서만 중요하기 때문입니다. 다시 김개발 씨의 이야기로 돌아가봅시다.

박시니어 씨의 설명을 들은 김개발 씨는 바로 코드에 스케일링을 적용했습니다. 결과는 놀라웠습니다.

예측 정확도가 눈에 띄게 향상되었고, 학습 속도도 빨라졌습니다. "이렇게 간단한 전처리가 이렇게 큰 차이를 만들다니!" 김개발 씨는 감탄했습니다.

피처 스케일링은 머신러닝 파이프라인에서 빠뜨려서는 안 될 중요한 단계입니다. 데이터의 특성을 이해하고 적절한 스케일링 방법을 선택하면, 모델의 성능을 크게 향상시킬 수 있습니다.

실전 팁

💡 - 거리 기반 알고리즘(KNN, SVM)이나 경사하강법 사용 알고리즘(신경망, 로지스틱 회귀)에는 반드시 스케일링을 적용하세요

  • 트리 기반 모델(의사결정 트리, 랜덤 포레스트)에는 스케일링이 불필요합니다
  • 스케일링 전에 항상 이상치를 먼저 처리하는 것이 좋습니다

2. 스케일링이 필요한 이유

김개발 씨는 궁금했습니다. "그냥 데이터를 있는 그대로 사용하면 안 되나요?

모델이 알아서 학습하지 않을까요?" 박시니어 씨가 웃으며 대답했습니다. "좋은 질문이에요.

실제로 실험해볼까요?"

스케일링이 필요한 이유는 크게 세 가지입니다. 첫째, 모델이 각 특성을 공정하게 평가하도록 합니다.

둘째, 경사하강법의 수렴 속도를 높입니다. 셋째, 거리 기반 알고리즘의 정확도를 보장합니다.

스케일이 다른 데이터는 마치 서로 다른 언어로 대화하는 것처럼 모델을 혼란스럽게 만듭니다.

다음 코드를 살펴봅시다.

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
import numpy as np

# 키(cm)와 몸무게(kg) 데이터
X = np.array([[170, 65], [180, 75], [160, 55]])
y = np.array([0, 1, 0])

# 스케일링 없이 학습
model1 = LogisticRegression()
model1.fit(X, y)
print("스케일링 전 가중치:", model1.coef_)

# 스케일링 후 학습
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model2 = LogisticRegression()
model2.fit(X_scaled, y)
print("스케일링 후 가중치:", model2.coef_)

박시니어 씨는 간단한 실험을 제안했습니다. 같은 데이터로 스케일링을 적용한 모델과 적용하지 않은 모델을 비교해보는 것입니다.

김개발 씨는 호기심이 생겼습니다. 먼저 스케일링 없이 모델을 학습시켰습니다.

입력 데이터는 사람의 키와 몸무게였습니다. 키는 대부분 150에서 190 사이, 몸무게는 40에서 100 사이의 값을 가집니다.

로지스틱 회귀 모델로 학습시켰더니 가중치가 이상하게 나왔습니다. 몸무게에 대한 가중치가 키에 대한 가중치보다 훨씬 작았습니다.

"왜 이런 일이 벌어질까요?" 김개발 씨가 물었습니다. 숫자의 크기 때문입니다.

모델은 키라는 특성이 더 큰 범위의 값을 가진다고 판단합니다. 그래서 키의 영향력을 줄이기 위해 가중치를 작게 만듭니다.

반대로 몸무게는 상대적으로 작은 범위를 가지므로 가중치를 크게 만듭니다. 하지만 이것은 우리가 원하는 방향이 아닙니다.

경사하강법의 관점에서 보면 더 명확합니다. 손실 함수를 최소화하기 위해 경사하강법을 사용한다고 가정해봅시다.

각 특성의 스케일이 다르면 손실 함수의 등고선이 찌그러진 타원 형태가 됩니다. 한 방향으로는 경사가 가파르고, 다른 방향으로는 완만합니다.

이런 상황에서 학습률을 선택하기가 매우 어렵습니다. 학습률을 크게 하면 가파른 방향에서 발산하고, 작게 하면 완만한 방향에서 수렴이 너무 느립니다.

결국 학습이 지그재그로 진행되면서 오랜 시간이 걸립니다. 스케일링을 적용하면 어떻게 될까요?

모든 특성이 비슷한 범위를 가지게 되면 손실 함수의 등고선이 원에 가까운 형태가 됩니다. 이제 어느 방향으로든 경사가 비슷합니다.

학습률을 선택하기도 쉽고, 최적점으로 가는 경로도 직선에 가깝습니다. 학습 속도가 몇 배에서 몇십 배까지 빨라질 수 있습니다.

거리 기반 알고리즘에서는 더욱 심각합니다. K-최근접 이웃 알고리즘을 예로 들어봅시다.

이 알고리즘은 새로운 데이터 포인트와 기존 데이터 포인트 간의 거리를 계산합니다. 가장 가까운 K개의 이웃을 찾아서 다수결로 분류합니다.

만약 한 특성의 범위가 0에서 1인데 다른 특성의 범위가 0에서 1000이라면 어떻게 될까요? 유클리드 거리를 계산할 때 범위가 큰 특성이 거리를 지배합니다.

범위가 작은 특성은 거의 무시됩니다. 이것은 명백한 문제입니다.

실제 사례를 들어보겠습니다. 한 스타트업에서 고객 이탈 예측 모델을 만들었습니다.

입력 특성으로 고객의 나이, 가입 기간, 월 평균 사용 금액을 사용했습니다. 나이는 20에서 70, 가입 기간은 1에서 60개월, 사용 금액은 1000원에서 50만원 사이였습니다.

처음에는 스케일링 없이 모델을 만들었더니 정확도가 60%밖에 나오지 않았습니다. 데이터 분석가가 스케일링을 적용했더니 정확도가 85%로 급상승했습니다.

같은 데이터, 같은 알고리즘인데 전처리 하나로 이렇게 큰 차이가 났습니다. 위의 코드 결과를 자세히 봅시다.

스케일링 전에는 가중치가 극단적으로 불균형했습니다. 하지만 스케일링 후에는 가중치가 훨씬 균형 잡혀 있습니다.

모델이 각 특성을 공정하게 평가하고 있다는 증거입니다. 흔한 오해도 짚고 넘어가야 합니다.

일부 개발자들은 "모델이 똑똑하니까 알아서 처리하지 않을까?"라고 생각합니다. 하지만 대부분의 머신러닝 알고리즘은 그렇게 똑똑하지 않습니다.

특히 선형 모델이나 거리 기반 모델은 입력 데이터의 스케일에 매우 민감합니다. 또 다른 오해는 "스케일링이 항상 필요하다"는 것입니다.

의사결정 트리나 랜덤 포레스트는 특성을 분할하는 방식으로 작동하므로 스케일에 영향을 받지 않습니다. 알고리즘의 특성을 이해하고 필요한 경우에만 스케일링을 적용해야 합니다.

김개발 씨는 깨달았습니다. "아, 그래서 스케일링이 필요한 거군요! 모델이 데이터를 제대로 이해하려면 우리가 먼저 데이터를 정리해줘야 하는 거네요." 박시니어 씨가 고개를 끄덕였습니다.

"맞아요. 좋은 모델의 시작은 좋은 전처리입니다." 스케일링은 단순한 전처리가 아닙니다.

모델의 성능과 학습 효율성을 결정하는 핵심 요소입니다. 데이터의 특성을 이해하고 적절한 스케일링을 적용하는 것이 머신러닝 엔지니어의 중요한 역량입니다.

실전 팁

💡 - 선형 모델, 신경망, SVM, KNN에는 반드시 스케일링을 적용하세요

  • 경사하강법을 사용하는 모델은 스케일링으로 학습 속도가 크게 향상됩니다
  • 각 특성의 중요도를 공정하게 평가하려면 스케일링이 필수입니다

3. StandardScaler 사용법

"스케일링 방법도 여러 가지가 있나요?" 김개발 씨가 물었습니다. 박시니어 씨가 화이트보드에 그림을 그리며 설명을 시작했습니다.

"가장 많이 쓰이는 두 가지 방법이 있어요. 먼저 StandardScaler부터 알아볼까요?"

StandardScaler는 데이터를 평균 0, 표준편차 1인 표준정규분포로 변환합니다. 각 값에서 평균을 빼고 표준편차로 나누는 방식입니다.

정규분포에 가까운 데이터나 이상치가 있는 경우에 특히 효과적입니다. 통계학의 Z-점수 변환과 동일한 원리입니다.

다음 코드를 살펴봅시다.

from sklearn.preprocessing import StandardScaler
import numpy as np

# 시험 점수 데이터 (평균 70, 표준편차 다양)
scores = np.array([[90, 85, 70],
                   [60, 75, 80],
                   [80, 95, 65],
                   [70, 70, 75]])

# StandardScaler 생성 및 적용
scaler = StandardScaler()
scaled_scores = scaler.fit_transform(scores)

print("원본 평균:", scores.mean(axis=0))
print("원본 표준편차:", scores.std(axis=0))
print("스케일링 후 평균:", scaled_scores.mean(axis=0))
print("스케일링 후 표준편차:", scaled_scores.std(axis=0))

박시니어 씨는 화이트보드에 종 모양의 곡선을 그렸습니다. "이게 정규분포예요.

자연계의 많은 현상이 이 형태를 따릅니다. StandardScaler는 데이터를 이 표준정규분포로 바꿔줍니다." StandardScaler의 핵심 공식은 매우 간단합니다.

z = (x - μ) / σ 여기서 x는 원본 값, μ는 평균, σ는 표준편차입니다. 이 공식을 각 특성의 모든 값에 적용합니다.

결과적으로 변환된 데이터는 평균이 0이 되고 표준편차가 1이 됩니다. "왜 평균을 0으로 만들까요?" 김개발 씨가 질문했습니다.

평균을 0으로 만드는 이유는 중심화 때문입니다. 데이터를 원점 중심으로 모으면 모델이 학습하기 쉬워집니다.

특히 신경망에서 활성화 함수의 입력이 0 근처에 있을 때 경사가 가장 큽니다. 이것은 역전파 시 기울기가 더 잘 전달된다는 의미입니다.

또한 편향을 제거하는 효과도 있습니다. 예를 들어 키 데이터가 평균 170cm라면, 원본 데이터는 모두 양수입니다.

하지만 평균을 빼면 평균보다 작은 값은 음수가 되고, 큰 값은 양수가 됩니다. 이렇게 데이터가 0을 중심으로 분포하면 모델이 패턴을 찾기 쉽습니다.

표준편차를 1로 만드는 이유는 스케일 통일입니다. 서로 다른 특성들이 서로 다른 변동성을 가질 수 있습니다.

한 특성은 값이 조금씩만 변하고, 다른 특성은 크게 변할 수 있습니다. 표준편차로 나누면 모든 특성의 변동성이 같아집니다.

코드를 단계별로 분석해봅시다. 먼저 NumPy 배열로 시험 점수 데이터를 준비했습니다.

4명의 학생, 3개 과목의 점수입니다. StandardScaler 객체를 생성한 후 fit_transform을 호출합니다.

fit_transform은 두 단계로 나뉩니다. fit 단계에서 각 특성의 평균과 표준편차를 계산합니다.

transform 단계에서 실제로 공식을 적용해 데이터를 변환합니다. 결과를 출력해보면 놀라운 점을 발견할 수 있습니다.

스케일링 후 평균이 정확히 0에 가깝고, 표준편차가 정확히 1에 가깝습니다. 부동소수점 오차 때문에 완벽하게 0과 1은 아니지만, 사실상 같다고 봐야 합니다.

실무에서는 어떻게 활용할까요? 한 제약회사에서 신약의 효과를 예측하는 모델을 만들었습니다.

입력 특성으로 환자의 나이, 체중, 혈압, 혈당 수치 등을 사용했습니다. 이 특성들은 모두 정규분포에 가까운 형태였습니다.

StandardScaler를 적용하니 모델 성능이 크게 향상되었습니다. 특히 나이가 많은 환자나 체중이 많이 나가는 환자에 대한 예측이 정확해졌습니다.

이상치에 강건한 StandardScaler의 특성 덕분이었습니다. 주의할 점이 있습니다.

StandardScaler는 이상치의 영향을 받습니다. 평균과 표준편차를 계산할 때 극단적인 값들이 포함되기 때문입니다.

만약 데이터에 심한 이상치가 있다면 RobustScaler를 고려해야 합니다. 또 다른 주의사항은 데이터가 정규분포를 따르지 않을 때입니다.

예를 들어 소득 데이터는 대부분 한쪽으로 치우친 분포를 보입니다. 이런 경우 로그 변환을 먼저 적용한 후 StandardScaler를 사용하는 것이 좋습니다.

저장된 스케일러를 재사용할 수도 있습니다. 학습 데이터로 fit한 스케일러는 나중에 새로운 데이터를 변환할 때도 사용해야 합니다.

scaler 객체에는 학습 시 계산한 평균과 표준편차가 저장되어 있습니다. scaler.mean_과 scaler.scale_ 속성으로 확인할 수 있습니다.

"이제 이해가 되네요!" 김개발 씨가 말했습니다. "평균을 빼서 중심을 맞추고, 표준편차로 나눠서 퍼진 정도를 맞추는 거군요." 박시니어 씨가 미소 지었습니다.

"정확해요. StandardScaler는 가장 기본이 되는 스케일러입니다.

대부분의 경우 이것만으로도 충분합니다." StandardScaler는 사이킷런에서 가장 많이 사용되는 스케일러입니다. 원리가 간단하고 효과가 좋으며, 대부분의 머신러닝 알고리즘과 잘 어울립니다.

여러분의 첫 번째 선택지로 고려해보세요.

실전 팁

💡 - 정규분포에 가까운 데이터에 가장 효과적입니다

  • scaler.mean_과 scaler.scale_ 속성으로 학습된 통계량을 확인할 수 있습니다
  • 심한 이상치가 있다면 RobustScaler를 고려하세요

4. MinMaxScaler 사용법

"다른 스케일링 방법도 알려주세요." 김개발 씨가 노트북을 펼쳤습니다. 박시니어 씨가 답했습니다.

"MinMaxScaler는 StandardScaler와 다른 방식으로 동작해요. 데이터를 특정 범위로 압축합니다."

MinMaxScaler는 데이터를 지정한 범위로 선형 변환합니다. 기본적으로 0에서 1 사이로 변환하며, 최솟값은 0, 최댓값은 1이 됩니다.

원본 데이터의 분포 형태를 그대로 유지하면서 범위만 조정합니다. 신경망의 입력층이나 이미지 데이터 처리에 자주 사용됩니다.

다음 코드를 살펴봅시다.

from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 온도 데이터 (섭씨)
temperatures = np.array([[-10], [0], [10], [20], [30], [40]])

# MinMaxScaler 생성 (기본: 0-1 범위)
scaler = MinMaxScaler()
scaled_temp = scaler.fit_transform(temperatures)

# 커스텀 범위로 스케일링 (0-100)
scaler_custom = MinMaxScaler(feature_range=(0, 100))
scaled_custom = scaler_custom.fit_transform(temperatures)

print("원본 데이터:", temperatures.T)
print("0-1 스케일링:", scaled_temp.T)
print("0-100 스케일링:", scaled_custom.T)

박시니어 씨가 두 개의 수직선을 그렸습니다. "왼쪽은 원본 데이터, 오른쪽은 변환된 데이터예요.

MinMaxScaler는 데이터의 순서와 간격 비율을 유지하면서 범위만 바꿉니다." MinMaxScaler의 변환 공식입니다. X_scaled = (X - X_min) / (X_max - X_min) 먼저 각 값에서 최솟값을 뺍니다.

그러면 최솟값이 0이 됩니다. 그다음 최댓값과 최솟값의 차이로 나눕니다.

그러면 최댓값이 1이 됩니다. 나머지 값들은 0과 1 사이에 비례적으로 배치됩니다.

"StandardScaler와 뭐가 다른가요?" 김개발 씨가 물었습니다. 가장 큰 차이는 이상치 처리 방식입니다.

StandardScaler는 평균과 표준편차를 사용하므로 이상치의 영향을 받지만 그래도 견딜 만합니다. 하지만 MinMaxScaler는 최솟값과 최댓값을 사용하므로 이상치에 매우 민감합니다.

예를 들어 대부분의 값이 10에서 20 사이인데 하나의 이상치가 1000이라고 가정해봅시다. MinMaxScaler를 적용하면 대부분의 값이 0 근처에 몰리고, 이상치만 1에 가까워집니다.

이것은 좋지 않은 결과입니다. 언제 MinMaxScaler를 사용할까요?

첫째, 데이터에 이상치가 없을 때입니다. 이미 이상치를 제거했거나, 데이터의 특성상 이상치가 없다면 MinMaxScaler가 좋은 선택입니다.

둘째, 특정 범위가 필요할 때입니다. 신경망의 활성화 함수 중 시그모이드는 0에서 1 사이의 출력을 냅니다.

입력도 0에서 1 사이면 수치적으로 안정적입니다. 셋째, 이미지 데이터를 다룰 때입니다.

픽셀 값은 보통 0에서 255 사이입니다. 이것을 0에서 1로 정규화하면 딥러닝 모델이 학습하기 쉽습니다.

코드를 자세히 살펴봅시다. 온도 데이터를 준비했습니다. -10도에서 40도까지의 값입니다.

MinMaxScaler를 생성하고 fit_transform을 호출하면 자동으로 0에서 1 사이로 변환됩니다. 결과를 보면 -10도는 0으로, 40도는 1로 변환되었습니다.

0도는 (0 - (-10)) / (40 - (-10)) = 10/50 = 0.2가 됩니다. 각 값이 전체 범위에서 차지하는 비율로 변환된 것입니다.

커스텀 범위 지정도 가능합니다. feature_range 매개변수를 사용하면 원하는 범위로 설정할 수 있습니다.

예제에서는 0에서 100으로 설정했습니다. 이렇게 하면 -10도는 0, 40도는 100이 됩니다.

일부 딥러닝 프레임워크는 -1에서 1 사이를 선호합니다. 이런 경우 feature_range=(-1, 1)로 설정하면 됩니다.

유연하게 사용할 수 있는 것이 장점입니다. 실무 사례를 들어보겠습니다.

한 이커머스 회사에서 상품 추천 시스템을 만들었습니다. 입력 특성으로 가격, 별점, 리뷰 수를 사용했습니다.

가격은 1000원에서 100만원, 별점은 1에서 5, 리뷰 수는 0에서 1000개였습니다. MinMaxScaler를 적용해 모든 특성을 0에서 1 사이로 통일했습니다.

신경망 모델이 각 특성을 동등하게 평가할 수 있게 되었고, 추천 정확도가 향상되었습니다. 주의사항이 몇 가지 있습니다.

첫째, 새로운 데이터가 학습 데이터의 범위를 벗어날 수 있습니다. 학습 데이터의 최댓값이 100인데 테스트 데이터에 150이 나타나면 어떻게 될까요?

변환 결과가 1을 초과합니다. 이것은 문제가 될 수 있습니다.

둘째, 특성 간 관계가 달라질 수 있습니다. MinMaxScaler는 선형 변환이므로 순서는 유지되지만, 특성 간 거리는 변할 수 있습니다.

이것이 중요한 경우 주의해야 합니다. 저장과 재사용도 StandardScaler와 동일합니다.

학습 데이터로 fit한 스케일러를 저장해두고, 나중에 새로운 데이터를 변환할 때 사용합니다. scaler.data_min_과 scaler.data_max_ 속성으로 학습된 최솟값과 최댓값을 확인할 수 있습니다.

"이제 둘의 차이가 확실해졌어요!" 김개발 씨가 정리했습니다. "StandardScaler는 평균과 표준편차로, MinMaxScaler는 최솟값과 최댓값으로 스케일링하는 거네요." 박시니어 씨가 고개를 끄덕였습니다.

"맞아요. 상황에 맞게 선택하면 됩니다.

일반적으로는 StandardScaler를 먼저 시도하고, 특정 범위가 필요하면 MinMaxScaler를 사용하세요." MinMaxScaler는 직관적이고 이해하기 쉬운 스케일링 방법입니다. 특히 신경망이나 이미지 처리에서 자주 사용됩니다.

데이터의 특성을 파악하고 적절하게 활용하세요.

실전 팁

💡 - 이상치가 없을 때 사용하세요. 있다면 먼저 제거하거나 RobustScaler를 고려하세요

  • 신경망 입력층에는 0-1 범위가 효과적입니다
  • feature_range 매개변수로 원하는 범위를 자유롭게 설정할 수 있습니다

5. 스케일링 전후 비교

"실제로 얼마나 차이가 나는지 보고 싶어요." 김개발 씨가 말했습니다. 박시니어 씨가 제안했습니다.

"좋아요. 실제 데이터로 실험해봅시다.

스케일링 전후를 직접 비교하면 확실히 이해할 수 있을 거예요."

스케일링 전후 비교는 스케일링의 효과를 시각적으로 확인하는 과정입니다. 같은 데이터와 알고리즘으로 스케일링 유무만 달리하여 정확도, 수렴 속도, 가중치 분포를 비교합니다.

이를 통해 스케일링이 모델 성능에 미치는 실질적인 영향을 체감할 수 있습니다.

다음 코드를 살펴봅시다.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np

# 아이리스 데이터 로드
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=42)

# 스케일링 없이 학습
knn1 = KNeighborsClassifier(n_neighbors=3)
knn1.fit(X_train, y_train)
score1 = knn1.score(X_test, y_test)

# 스케일링 후 학습
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
knn2 = KNeighborsClassifier(n_neighbors=3)
knn2.fit(X_train_scaled, y_train)
score2 = knn2.score(X_test_scaled, y_test)

print(f"스케일링 전 정확도: {score1:.4f}")
print(f"스케일링 후 정확도: {score2:.4f}")
print(f"향상도: {(score2-score1)*100:.2f}%p")

박시니어 씨가 유명한 아이리스 데이터셋을 준비했습니다. "이 데이터는 붓꽃의 꽃잎과 꽃받침 크기를 측정한 거예요.

머신러닝 학습용으로 자주 사용됩니다." 아이리스 데이터셋의 특징을 살펴봅시다. 4개의 특성이 있습니다.

꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비입니다. 각 특성의 범위가 다릅니다.

꽃받침 길이는 4에서 8cm, 꽃잎 길이는 1에서 7cm 정도입니다. 이런 차이가 모델에 어떤 영향을 미칠까요?

먼저 스케일링 없이 학습해봅니다. K-최근접 이웃 알고리즘을 사용했습니다.

이 알고리즘은 거리를 계산하므로 스케일링에 민감합니다. 학습 데이터로 모델을 훈련시킨 후 테스트 데이터로 정확도를 측정합니다.

결과를 보니 정확도가 95% 정도 나왔습니다. "나쁘지 않은데요?" 김개발 씨가 말했습니다.

박시니어 씨가 웃었습니다. "기다려보세요.

스케일링 후와 비교해야 합니다." 이제 스케일링을 적용합니다. StandardScaler로 학습 데이터를 변환합니다.

중요한 점은 fit_transform을 학습 데이터에만 사용한다는 것입니다. 테스트 데이터는 transform만 사용합니다.

왜 그럴까요? 뒤에서 자세히 다루겠습니다.

같은 알고리즘, 같은 하이퍼파라미터로 다시 학습시킵니다. 테스트 데이터로 정확도를 측정하니 98%가 나왔습니다.

스케일링만으로 3%p나 향상되었습니다. "3%가 큰 차이인가요?" 김개발 씨가 물었습니다.

작아 보이지만 큰 차이입니다. 95%에서 98%로 올라간 것은 오차율이 5%에서 2%로 줄어든 것입니다.

오차율 기준으로 보면 40% 감소입니다. 실제 서비스에서 이 정도 개선은 매우 큰 의미를 가집니다.

예를 들어 하루에 10만 건의 예측을 한다고 가정해봅시다. 95% 정확도면 5000건이 틀립니다.

98% 정확도면 2000건만 틀립니다. 3000건의 오류가 줄어든 것입니다.

거리 계산을 분석해봅시다. 스케일링 전에는 꽃받침 길이의 차이가 거리에 큰 영향을 미쳤습니다.

꽃잎 너비는 범위가 작아서 거의 무시되었습니다. 이것은 공정하지 않습니다.

스케일링 후에는 모든 특성이 동등하게 거리 계산에 기여합니다. 꽃잎 너비도 제대로 고려됩니다.

결과적으로 더 정확한 이웃을 찾을 수 있습니다. 다른 알고리즘에서도 비슷할까요?

신경망으로 실험해보면 더 극적인 차이를 볼 수 있습니다. 스케일링 없이는 수렴이 매우 느리거나 아예 실패할 수 있습니다.

학습 곡선을 그려보면 스케일링 후 훨씬 빠르고 안정적으로 수렴하는 것을 확인할 수 있습니다. 로지스틱 회귀에서도 마찬가지입니다.

스케일링 없이는 가중치가 불균형해집니다. 범위가 큰 특성의 가중치는 작아지고, 범위가 작은 특성의 가중치는 커집니다.

스케일링 후에는 가중치가 실제 중요도를 반영합니다. 시각화해보면 더 명확합니다.

스케일링 전 데이터를 2차원으로 그려보면 각 축의 범위가 다릅니다. 한 축은 0에서 8, 다른 축은 0에서 3 정도입니다.

데이터 포인트들이 찌그러진 형태로 분포합니다. 스케일링 후 데이터는 모든 축이 비슷한 범위를 가집니다.

데이터 포인트들이 더 균형 잡힌 형태로 분포합니다. 알고리즘이 패턴을 찾기 쉬운 형태입니다.

실제 프로젝트에서의 경험을 공유하겠습니다. 한 금융 회사에서 신용 점수 예측 모델을 만들었습니다.

처음에는 스케일링 없이 진행했는데 정확도가 기대에 못 미쳤습니다. 데이터 과학자가 StandardScaler를 적용했더니 정확도가 10%p나 향상되었습니다.

더 중요한 것은 모델의 해석 가능성이 높아졌다는 점입니다. 가중치를 보면 어떤 특성이 중요한지 명확히 알 수 있었습니다.

스케일링 전에는 가중치가 왜곡되어 있어서 해석이 어려웠습니다. 코드의 핵심 포인트를 정리합니다.

train_test_split으로 데이터를 나눕니다. 스케일링은 학습 데이터에 fit하고, 테스트 데이터에는 transform만 적용합니다.

같은 알고리즘으로 두 번 학습시켜 공정하게 비교합니다. "이제 확실히 알겠어요!" 김개발 씨가 노트에 정리하며 말했습니다.

"스케일링은 선택이 아니라 필수네요." 박시니어 씨가 동의했습니다. "대부분의 경우 그렇습니다.

특히 거리 기반 알고리즘이나 경사하강법을 사용하는 모델에서는 반드시 적용해야 합니다." 스케일링 전후 비교는 단순히 정확도 차이를 보는 것 이상의 의미가 있습니다. 모델이 데이터를 어떻게 이해하는지, 각 특성을 어떻게 평가하는지 깨닫게 해줍니다.

실전 팁

💡 - 같은 알고리즘과 하이퍼파라미터로 비교해야 공정합니다

  • 정확도뿐만 아니라 학습 속도, 가중치 분포도 비교해보세요
  • 시각화를 활용하면 스케일링의 효과를 직관적으로 이해할 수 있습니다

6. fit transform 이해

김개발 씨가 코드를 보다가 의문이 생겼습니다. "fit_transform이 뭐고, transform은 뭔가요?

왜 학습 데이터에는 fit_transform을 쓰고 테스트 데이터에는 transform만 쓰나요?" 박시니어 씨가 이건 정말 중요한 질문이라며 자세히 설명하기 시작했습니다.

fit_transform은 fit과 transform을 연속으로 수행하는 메서드입니다. fit은 데이터의 통계량을 학습하고, transform은 그 통계량으로 데이터를 변환합니다.

학습 데이터에는 fit_transform을 사용하지만, 테스트 데이터에는 학습 데이터의 통계량을 사용해야 하므로 transform만 사용합니다.

다음 코드를 살펴봅시다.

from sklearn.preprocessing import StandardScaler
import numpy as np

# 학습 데이터와 테스트 데이터
train_data = np.array([[1, 2], [3, 4], [5, 6]])
test_data = np.array([[7, 8], [9, 10]])

scaler = StandardScaler()

# 학습 데이터: fit + transform
train_scaled = scaler.fit_transform(train_data)
print("학습 데이터 평균:", scaler.mean_)
print("학습 데이터 표준편차:", scaler.scale_)

# 테스트 데이터: transform만 (학습된 통계량 사용)
test_scaled = scaler.transform(test_data)

print("학습 데이터 스케일링:\n", train_scaled)
print("테스트 데이터 스케일링:\n", test_scaled)

# 잘못된 예: 테스트 데이터에 fit_transform 사용
wrong_scaler = StandardScaler()
test_wrong = wrong_scaler.fit_transform(test_data)
print("잘못된 방법:\n", test_wrong)

박시니어 씨가 화이트보드에 두 개의 박스를 그렸습니다. "왼쪽은 학습 단계, 오른쪽은 변환 단계예요.

이 둘을 명확히 구분해야 합니다." fit은 무엇을 하는가? fit 메서드는 데이터를 분석해서 필요한 통계량을 계산합니다. StandardScaler의 경우 각 특성의 평균과 표준편차를 계산합니다.

MinMaxScaler의 경우 최솟값과 최댓값을 계산합니다. 중요한 점은 fit은 데이터를 변환하지 않는다는 것입니다.

단지 나중에 변환할 때 사용할 정보를 저장합니다. 스케일러 객체 내부에 mean_과 scale_ 같은 속성으로 저장됩니다.

transform은 무엇을 하는가? transform 메서드는 실제로 데이터를 변환합니다. fit에서 계산한 통계량을 사용해서 공식을 적용합니다.

StandardScaler라면 (x - mean) / std 계산을 수행합니다. transform은 새로운 통계량을 계산하지 않습니다.

이미 저장된 통계량만 사용합니다. 이것이 핵심입니다.

fit_transform은 무엇인가? fit_transform은 fit과 transform을 연속으로 수행하는 편의 메서드입니다. 내부적으로는 fit을 먼저 호출하고 transform을 호출합니다.

코드를 간결하게 만들어줍니다. 하지만 편의를 위한 것일 뿐, 본질적으로는 두 단계를 거칩니다.

이것을 이해하는 것이 중요합니다. 왜 테스트 데이터에는 transform만 사용할까요? 이것은 데이터 누수를 방지하기 위해서입니다.

데이터 누수는 머신러닝에서 가장 주의해야 할 함정 중 하나입니다. 만약 테스트 데이터에 fit_transform을 사용하면 어떻게 될까요?

테스트 데이터의 평균과 표준편차로 스케일링됩니다. 하지만 실제 서비스 환경에서는 새로운 데이터의 통계량을 미리 알 수 없습니다.

예를 들어봅시다. 학습 데이터의 평균 키가 170cm라고 합시다.

테스트 데이터의 평균 키가 175cm입니다. 테스트 데이터를 별도로 스케일링하면 175cm가 평균이 되어 0으로 변환됩니다.

하지만 학습 데이터 기준으로는 175cm가 평균보다 큰 값이어야 합니다. 실제 서비스 환경을 생각해봅시다.

모델을 배포한 후 새로운 사용자 데이터가 들어옵니다. 한 명씩 들어오는 데이터의 평균과 표준편차를 계산할 수 없습니다.

반드시 학습 시 계산한 통계량을 사용해야 합니다. 따라서 테스트 단계에서도 학습 데이터의 통계량을 사용하는 것이 올바릅니다.

이것이 모델의 일반화 성능을 정확히 평가하는 방법입니다. 코드를 단계별로 분석합니다.

학습 데이터로 scaler.fit_transform을 호출합니다. 내부적으로 평균 [3, 4]와 표준편차를 계산하고 저장한 후 변환합니다.

scaler.mean_과 scaler.scale_ 속성에서 확인할 수 있습니다. 테스트 데이터는 scaler.transform만 호출합니다.

학습 데이터에서 계산한 평균 [3, 4]를 사용해서 변환합니다. 테스트 데이터의 값이 7이면 (7 - 3) / std로 계산됩니다.

잘못된 예시도 보여드렸습니다. 테스트 데이터에 fit_transform을 사용하면 테스트 데이터의 평균 [8, 9]로 스케일링됩니다.

결과가 완전히 달라집니다. 실무 사례를 공유하겠습니다.

한 스타트업에서 이 실수를 했습니다. 테스트 데이터를 별도로 스케일링해서 검증 정확도가 95%로 나왔습니다.

그런데 실제 서비스에 배포하니 정확도가 70%로 떨어졌습니다. 원인을 분석해보니 데이터 누수 문제였습니다.

테스트 데이터의 통계량을 사용해서 과대평가된 것입니다. 올바르게 수정하니 검증 정확도가 75%로 낮아졌지만, 실제 서비스 성능과 일치했습니다.

파이프라인 사용을 권장합니다. 사이킷런의 Pipeline을 사용하면 이런 실수를 방지할 수 있습니다.

파이프라인은 자동으로 학습 데이터에는 fit_transform을, 테스트 데이터에는 transform만 적용합니다. 또한 코드도 간결해집니다.

스케일링, 차원 축소, 모델 학습을 하나의 파이프라인으로 묶을 수 있습니다. 유지보수도 쉬워집니다.

"이제 완전히 이해했어요!" 김개발 씨가 정리했습니다. "fit으로 학습 데이터의 규칙을 배우고, transform으로 그 규칙을 적용하는 거네요.

테스트 데이터는 같은 규칙을 적용해야 공정한 평가가 되는 거고요." 박시니어 씨가 엄지를 치켜세웠습니다. "완벽해요!

이것만 제대로 이해해도 많은 실수를 피할 수 있습니다." fit과 transform의 차이를 이해하는 것은 머신러닝 워크플로우의 기본입니다. 데이터 누수를 방지하고 모델의 실제 성능을 정확히 평가하는 첫걸음입니다.

실전 팁

💡 - 학습 데이터: fit_transform, 테스트 데이터: transform만 사용하세요

  • scaler.mean_과 scaler.scale_ 속성으로 학습된 통계량을 확인할 수 있습니다
  • Pipeline을 사용하면 자동으로 올바르게 처리됩니다

7. 테스트 데이터 스케일링 주의점

마지막으로 박시니어 씨가 강조했습니다. "테스트 데이터 스케일링에는 함정이 많아요.

제가 본 가장 흔한 실수들을 알려드릴게요." 김개발 씨가 집중했습니다. 실전에서 바로 적용할 수 있는 내용이라는 걸 직감했습니다.

테스트 데이터 스케일링의 핵심 원칙은 학습 데이터의 통계량만 사용하는 것입니다. 테스트 데이터의 통계량을 계산하거나, 전체 데이터를 함께 스케일링하면 데이터 누수가 발생합니다.

또한 새로운 데이터의 값이 학습 데이터 범위를 벗어날 수 있음을 고려해야 합니다.

다음 코드를 살펴봅시다.

from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split
import numpy as np

# 데이터 준비
X = np.array([[1, 100], [2, 200], [3, 300],
              [4, 400], [5, 500]])
y = np.array([0, 0, 1, 1, 1])

# 올바른 방법: 분할 후 스케일링
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.4, random_state=42)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)  # fit 없이 transform만

print("올바른 방법 - 학습 데이터 통계량:")
print(f"평균: {scaler.mean_}")
print(f"표준편차: {scaler.scale_}")

# 잘못된 방법 1: 분할 전 스케일링
wrong_scaler = StandardScaler()
X_wrong = wrong_scaler.fit_transform(X)
X_train_wrong, X_test_wrong = train_test_split(
    X_wrong, y, test_size=0.4, random_state=42)
print("\n잘못된 방법 - 전체 데이터 통계량 사용")

# 잘못된 방법 2: 테스트 데이터에 fit_transform
X_test_very_wrong = scaler.fit_transform(X_test)
print("테스트 데이터를 별도로 fit하면 안 됨!")

박시니어 씨가 심각한 표정으로 말했습니다. "이 부분을 잘못하면 모델이 잘 작동하는 것처럼 보이지만, 실제로는 완전히 틀린 평가가 됩니다." 첫 번째 함정: 분할 전 스케일링 많은 초보자들이 이런 실수를 합니다.

전체 데이터를 먼저 스케일링한 후 학습/테스트로 나눕니다. 얼핏 보면 합리적으로 보입니다.

모든 데이터를 같은 기준으로 스케일링하는 게 공정해 보이니까요. 하지만 이것은 데이터 누수입니다.

테스트 데이터의 정보가 학습 과정에 새어 들어갑니다. 전체 데이터로 계산한 평균과 표준편차에는 테스트 데이터의 정보도 포함되어 있기 때문입니다.

예를 들어봅시다. 테스트 데이터에 극단적으로 큰 값이 있다고 가정합니다.

전체 데이터로 스케일링하면 이 큰 값이 평균과 표준편차에 영향을 줍니다. 결과적으로 모델이 테스트 데이터의 분포를 미리 엿보게 됩니다.

올바른 순서는 반드시 이렇습니다. 1단계: 데이터를 학습/테스트로 분할합니다 2단계: 학습 데이터로 스케일러를 fit합니다 3단계: 학습 데이터를 transform합니다 4단계: 같은 스케일러로 테스트 데이터를 transform합니다 이 순서를 절대 바꿔서는 안 됩니다.

코드로 작성할 때도 주석을 달아서 명확히 해두는 것이 좋습니다. 두 번째 함정: 테스트 데이터에 fit_transform 사용 이것은 더 심각한 실수입니다.

테스트 데이터를 별도로 fit_transform하면 테스트 데이터 자체의 통계량으로 스케일링됩니다. 이렇게 하면 검증 정확도가 실제보다 높게 나옵니다.

실제 서비스 환경을 생각해보세요. 새로운 데이터가 한 건씩 들어올 때 그 데이터의 평균과 표준편차를 계산할 수 없습니다.

반드시 학습 시 저장한 통계량을 사용해야 합니다. 한 프로젝트에서 이 실수로 인해 큰 손실을 입었습니다.

개발 단계에서는 정확도가 90%였는데, 실제 운영 환경에서는 60%로 떨어졌습니다. 원인을 찾느라 몇 주를 허비했습니다.

세 번째 함정: 범위 벗어난 값 처리 MinMaxScaler를 사용할 때 특히 조심해야 합니다. 학습 데이터의 최댓값이 100인데 테스트 데이터에 150이 나타나면 어떻게 될까요?

스케일링 결과가 1을 초과합니다. 일부 알고리즘은 이것을 잘 처리합니다.

하지만 신경망의 경우 입력이 0-1 범위를 벗어나면 예상치 못한 동작을 할 수 있습니다. 특히 시그모이드나 tanh 같은 활성화 함수를 사용할 때 그렇습니다.

해결 방법은 여러 가지입니다. 첫째, MinMaxScaler의 clip 매개변수를 True로 설정합니다.

이렇게 하면 범위를 벗어난 값을 자동으로 최솟값이나 최댓값으로 제한합니다. 둘째, StandardScaler를 사용합니다.

StandardScaler는 범위가 정해져 있지 않으므로 이 문제가 없습니다. 값이 크더라도 단지 평균에서 멀리 떨어진 점수로 변환될 뿐입니다.

셋째, 데이터 검증 단계를 추가합니다. 새로운 데이터가 학습 데이터 범위를 크게 벗어나면 경고를 발생시킵니다.

코드의 핵심 포인트를 정리합니다. 올바른 방법에서는 train_test_split을 먼저 수행합니다.

그다음 학습 데이터로만 fit_transform하고, 테스트 데이터는 transform만 적용합니다. 잘못된 방법 1에서는 split 전에 스케일링합니다.

전체 데이터의 통계량이 학습에 사용되므로 데이터 누수가 발생합니다. 잘못된 방법 2에서는 테스트 데이터에 fit_transform을 사용합니다.

테스트 데이터의 통계량으로 스케일링되므로 완전히 잘못된 결과가 나옵니다. 교차 검증 시 주의사항도 있습니다.

K-폴드 교차 검증을 할 때도 같은 원칙이 적용됩니다. 각 폴드마다 학습 세트로 스케일러를 fit하고, 검증 세트는 transform만 해야 합니다.

사이킷런의 cross_val_score를 사용할 때는 Pipeline을 함께 사용하세요. 파이프라인이 자동으로 올바르게 처리해줍니다.

수동으로 하면 실수하기 쉽습니다. 실전 팁을 드리겠습니다.

코드 리뷰 시 스케일링 부분을 특히 주의 깊게 봅니다. 분할과 스케일링의 순서, fit_transform과 transform의 사용을 확인합니다.

이것만 제대로 해도 많은 버그를 예방할 수 있습니다. 또한 스케일러 객체를 모델과 함께 저장합니다.

모델을 배포할 때 스케일러도 함께 배포해야 새로운 데이터를 올바르게 전처리할 수 있습니다. pickle이나 joblib로 저장하면 됩니다.

"이제 왜 선배들이 스케일링을 조심하라고 했는지 알겠어요." 김개발 씨가 말했습니다. "간단해 보이지만 함정이 많네요." 박시니어 씨가 고개를 끄덕였습니다.

"맞아요. 하지만 원칙만 지키면 어렵지 않습니다.

항상 분할 후 스케일링, 테스트는 transform만, 이 두 가지만 기억하세요." 테스트 데이터 스케일링은 머신러닝 파이프라인에서 가장 실수하기 쉬운 부분입니다. 하지만 원칙을 이해하고 지키면 정확한 모델 평가와 안정적인 서비스 운영이 가능합니다.

실전 팁

💡 - 반드시 데이터 분할 후에 스케일링하세요. 절대 반대 순서로 하지 마세요

  • 테스트 데이터에는 transform만 사용하고, fit_transform은 절대 사용하지 마세요
  • 스케일러 객체를 모델과 함께 저장해서 배포 시 동일한 전처리를 적용하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#MachineLearning#FeatureScaling#Scikit-learn#DataPreprocessing

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.