선형 판별 분석(LDA)이란? AI에서 클래스의 분포로 분류하고 차원을 줄이는 방법
TL;DR
선형 판별 분석(LDA)은 클래스별 정규분포와 공통 공분산을 가정해 새 입력을 분류하는 지도학습 방법입니다. 클래스의 평균과 퍼짐, 사전확률을 이용해 선형 결정 경계를 만듭니다. 라벨을 보고 클래스를 구분하는 축을 찾아 차원을 줄이는 데도 쓰지만, 분류 결과와 변환 좌표는 구분해서 읽어야 합니다.
핵심 3줄 요약
- 핵심 1
분포를 배워 분류합니다. 클래스마다 평균은 다르지만 공분산은 같다고 가정하고 베이즈 정리로 소속 확률을 계산합니다. - 핵심 2
라벨을 쓰는 차원 축소입니다. 데이터 전체의 분산보다 클래스 사이의 구분에 초점을 맞춰 새 축을 찾습니다. - 핵심 3
가정과 설정을 함께 확인합니다. 공분산 추정, 출력 차원, solver의 지원 범위와 독립 평가가 결과 해석을 좌우합니다.
이 글에서 다룰 내용
- 선형 판별 분석의 한 문장 정의
- 품종을 구분하는 쉬운 예시
- 클래스 평균·공분산·사전확률의 역할
- 분류와 지도 차원 축소의 작동 방식
- PCA·QDA·로지스틱 회귀·나이브 베이즈와의 차이
- 실전 사용처와 설정 점검 순서
- 가정·데이터 누수·확률 해석의 주의점
선형 판별 분석을 한 문장으로 정의하면 무엇인가요?
선형 판별 분석(Linear Discriminant Analysis, LDA)은 클래스별 평균과 공유하는 공분산으로 입력의 분포를 모델링하고, 클래스 사전확률을 반영해 선형 경계로 분류하는 방법입니다.
공분산은 여러 특징이 얼마나 퍼져 있고 함께 변하는지를 나타냅니다. LDA는 클래스마다 중심은 다를 수 있지만 중심 주변의 퍼짐과 기울어진 방향은 같다고 가정합니다. 각 특징이 서로 독립이어야 한다는 가정과는 다릅니다.
여기서 정규분포 가정은 모든 데이터를 한데 모은 분포가 아니라 각 클래스 안의 특징 분포에 적용됩니다. 클래스가 섞인 전체 데이터가 여러 봉우리로 보인다고 그 자체로 LDA 가정을 위반한 것은 아닙니다.
한 줄 정리: LDA는 정답 라벨별 분포를 배워 분류하며, 그 라벨을 구분하는 낮은 차원의 표현도 만듭니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 꽃의 측정값으로 품종을 구분한다고 가정해 보겠습니다. 학습 자료에는 꽃받침과 꽃잎의 길이·너비, 실제 품종 라벨이 들어 있습니다. LDA는 각 품종의 평균 측정값과 품종 안에서 값이 함께 변하는 패턴을 배웁니다.
새 꽃이 들어오면 단순히 평균과 직선거리가 가까운 품종만 고르지는 않습니다. 흔하게 변하는 방향의 차이와 드물게 변하는 방향의 차이를 다르게 보고, 각 품종이 나타날 사전확률까지 반영해 소속을 판단합니다.
그림으로 살펴볼 때는 품종별 점 구름의 중심이 얼마나 떨어져 있는지와 같은 품종의 점이 얼마나 흩어져 있는지를 함께 봅니다. LDA는 품종 사이를 구분하기 좋은 방향으로 점들을 투영합니다. 길이가 크게 달라지는 방향이라도 품종이 섞여 있으면 분류에 좋은 축이 아닐 수 있습니다.
scikit-learn의 Iris 예제는 네 가지 측정 특징과 세 품종을 두 축으로 표시해 PCA와 LDA를 비교합니다. 이는 원리를 설명하는 공식 예제이며, 그림에서 품종이 잘 나뉜다고 별도의 테스트 성능까지 증명한 것은 아닙니다.
쉬운 예시: PCA가 전체 점 구름이 길게 뻗은 방향을 본다면, LDA는 정답 색깔이 다른 점 구름을 구분하기 좋은 방향을 봅니다.
왜 AI에서 선형 판별 분석이 중요한가요?
분류와 입력 분포를 함께 이해합니다
LDA는 학습한 클래스 평균과 공분산 가정으로 결정 경계를 설명합니다. 숫자 특징으로 품종이나 상태를 나누는 문제에서 비교 모델로 삼기 좋습니다. 결과가 나쁘다면 선형 경계가 부족한지, 클래스별 분포가 너무 다른지 살펴볼 근거가 생깁니다.
정답에 맞는 저차원 표현을 만듭니다
특징이 많아도 현재 라벨을 구분하는 데 필요한 방향은 적을 수 있습니다. LDA의 변환은 클래스 사이의 차이를 드러내는 데 초점을 맞춥니다. 다만 현재 라벨에 유용한 축이 다른 업무나 새로운 클래스에도 좋은 표현이라는 보장은 없습니다.
복잡한 모델과 비교할 기준이 됩니다
선형 분류 모델로 충분한 문제라면 더 복잡한 모델이 꼭 필요하지 않을 수 있습니다. LDA를 같은 데이터 분할에서 다른 모델과 비교하면 입력 특징과 라벨의 관계를 점검하기 쉽습니다. 간단한 모델이라는 이유만으로 정확하거나 공정하다고 판단해서는 안 됩니다.
선형 판별 분석은 어떤 순서로 작동하나요?
1. 특징과 클래스 라벨을 준비합니다
한 행은 하나의 사례, 한 열은 하나의 숫자 특징으로 맞춥니다. 학습에는 특징 X와 정답 y가 모두 필요합니다. 결측값 처리나 특징 선택도 학습 데이터 안에서 결정하고 평가 데이터에는 이미 정한 처리를 적용합니다.
2. 클래스별 평균과 공통 퍼짐을 추정합니다
각 클래스의 중심을 구한 뒤 클래스 내부의 공분산 정보를 모아 공유할 퍼짐을 추정합니다. 클래스 사전확률을 따로 지정하지 않으면 scikit-learn은 학습 자료의 클래스 비율을 사용합니다. 수집 과정에서 특정 클래스를 많이 뽑았다면 그 비율이 실제 서비스와 같은지 확인합니다.
3. 클래스별 점수로 예측을 만듭니다
모델은 새 입력이 각 클래스에서 나올 법한 정도와 사전확률을 결합합니다. 모든 클래스가 공분산을 공유하므로 두 클래스의 점수를 비교할 때 공통 이차항이 소거되어 선형 경계가 남습니다. 입력 특징이 둘이면 경계는 직선이고, 더 많으면 초평면으로 생각하면 됩니다.
predict
는 라벨,
predict_proba
는 클래스별 추정 확률,
decision_function
은 판별 점수를 반환합니다. 점수는 확률 자체가 아니므로 그대로 백분율로 읽지 않습니다. 확률 열을 해석할 때도
classes_
의 라벨 순서를 함께 보관합니다.
4. 필요하면 판별 축으로 변환합니다
transform
은 입력을 클래스 구분에 유용한 축으로 옮깁니다. 클래스 사이의 퍼짐을 크게 하고 클래스 내부 퍼짐에 견줘 구분을 높이는 방향을 찾는다고 이해하면 됩니다. 변환값은 새 좌표이며 정답 라벨이나 소속 확률이 아닙니다.
핵심 인사이트: LDA의 분류와 차원 축소는 연결되어 있지만 반환하는 결과는 다릅니다. 예측 라벨이 필요한지, 확률이 필요한지, 낮은 차원의 좌표가 필요한지부터 정하세요.
출력 차원과 주요 설정은 무엇을 뜻하나요?
n_components는 변환할 축의 수입니다
출력 차원의 상한은 특징 수와 클래스 수에서 하나를 뺀 값 중 작은 값입니다. 두 클래스라면 판별 축은 최대 하나이며, 특징이 아무리 많아도 두 개의 판별 축을 요청할 수는 없습니다. scikit-learn에서
n_components
는 변환에 영향을 주며 분류용
fit
과
predict
의 차원을 줄이는 설정은 아닙니다.
solver마다 지원하는 기능이 다릅니다
solver="svd"
는 기본 계산 방식이며 공분산 행렬을 명시적으로 만들지 않고 분류와 변환을 지원합니다.
solver="lsqr"
는 분류에 쓰고 변환은 지원하지 않습니다.
solver="eigen"
은 분류와 변환에 사용할 수 있습니다. 차원 축소까지 필요하면 이 차이를 먼저 확인합니다.
shrinkage는 공분산 추정을 안정시킵니다
표본에 비해 특징이 많으면 표본 공분산을 믿기 어려울 수 있습니다. 수축 추정은 공분산을 더 제한된 형태 쪽으로 조정하는 규제입니다.
shrinkage="auto"
는 Ledoit-Wolf 방식으로 강도를 정하며 LDA에서는
lsqr
와
eigen
에만 적용합니다. 자동 설정이 모든 데이터에서 가장 좋은 분류 성능을 보장하지는 않습니다.
별도 공분산 추정기를 쓰는
covariance_estimator
와
shrinkage
는 동시에 설정하지 않습니다. 기본 방식이 SVD라고 해서 사용자가 원본 데이터를 먼저 별도로 SVD 분해해야 한다는 뜻도 아닙니다. 라이브러리 안의 계산 방식과 분석자가 선택한 전처리를 구분하세요.
선형 판별 분석과 헷갈리는 용어는 무엇이 다른가요?
PCA와의 차이
주성분 분석(PCA)은 라벨 없이 전체 데이터의 분산을 크게 보존하는 축을 찾습니다. LDA는 라벨을 이용해 클래스 사이의 분리를 고려합니다. 같은 입력을 두 축으로 바꾸더라도 최적화하는 목표와 필요한 정보가 다릅니다.
QDA와의 차이
이차 판별 분석(QDA)은 클래스마다 별도의 공분산을 추정합니다. LDA보다 다양한 이차 경계를 표현하지만 추정할 공분산 정보도 늘어납니다. 공식 비교 예제처럼 클래스의 퍼짐이 다르면 도움이 될 수 있으나, 자료가 적을 때 무조건 더 좋은 모델은 아닙니다.
로지스틱 회귀와의 차이
로지스틱 회귀와 LDA는 모두 선형 결정 경계를 만들 수 있습니다. 로지스틱 회귀는 입력에 따른 클래스 확률을 직접 모델링하고, LDA는 클래스가 주어졌을 때의 입력 분포를 먼저 모델링합니다. 경계 모양이 비슷해도 학습 가정과 추정 과정이 같지는 않습니다.
가우시안 나이브 베이즈와의 차이
가우시안 나이브 베이즈는 클래스 안에서 특징이 조건부 독립이라고 가정합니다. LDA는 공분산 행렬의 비대각 성분도 허용해 특징 사이의 관계를 반영하지만 그 공분산을 클래스들이 공유합니다. 정규분포를 사용한다는 공통점만으로 두 방법을 같은 모델로 보면 안 됩니다.
비교 정리: PCA는 라벨 없는 분산 보존, LDA는 공분산을 공유하는 분류와 지도 차원 축소, QDA는 클래스마다 다른 공분산을 쓰는 분류입니다.
실전에서는 어디에 쓰이나요?
수치 특징으로 상태나 범주를 구분합니다
꽃 측정값이나 장비 센서 특징처럼 수치와 라벨이 있는 자료에서 분류 후보로 비교합니다. 어떤 입력을 썼고 클래스 평균이 어떻게 다른지 살펴볼 수 있습니다. 실제 품질 판정에 사용한다면 드문 불량을 놓치는 비율과 오탐 비용도 별도로 평가합니다.
라벨별 겹침을 그림으로 살펴봅니다
여러 클래스의 특징을 낮은 차원으로 옮겨 겹치는 사례를 확인합니다. 겹친 점의 원본을 보면 라벨 오류나 구분하기 어려운 유형을 조사하는 데 도움이 됩니다. 단, 라벨을 이용해 축을 만들었으므로 같은 자료의 그림이 잘 나뉘는 것은 독립적인 검증 결과가 아닙니다.
후속 모델에 넣을 특징을 비교합니다
판별 축으로 만든 좌표를 다른 분류기의 입력 후보로 검토할 수 있습니다. 원본 특징과 비교해 차원이 줄어든 이점이 있는지 확인합니다. 후속 모델만 교차 검증하고 LDA는 전체 자료에 먼저 맞추면 검증 라벨이 축을 만드는 데 섞이므로 평가가 낙관적으로 나옵니다.
선형 판별 분석을 적용할 때 어떤 순서로 확인하나요?
1. 분류와 변환 중 목적을 정합니다. 라벨을 예측할지, 그림을 그릴지, 후속 모델의 입력을 만들지 적습니다. 클래스 수와 특징 수를 확인하고 필요한 출력 차원이 가능한지도 함께 점검합니다.
2. 데이터를 나눈 뒤 전처리를 학습합니다. 같은 사람이나 장비의 반복 관측이 학습과 테스트에 섞이지 않도록 분리합니다. 전처리·LDA·후속 모델을 하나의 파이프라인으로 묶어 교차 검증의 각 학습 구간에서 다시 맞추면 누수를 줄일 수 있습니다.
3. 가정과 계산 설정을 함께 비교합니다. 클래스별 표본 수, 이상값, 중복 열과 상수 열을 점검합니다. 변환 지원 여부에 맞는 solver를 고르고, 필요하면 수축 추정을 비교합니다. 경고를 없애는 것과 새 데이터 성능을 높이는 것은 별개입니다.
4. 실제 사용할 출력으로 평가합니다. 라벨 분류는 혼동 행렬과 클래스별 지표를 보고 확률을 쓸 때는 별도 평가 자료에서 신뢰도를 확인합니다. 입력 열의 순서, 클래스 순서, 전처리와 설정을 모델과 함께 저장합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 공유 공분산은 데이터의 사실이 아니라 모델의 가정입니다. 클래스마다 퍼짐이나 방향이 크게 다르면 LDA의 직선 경계가 관계를 충분히 표현하지 못할 수 있습니다. 이때는 QDA나 다른 비선형 모델을 같은 평가 분할에서 비교합니다.
둘째, 정답을 사용한 변환은 평가 전에 분리합니다. LDA로 차원을 줄인다는 이유로 라벨 사용을 잊기 쉽습니다. 전체 데이터에 LDA를 맞추고 나중에 테스트를 나누면 테스트 정답이 표현 학습에 들어갑니다. 시험할 자료는 축을 만들기 전에 떼어 둡니다.
셋째, 높은 추정 확률을 보증으로 읽지 않습니다. 가정이 어긋나거나 운영 환경의 클래스 비율이 달라지면 확률도 부정확해질 수 있습니다. 중요한 판정에는 확률 검증과 사람 검토 기준을 두고, 클래스 사전확률을 바꾼 이유도 기록합니다.
넷째, 차원을 줄여도 원래의 모든 정보가 남지는 않습니다. LDA는 현재 정답을 구분하는 방향에 집중합니다. 다른 라벨의 예측이나 이상 탐지에 중요한 변동이 사라질 수 있으므로 다른 목적의 분석에 변환 좌표를 무조건 재사용하지 않습니다.
주의: 잘 분리된 그림, 실행 성공, 높은 학습 정확도만으로 실제 성능을 확정하지 않습니다. 모델이 보지 못한 데이터와 실제 사용할 출력 형식으로 확인하세요.
자주 묻는 질문
Q1. LDA는 비지도학습인가요?
아닙니다. 선형 판별 분석은 학습에 클래스 라벨을 사용합니다. 차원 축소도 라벨을 이용하므로 라벨 없이 축을 찾는 PCA와 다릅니다. 새 입력을 변환할 때는 이미 학습한 변환을 적용하므로 새 입력의 정답을 요구하지 않습니다.
Q2. 분류하려면 먼저 transform을 호출해야 하나요?
아닙니다. scikit-learn의 LDA는 학습한 모델에서 predict를 호출해 바로 분류할 수 있습니다. transform은 좌표가 필요한 작업에 사용합니다. 두 함수가 반환하는 모양과 의미를 섞지 마세요.
Q3. 두 클래스도 두 개의 판별 축으로 그릴 수 있나요?
일반적인 LDA의 유효 판별 축은 클래스 수보다 하나 적은 수를 넘지 않습니다. 두 클래스에서는 최대 하나입니다. 그림을 보기 좋게 만들려고 n_components를 늘려도 없는 판별 방향이 생기지는 않습니다.
Q4. shrinkage를 켜면 항상 더 정확한가요?
아닙니다. 표본이 적고 특징이 많을 때 공분산 추정을 안정시키려는 선택지입니다. 지원 solver를 확인하고 검증 자료에서 기본 설정과 비교합니다. 자동으로 강도를 정한다는 말은 평가를 생략해도 된다는 뜻이 아닙니다.
Q5. 정규분포 가정이 조금 어긋나면 사용할 수 없나요?
가정과 완전히 일치하지 않아도 비교 모델로 평가할 수 있습니다. 다만 분류 성능과 확률의 신뢰도를 나눠 점검하고, 클래스별 퍼짐과 오류 유형을 살펴야 합니다. 이론상의 가정을 실제 데이터의 보증으로 바꾸어 읽지 않습니다.
출처
- scikit-learn User Guide, Linear and Quadratic Discriminant Analysis
- scikit-learn API, LinearDiscriminantAnalysis
- scikit-learn API, QuadraticDiscriminantAnalysis
- scikit-learn Example, Linear and Quadratic Discriminant Analysis with covariance ellipsoid
- scikit-learn Example, Comparison of LDA and PCA 2D projection of Iris dataset
마무리
선형 판별 분석은 클래스별 평균과 공통 공분산, 사전확률로 선형 분류 경계를 만드는 방법입니다. 정답 라벨을 이용해 클래스를 구분하는 낮은 차원의 표현도 만듭니다. PCA와는 목적이 다르고 QDA와는 공분산을 공유하는지에서 차이가 납니다.
초보자라면 라벨 사용 여부, 분류와 변환의 차이, 출력 차원 상한, solver의 지원 범위를 먼저 기억하세요. 그다음 데이터 분리와 공분산 추정, 실제 출력의 평가를 확인하면 LDA가 어떤 문제에 맞는지 판단하기 쉬워집니다.
