최대 절댓값 스케일링(MaxAbs Scaling)이란? AI 특징값의 최대 크기를 1로 맞추는 방법
TL;DR
최대 절댓값 스케일링(MaxAbs Scaling)은 각 수치 특징을 학습 데이터에서 구한 최대 절댓값으로 나눠, 학습값의 가장 큰 절댓값을 1로 맞추는 전처리입니다. 평균이나 중앙값을 빼지 않아 0은 그대로 0이고 희소 데이터의 0 구조도 유지됩니다. 다만 최대값 하나를 기준으로 삼으므로 이상치에 민감하며, 검증·테스트·추론에는 학습 때 저장한 값을 다시 써야 합니다.
핵심 3줄 요약
- 핵심 1
최대 절댓값으로 나눕니다. 특징별 학습값 가운데 절댓값이 가장 큰 수를 척도로 사용합니다. - 핵심 2
0과 부호를 유지합니다. 중심을 옮기지 않아 희소 행렬의 0이 새 값으로 바뀌지 않습니다. - 핵심 3
이상치에는 민감합니다. 극단값이 척도를 크게 만들면 나머지 값이 0 근처에 몰릴 수 있습니다.
이 글에서 다룰 내용
- 최대 절댓값 스케일링과 MaxAbsScaler의 한 문장 정의
- -4·-2·0·1을 바꾸는 쉬운 계산 예시
- 중심을 옮기지 않아 희소성을 유지하는 이유
- 학습 최대 절댓값을 저장하고 다시 쓰는 순서
- 최소-최대·표준화·로버스트·L1·L2 정규화와의 차이
- 희소 특징과 대규모 전처리 활용법
- 이상치·범위 밖 입력·0인 특징을 확인하는 방법
최대 절댓값 스케일링을 한 문장으로 정의하면 무엇인가요?
최대 절댓값 스케일링은 각 특징값을 그 특징의 학습 최대 절댓값으로 나눠 크기를 조정하되, 중심을 이동하지 않는 선형 전처리입니다. scikit-learn과 Apache Spark에서는 MaxAbsScaler, BigQuery ML에서는 ML.MAX_ABS_SCALER라는 이름으로 제공합니다.
한 특징의 학습값을 x, 그 특징에서 가장 큰 절댓값을 M이라고 하면 변환값은 x를 M으로 나눈 값입니다. 양수와 음수가 모두 있어도 기준은 가장 큰 양수가 아니라 절댓값이 가장 큰 수입니다. -10과 8이 함께 있다면 M은 10입니다.
학습 데이터의 변환값은 -1과 1 사이에 놓이며 절댓값이 가장 큰 학습값은 -1 또는 1이 됩니다. 모든 특징이 양수라면 실제 범위는 0과 1 사이일 수 있고, 모든 값이 음수라면 -1과 0 사이일 수 있습니다. 두 끝값을 반드시 모두 채우는 변환은 아닙니다.
한 줄 정리: 최대 절댓값 스케일링은 변환값 = 원래 값 ÷ 학습 최대 절댓값으로 이해하면 됩니다.
쉬운 예시로 이해해 볼까요?
한 특징의 학습값이 -4, -2, 0, 1이라고 가정해 보겠습니다. 절댓값은 4, 2, 0, 1이고 그중 가장 큰 값은 4입니다. 모든 값을 4로 나누면 계산이 끝납니다.
- -4는 -4÷4이므로 -1입니다.
- -2는 -2÷4이므로 -0.5입니다.
- 0은 0÷4이므로 0입니다.
- 1은 1÷4이므로 0.25입니다.
변환 뒤에도 값의 순서와 부호, 0의 위치는 그대로입니다. 원래 값 사이의 비율도 같은 특징 안에서는 유지됩니다. -4가 -2의 두 배 크기였던 관계는 -1과 -0.5에서도 같습니다.
이제 추론 때 6이 들어오면 학습 척도 4로 나눠 1.5가 됩니다. 새 입력이 학습 때 본 최대 절댓값보다 크면 결과가 -1과 1을 벗어날 수 있습니다. 실행 때마다 새 최대값으로 다시 나누면 학습과 추론에서 숫자의 뜻이 달라지므로 그렇게 처리하면 안 됩니다.
쉬운 예시: 서로 다른 길이의 자를 새로 만드는 것이 아니라, 학습 데이터에서 가장 긴 막대를 1칸으로 정하고 다른 막대를 같은 자로 재는 방식과 비슷합니다.
왜 AI에서 최대 절댓값 스케일링이 중요한가요?
큰 단위의 특징이 계산을 지배하는 문제를 줄입니다
클릭 횟수는 수십, 상품 금액은 수십만처럼 특징 단위가 크게 다르면 거리나 기울기 계산에서 숫자가 큰 열의 영향이 커질 수 있습니다. 특징마다 최대 절댓값으로 나누면 각 열의 학습 범위를 비슷한 크기로 맞춰 모델이 단위 차이만 보고 움직이는 문제를 줄일 수 있습니다.
희소 데이터의 0을 그대로 보존합니다
단어 출현 횟수나 원-핫 인코딩처럼 대부분이 0인 행렬은 0이 아닌 값만 저장해 메모리를 아낄 수 있습니다. 최대 절댓값 스케일링은 평균이나 중앙값을 빼지 않으므로 0이 계속 0입니다. scikit-learn과 Spark 문서도 중심을 옮기지 않아 희소성을 해치지 않는다는 점을 명시합니다.
간단한 선형 계산으로 특징 척도를 기록합니다
특징마다 저장할 핵심 통계는 최대 절댓값 하나입니다. 변환도 나눗셈이 중심이라 계산과 역변환을 이해하기 쉽습니다. 단순하다고 해서 검증이 필요 없는 것은 아닙니다. 어떤 데이터로 최대값을 구했는지와 특징 순서를 함께 기록해야 같은 결과를 재현할 수 있습니다.
핵심 인사이트: MaxAbsScaler의 강점은 이상치에 강한 데 있지 않습니다. 중심 이동 없이 0과 희소 구조를 보존하면서 특징별 크기를 맞추는 데 있습니다.
최대 절댓값 스케일링은 어떻게 작동하나요?
1. 데이터를 학습·검증·테스트로 먼저 나눕니다
최대 절댓값을 계산하기 전에 데이터 역할부터 나눕니다. 전체 데이터에서 최대값을 본 뒤 분리하면 검증과 테스트 정보가 학습 전처리에 섞입니다. 교차 검증에서는 각 폴드의 학습 부분에만 스케일러를 fit해야 합니다.
2. 학습 데이터에서 특징별 최대 절댓값을 구합니다
나이, 금액, 출현 횟수처럼 각 열을 따로 보고 절댓값의 최댓값을 계산합니다. 한 열의 기준값을 다른 열에 나누지 않습니다. 벡터 데이터에서는 특징 인덱스가 열 역할을 하므로 인덱스 순서도 고정해야 합니다.
3. 각 값을 해당 특징의 척도로 나눕니다
양수와 음수는 같은 양의 척도로 나누므로 부호가 바뀌지 않습니다. 0은 0으로 남습니다. 같은 열의 모든 값을 같은 수로 나누기 때문에 값의 순서와 상대적 간격을 유지하는 선형 변환입니다.
4. 학습 통계를 저장해 후속 입력에 재사용합니다
fit이 끝나면 특징 이름과 순서, 자료형, 최대 절댓값과 라이브러리 버전을 모델과 함께 저장합니다. 검증·테스트·실시간 추론에는 같은 값을 적용합니다. BigQuery ML은 TRANSFORM 절에서 학습 중 계산한 최대 절댓값을 예측에도 자동으로 사용한다고 안내합니다.
한 줄 정리: 데이터 분리 → 학습 특징별 최대 절댓값 계산 → 나눗셈 → 통계 저장·재사용 순서입니다.
주요 특성과 예외는 무엇인가요?
중심화하지 않아 평균이 0이 되지는 않습니다
표준화처럼 평균을 빼거나 로버스트 스케일링처럼 중앙값을 빼지 않습니다. 원래 데이터가 양수 쪽에 몰려 있었다면 변환 뒤에도 양수 쪽에 남습니다. 평균 0이 필요한 전처리와 최대 절댓값 스케일링을 같은 것으로 보면 안 됩니다.
학습 범위와 추론 범위는 다를 수 있습니다
학습값은 최대 절댓값 자체로 나누므로 -1과 1 안에 들어갑니다. 하지만 새 값의 절댓값이 학습 최대값보다 크면 변환값은 범위를 벗어납니다. scikit-learn의 MaxAbsScaler에는 보류 데이터 값을 -1과 1로 자르는 clip 옵션이 있지만 기본값은 false이며, 자르면 역변환으로 원래 값을 완전히 복원하지 못할 수 있습니다.
NaN과 0인 척도 처리는 구현을 확인합니다
scikit-learn의 함수 문서는 NaN을 통계 계산에서 제외하고 변환 결과에는 유지한다고 설명합니다. 한 특징이 전부 0이면 나눌 기준도 0이므로 라이브러리가 어떤 안전값과 출력을 쓰는지 작은 테스트로 확인해야 합니다. 서로 다른 도구의 예외 처리가 같다고 가정하지 않습니다.
함수형 API와 학습형 변환기를 구분합니다
scikit-learn의 maxabs_scale 함수는 축을 0 또는 1로 선택할 수 있습니다. 반면 MaxAbsScaler는 학습 파이프라인에서 특징별 통계를 fit하고 재사용하는 변환기입니다. 평가 데이터 누수를 막으려면 임시 함수 호출보다 Pipeline에 학습형 변환기를 묶는 편이 안전합니다.
실전 팁: 정상값, 음수, 0만 있는 열, NaN, 학습 최대값보다 큰 새 입력을 고정 사례로 만들어 학습과 서빙 결과를 비교하세요.
헷갈리는 스케일링과 무엇이 다른가요?
최소-최대 스케일링과의 차이
최소-최대 스케일링은 학습 최솟값을 빼고 최댓값과 최솟값의 차이로 나눠 지정 범위로 옮깁니다. 그래서 보통 학습 최솟값은 0, 최댓값은 1이 됩니다. 최대 절댓값 스케일링은 값을 이동하지 않고 최대 절댓값으로만 나눠 0과 부호를 유지합니다.
표준화와의 차이
표준화는 학습 평균을 빼고 표준편차로 나눠 중심과 척도를 함께 맞춥니다. 최대 절댓값 스케일링은 평균과 분산을 쓰지 않으며 중심도 옮기지 않습니다. 둘 다 극단값의 영향을 받을 수 있지만 계산 기준과 출력 의미가 다릅니다.
로버스트 스케일링과의 차이
로버스트 스케일링은 중앙값을 빼고 기본적으로 IQR로 나눠 일부 극단값이 통계를 흔드는 영향을 줄입니다. 최대 절댓값 스케일링은 가장 큰 절댓값 하나를 직접 기준으로 사용하므로 이상치에 강하지 않습니다. 대신 중심화하지 않아 0 구조를 보존합니다.
L1·L2 정규화와의 차이
L1·L2 정규화는 보통 표본 하나의 벡터를 보고 절댓값 합이나 유클리드 길이를 1로 맞춥니다. 최대 절댓값 스케일링은 여러 학습 표본을 보고 특징 열별 척도를 구합니다. 전자는 행 방향 벡터 전체, 후자는 열 방향 특징을 주로 조정합니다.
클리핑과의 차이
클리핑은 정한 상한과 하한 밖의 값을 경계값으로 바꿉니다. 기본 최대 절댓값 스케일링은 값을 같은 비율로 줄일 뿐 새 입력을 자동으로 경계 안에 넣지 않습니다. 클리핑을 함께 쓰면 극단값 정보와 역변환 가능성이 달라지므로 별도 정책으로 기록해야 합니다.
비교 정리: 최소-최대는 양 끝값, 표준화는 평균·표준편차, 로버스트는 중앙값·IQR, L1·L2는 표본 벡터 노름, 최대 절댓값은 특징별 최대 절댓값을 기준으로 삼습니다.
실전에서는 어디에 쓰이나요?
희소한 텍스트 특징
단어별 출현 횟수, TF 계열 특징처럼 대부분의 값이 0인 행렬에 적용할 수 있습니다. 중심을 빼지 않아 희소 저장 구조를 유지하면서 단어별 최대 크기를 맞춥니다. 다만 한 문서의 비정상적으로 큰 횟수가 전체 척도를 정하지 않는지 먼저 확인해야 합니다.
원-핫과 희소 범주 특징의 파이프라인
0과 1로만 된 원-핫 열은 최대 절댓값이 1이므로 변환해도 값이 그대로입니다. 다른 희소 수치 특징과 같은 파이프라인에 묶였을 때 어떤 열이 실제로 바뀌는지 확인해야 불필요한 단계와 오해를 줄일 수 있습니다.
분산 학습과 대규모 특징 벡터
Apache Spark의 MaxAbsScaler는 벡터 특징을 열별 최대 절댓값으로 나눕니다. 대규모 데이터에서도 원리는 같지만 입력 벡터의 차원과 순서, fit에 사용한 데이터 범위, 저장한 MaxAbsScalerModel을 일치시켜야 합니다.
SQL 기반 학습 전처리
BigQuery ML의 ML.MAX_ABS_SCALER는 수치 표현식을 최대 절댓값으로 나누는 전처리를 제공합니다. TRANSFORM 절에 넣으면 학습과 예측이 같은 통계를 사용하도록 연결할 수 있습니다. 학습 쿼리의 필터와 예측 입력 스키마도 함께 기록해야 합니다.
실전 팁: 희소성을 유지해야 한다는 이유만으로 바로 선택하지 말고 StandardScaler의 비중심화 설정이나 다른 스케일러와 같은 데이터 분할에서 성능을 비교하세요.
적용 전후를 어떻게 점검하나요?
1. 전체 데이터로 fit하지 않았는지 확인합니다
훈련·검증·테스트를 나누기 전에 최대 절댓값을 계산하지 않았는지 봅니다. 파이프라인과 교차 검증을 함께 쓰면 각 학습 폴드의 값만 통계에 반영할 수 있습니다. 누수는 숫자 오류를 내지 않으므로 절차로 막아야 합니다.
2. 작은 배열로 계산 결과를 대조합니다
고정 배열 [-4, -2, 0, 1]로 최대 절댓값 4와 결과 [-1, -0.5, 0, 0.25]를 확인합니다. 새 입력 6이 1.5가 되는지도 봅니다. 결과가 다르면 축, clip 여부, 자료형과 저장된 통계를 먼저 점검합니다.
3. 특징 이름과 순서를 고정합니다
학습 때 금액, 횟수 순서였는데 추론 때 횟수, 금액 순서가 되면 서로 다른 최대값으로 나눌 수 있습니다. 오류가 나지 않아도 결과는 틀립니다. 입력 스키마, 열 순서와 변환기 버전을 모델 버전에 묶어 관리합니다.
4. 희소성과 분포를 함께 확인합니다
변환 전후의 0 개수와 희소 행렬 형식이 유지되는지 확인합니다. 각 특징의 최솟값·최댓값·분위수도 함께 봐야 일부 극단값 때문에 정상값 대부분이 0 근처에 눌렸는지 알 수 있습니다.
5. 모델 성능과 새 범위 입력을 검증합니다
최소-최대, 표준화, 로버스트, 최대 절댓값 스케일링을 같은 모델·시드·평가 지표로 비교합니다. 운영 입력에서 절댓값 1을 넘는 비율과 최대 크기를 관찰하고, 범위 밖 값을 허용할지 경고·클리핑·재학습할지 정책을 정합니다.
한 줄 정리: fit 범위, 손계산 결과, 특징 스키마, 희소성·분포, 모델 성능과 새 입력 범위를 차례로 확인합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 이상치에 강한 스케일러라고 생각하지 않습니다. 가장 큰 절댓값이 바로 나눗셈 기준이므로 극단값 하나가 나머지 값의 크기를 크게 줄일 수 있습니다. 입력 오류와 실제 희귀 사례를 먼저 구분합니다.
둘째, 검증·테스트 데이터에서 최대값을 미리 보지 않습니다. 학습 데이터에만 fit하고 나머지에는 transform만 적용합니다. 최대 절댓값도 모델이 학습한 정보의 일부입니다.
셋째, 결과가 항상 -1과 1 안에 머문다고 가정하지 않습니다. 학습 범위보다 큰 새 입력은 경계를 벗어날 수 있습니다. clip을 쓰면 정보가 잘리므로 목적과 복원 필요성을 따져야 합니다.
넷째, 0인 열과 NaN 처리를 빼놓지 않습니다. 전부 0인 특징과 결측값이 섞인 특징을 작은 입력으로 시험하고 라이브러리·버전별 결과를 기록합니다.
다섯째, 희소성 보존과 모델 품질을 따로 봅니다. 메모리 효율이 좋아도 예측 성능이 자동으로 좋아지는 것은 아닙니다. 원본 의미와 검증 지표를 함께 보고 선택합니다.
주의: 최대 절댓값 스케일링은 데이터 품질 점검을 대신하지 않습니다. 잘못된 단위, 중복 집계, 센서 오류와 데이터 누수는 변환 뒤에도 남습니다.
자주 묻는 질문
Q1. 최대 절댓값 스케일링과 MaxAbsScaler는 같은 말인가요?
대체로 같은 개념을 가리킵니다. MaxAbsScaler는 scikit-learn과 Spark가 제공하는 구현 이름입니다. BigQuery ML은 ML.MAX_ABS_SCALER라는 함수 이름을 씁니다. 세부 옵션과 입력 형태는 도구마다 다르므로 문서를 함께 확인해야 합니다.
Q2. 변환하면 모든 값이 -1 또는 1이 되나요?
아닙니다. 절댓값이 가장 큰 학습값만 -1이나 1이 되고 나머지는 그 사이의 비율로 바뀝니다. 양수만 있는 특징은 음수 결과가 없고, 음수만 있는 특징은 양수 결과가 없을 수 있습니다.
Q3. 최대 절댓값 스케일링은 이상치에 강한가요?
아닙니다. 가장 큰 절댓값을 기준으로 사용하므로 이상치에 민감합니다. 극단값 영향을 줄이는 목적이라면 로버스트 스케일링 같은 후보와 비교하되, 이상치의 원인과 업무 의미도 따로 검토해야 합니다.
Q4. 희소 행렬에 적합한 이유는 무엇인가요?
평균이나 중앙값을 빼지 않아 원래 0이 변환 뒤에도 0으로 남기 때문입니다. 0이 아닌 값만 저장하는 희소 구조를 유지하기 쉽습니다. 실제 입력 형식이 라이브러리가 지원하는 CSR·CSC나 벡터 형식인지도 확인하세요.
Q5. 새 데이터가 들어올 때마다 다시 fit해야 하나요?
실시간 요청마다 다시 fit하면 안 됩니다. 학습 때 저장한 최대 절댓값을 그대로 적용해야 숫자의 의미가 일정합니다. 입력 분포가 바뀌었다면 새 학습 데이터로 스케일러와 모델을 함께 다시 학습·검증한 뒤 새 버전으로 배포합니다.
출처
마무리
최대 절댓값 스케일링은 각 특징을 학습 데이터의 최대 절댓값으로 나눠 학습값의 가장 큰 크기를 1로 맞추는 전처리입니다. 중심을 옮기지 않아 0과 부호, 희소 구조를 유지하지만 극단값의 영향을 줄이는 방법은 아닙니다.
실전에서는 데이터를 먼저 나누고 학습 부분에만 fit하며 최대 절댓값·특징 순서·옵션을 모델과 함께 저장하세요. 0인 열, NaN, 음수와 학습 범위보다 큰 새 입력을 고정 테스트로 확인하고 다른 스케일러와 같은 조건에서 모델 성능을 비교해야 재현 가능한 AI 파이프라인이 됩니다.
