파이썬·머신러닝

[파이썬/머신러닝] SVM(Support Vector Machine) 분류 - 이론

2026-09-30

SVM 분류 이론의 결정 경계와 마진, 서포트 벡터를 설명하는 정보카드
SVM은 두 집단에서 가장 가까운 관측값을 기준으로 안정적인 경계를 찾습니다.

SVM 분류를 한 문장으로 이해하기

SVM은 Support Vector Machine의 약자로, 서로 다른 범주에 속한 자료를 가장 안정적으로 가르는 경계를 찾는 지도학습 분류 방법입니다. 예를 들어 두 종류의 꽃, 정상과 이상 거래, 스팸과 일반 메일처럼 정답 레이블이 붙은 관측값이 있을 때 모델은 각 범주가 어느 쪽에 놓이는지 학습합니다. 단순히 두 집단 사이에 선 하나를 긋는 데서 끝나지 않는다는 점이 핵심입니다. SVM은 여러 후보 경계 가운데 양쪽 집단과의 여유가 가장 넓은 경계를 선호합니다. 이 여유를 마진이라고 부르며, 마진이 넓으면 학습에 없던 새 자료가 들어왔을 때 작은 흔들림에 덜 민감한 분류기가 될 가능성이 큽니다. 그래서 SVM은 데이터 차원이 비교적 높거나 변수 수가 많은 문제에서도 오랫동안 중요한 기준 모델로 쓰였습니다.

파이썬으로 SVM을 사용할 때는 보통 scikit-learn의 SVC 또는 LinearSVC를 떠올리지만, 라이브러리 호출보다 먼저 이론의 질문을 잡아 두는 편이 좋습니다. 어떤 경계가 좋은 경계인가, 어떤 관측값이 그 경계를 실제로 결정하는가, 선형으로 나뉘지 않는 경우에는 무엇을 바꾸는가를 이해하면 하이퍼파라미터 선택도 훨씬 덜 막막해집니다. SVM은 모든 점을 같은 비중으로 설명하려 하기보다 경계 근처의 중요한 점에 집중합니다. 따라서 산점도에서 멀리 떨어진 다수의 점보다 양쪽 진영에서 가장 가까이 맞서는 몇 개의 점이 모델의 모양을 크게 좌우할 수 있습니다. 이 성질은 데이터 정제와 이상치 점검이 왜 필요한지도 자연스럽게 설명해 줍니다.

결정 경계와 마진은 어떻게 정해질까

이진 분류를 먼저 생각해 보겠습니다. 입력 벡터를 x, 가중치를 w, 절편을 b라고 하면 선형 분류의 경계는 w와 x의 내적에 b를 더한 값이 0이 되는 초평면으로 표현할 수 있습니다. 두 변수에서는 직선, 세 변수에서는 평면, 더 많은 변수에서는 사람이 눈으로 보기 어려운 고차원 초평면이 됩니다. SVM은 이 경계의 양옆에 평행한 두 보조 경계를 놓고, 두 범주가 각각 자기 쪽 보조 경계 바깥에 위치하도록 만듭니다. 가운데 경계와 보조 경계 사이의 거리가 마진입니다. 학습 과정은 제약 조건을 만족하면서 이 거리를 최대화하는 w와 b를 찾는 최적화 문제로 바뀝니다. 경계와 가까운 사례가 조금만 바뀌어도 결과가 달라질 수 있으므로, 이 사례들을 따로 살피는 습관이 중요합니다.

마진 최대화는 보기 좋은 선을 고르는 장식이 아닙니다. 훈련 데이터에만 꼭 맞춘 경계는 새 관측값에서 쉽게 뒤집힐 수 있는데, 넓은 완충 구역을 가진 경계는 측정 오차나 작은 노이즈를 견디기 쉽습니다. 다만 현실 데이터에는 완벽히 분리되지 않는 사례가 많습니다. 이때 소프트 마진 SVM은 일부 오분류 또는 마진 침범을 허용하고, 그 대가를 벌점으로 계산합니다. C 값은 경계를 단단히 맞추려는 정도를 조절합니다. C가 지나치게 크면 훈련 오류를 줄이는 데 집착해 과적합 위험이 커지고, 너무 작으면 많은 위반을 허용해 경계가 지나치게 느슨해질 수 있습니다. 검증 세트나 교차 검증으로 C를 비교하는 이유는 이 균형을 데이터에 맞춰 확인하기 위해서입니다.

학습 데이터와 마진 최대화, 새 데이터 분류를 연결한 SVM 정보카드
학습 단계의 목표는 훈련 자료를 외우는 것이 아니라 일반화 가능한 경계를 고르는 일입니다.

서포트 벡터가 모델의 중심이 되는 이유

서포트 벡터는 최종 결정 경계에 가장 가까이 놓인 훈련 관측값입니다. 하드 마진 상황에서는 보조 경계 위에 닿는 점들이 대표적이고, 소프트 마진 상황에서는 경계를 침범했거나 마진 안으로 들어온 점도 포함될 수 있습니다. 이 점들은 이름 그대로 경계를 떠받치는 역할을 합니다. 경계에서 멀리 떨어진 점을 조금 움직여도 경계가 거의 변하지 않을 수 있지만, 서포트 벡터의 위치나 레이블을 바꾸면 최적 경계가 의미 있게 이동할 수 있습니다. SVM이 예측할 때 모든 훈련 샘플이 똑같이 중요한 것은 아니라는 설명이 여기서 나옵니다. 학습 뒤 support_vectors_ 같은 속성을 확인해 어떤 사례가 선택되었는지 살펴보면 데이터 품질 문제나 경계가 애매한 구간을 발견하는 데 도움이 됩니다.

서포트 벡터의 수는 모델 복잡도를 해석하는 단서가 되기도 합니다. 비슷한 규모의 데이터에서 서포트 벡터가 유난히 많다면 두 범주가 촘촘히 섞였거나 설정한 C와 gamma가 경계를 지나치게 복잡하게 만들었을 가능성을 점검할 수 있습니다. 반대로 너무 적은 점만 경계를 결정한다면 특정 표본에 과도하게 의존하지는 않는지도 확인해야 합니다. 클래스 불균형이 있는 문제에서는 소수 범주의 중요한 사례가 묻히기 쉽습니다. 이 경우 class_weight를 조정하거나 적절한 평가지표를 함께 사용해야 합니다. 정확도 하나만 보면 다수 범주만 잘 맞혀도 좋아 보일 수 있으므로, 정밀도·재현율·F1 점수와 혼동 행렬을 나란히 보는 편이 안전합니다.

선형 분리가 어려울 때 커널을 쓰는 방법

원형으로 둘러싸인 두 집단처럼 원래 공간에서 직선 하나로 분리하기 어려운 데이터도 있습니다. 이 문제를 억지로 복잡한 곡선으로 그리지 않고 해결하는 발상이 커널 트릭입니다. 커널 함수는 입력을 더 높은 차원의 특징 공간으로 옮긴 것과 같은 내적 값을 계산해 줍니다. 변환된 공간에서는 원래 복잡했던 모양이 평면 하나로 분리될 수 있습니다. 대표적으로 RBF 커널은 가까운 관측값 사이의 유사도를 부드럽게 반영해 비선형 경계를 만들고, 다항 커널은 변수의 조합 효과를 담는 데 쓰일 수 있습니다. 중요한 점은 커널이 마법처럼 성능을 보장하는 버튼이 아니라는 사실입니다. 데이터의 구조와 표본 수, 변수 스케일, 계산 비용을 함께 고려해야 적절한 선택이 됩니다.

RBF 커널에서 gamma는 한 관측값의 영향 범위를 조절합니다. gamma가 크면 각 점의 영향이 매우 좁아져 경계가 세세하게 굽을 수 있고, 작은 잡음까지 따라가면 일반화 성능이 나빠질 수 있습니다. gamma가 작으면 넓은 범위를 부드럽게 보므로 경계가 단순해지지만, 실제 패턴을 충분히 담지 못할 수도 있습니다. C와 gamma는 서로 영향을 주기 때문에 한 값만 따로 고정한 채 판단하기보다 그리드 탐색이나 랜덤 탐색으로 조합을 검토하는 방식이 흔합니다. 커널 SVM은 샘플 수가 크게 늘면 학습 시간이 부담될 수 있습니다. 매우 큰 데이터셋에서는 선형 SVM, 확률적 방법, 트리 기반 모델과의 비교도 현실적인 선택지가 됩니다.

비선형 데이터를 커널 함수로 변환해 분리하는 SVM 정보카드
커널은 원래 좌표에서 복잡해 보이는 문제를 다른 관점에서 단순하게 다루도록 돕습니다.

파이썬 실습 전 반드시 챙길 전처리

SVM은 변수의 크기에 민감한 모델입니다. 한 열이 수천 단위의 금액이고 다른 열이 0에서 1 사이의 비율이라면, 거리와 내적 계산에서 큰 단위의 열이 과도한 영향을 줄 수 있습니다. 따라서 StandardScaler로 평균을 0, 표준편차를 1에 가깝게 맞추는 표준화가 기본 출발점이 됩니다. 특히 RBF나 다항 커널을 사용할 때 스케일링을 생략하면 gamma의 의미가 달라져 튜닝 결과를 믿기 어려워질 수 있습니다. 데이터 누수를 막기 위해서는 전체 자료에 먼저 스케일러를 맞춘 뒤 분할하면 안 됩니다. 훈련 세트에서만 fit하고 검증·테스트 세트에는 transform만 적용해야 합니다. Pipeline을 사용하면 이 순서를 코드 구조 안에 묶을 수 있어 실수가 줄어듭니다.

실습에서는 train_test_split으로 홀드아웃 세트를 만들고, StratifiedKFold로 각 클래스 비율을 유지한 교차 검증을 수행하는 구성이 실용적입니다. 결측값, 문자열 범주, 중복 행, 잘못된 레이블은 SVM에 넣기 전에 처리해야 합니다. 범주형 변수는 적절한 인코딩이 필요하며, 고차원 희소 행렬에서는 선형 모델이 더 효율적일 수 있습니다. 확률이 꼭 필요한 업무라면 SVC의 probability 옵션이 제공하는 값이 추가 교정 절차를 거친다는 점과 계산 비용을 이해해야 합니다. 모델 선택은 최고 점수 하나를 찾는 경주가 아니라, 데이터가 바뀌었을 때도 설명 가능하고 안정적으로 동작하는 설정을 찾는 과정이라는 관점을 유지하는 것이 좋습니다.

SVM 결과를 해석하고 적용하는 체크리스트

완성한 SVM은 테스트 점수만 보고 끝내지 말고 오류의 내용을 읽어야 합니다. 어떤 클래스가 다른 클래스로 자주 잘못 분류되는지, 오분류 사례가 특정 값의 범위에 몰리는지, 경계 근처 사례에 공통된 특징이 있는지를 확인해 보세요. 이 분석은 단순한 파라미터 반복보다 더 좋은 변수를 만들거나 레이블 기준을 바로잡는 실마리를 주곤 합니다. 선형 SVM이라면 계수의 방향과 크기를 통해 변수 영향의 단서를 얻을 수 있지만, 상관된 변수나 표준화 여부에 따라 해석이 달라질 수 있습니다. 비선형 커널에서는 전역 계수를 직접 읽기 어렵기 때문에 부분 의존 분석, 오류 사례 검토, 비교 모델 같은 보조 방법을 활용하는 편이 낫습니다.

정리하면 SVM 분류의 흐름은 명확합니다. 레이블이 붙은 데이터를 준비하고, 스케일을 맞추며, 넓은 마진을 만드는 경계를 학습한 뒤, 서포트 벡터와 검증 성능을 함께 살핍니다. 선형 경계로 부족할 때만 커널을 검토하고, C와 gamma는 교차 검증으로 조절합니다. 처음에는 표준화한 데이터에 선형 SVM을 기준선으로 놓고, 그 결과가 부족할 때 RBF 커널을 추가하는 순서가 이해와 운영 모두에 편합니다. 이렇게 하면 복잡한 모델을 먼저 선택했을 때 생기는 과적합과 긴 학습 시간을 피하면서도, 문제 구조에 맞는 분류기를 차분히 찾을 수 있습니다.

간단한 코드 구조와 자주 생기는 오해

기본적인 구현은 생각보다 짧습니다. 특성 행렬 X와 정답 y를 준비한 뒤, StandardScaler와 SVC를 Pipeline으로 연결하고 fit을 호출하면 됩니다. 그러나 짧은 코드가 곧 단순한 의사결정을 뜻하지는 않습니다. kernel에 linear을 둘지 rbf를 둘지, C 후보를 어느 범위에서 탐색할지, 불균형 클래스에 가중치를 줄지, 평가 기준을 무엇으로 둘지는 문제의 비용 구조와 연결됩니다. 의료 선별처럼 놓치는 사례의 비용이 큰 문제는 재현율을 더 중요하게 볼 수 있고, 자동 차단처럼 잘못 차단하는 비용이 큰 문제는 정밀도를 우선할 수 있습니다. SVM이 출력한 클래스 라벨은 정해 둔 임계값과 학습 데이터의 분포에 영향을 받으므로, 배포 후 입력 분포가 달라지면 성능을 다시 점검해야 합니다. 실험 기록에는 데이터 버전, 분할 방법, 전처리, 파라미터, 점수와 함께 주요 오류 사례를 남겨 두는 편이 좋습니다.

흔한 오해 중 하나는 SVM이 항상 복잡한 커널을 써야 강력하다는 생각입니다. 실제로는 충분히 잘 정리된 텍스트 특성이나 고차원 희소 특징에서 선형 SVM이 빠르고 경쟁력 있는 기준선이 되는 경우가 많습니다. 또 다른 오해는 마진이 넓을수록 무조건 최선이라는 주장입니다. 소프트 마진에서는 분리 오류와 마진 폭의 균형을 다루므로, 검증 없이 넓은 경계만 고집할 수 없습니다. 마지막으로 표준화는 성능을 높이는 만능 처방이 아니라 거리 기반 계산의 조건을 공정하게 만드는 절차에 가깝습니다. 입력 열의 의미와 측정 단위를 확인하고, 훈련 단계에서 배운 변환만 운영 데이터에 적용해야 합니다. 이러한 원칙을 지키면 SVM은 단순한 예제 모델이 아니라, 새로운 분류 문제를 진단하는 탄탄한 출발점이 됩니다.

실무에서 SVM 실험을 설계하는 순서

SVM을 실제 업무 데이터에 적용할 때는 알고리즘을 고르는 일보다 문제를 측정 가능한 분류 과제로 바꾸는 일이 먼저입니다. 예를 들어 문의를 정상과 긴급으로 나누려면 긴급의 기준, 사람이 붙인 라벨의 근거, 판단을 보류할 사례를 문서로 정리해야 합니다. 같은 문장이라도 고객 등급이나 접수 시점에 따라 의미가 달라질 수 있으므로, 모델에 넣을 수 있는 정보와 넣어서는 안 되는 정보를 구분합니다. 그다음 한 행이 무엇을 뜻하는지와 예측 시점을 확정합니다. 과거 처리 결과가 특성에 섞이면 검증 점수는 좋아 보여도 운영에서는 재현되지 않습니다. 시간 순서가 있는 데이터라면 미래 데이터를 훈련에 사용하지 않도록 분할하고, 같은 고객이나 같은 문서에서 파생된 행이 훈련과 검증에 동시에 들어가지 않게 막아야 합니다. 이 준비는 SVM에만 해당하지 않지만, 거리와 경계에 민감한 SVM에서는 특히 큰 차이를 만듭니다.

첫 실험은 가능한 한 단순하고 재현 가능하게 구성합니다. 결측값 처리 규칙을 정하고, 수치형 열은 훈련 세트에서 계산한 평균과 표준편차로 변환하며, 범주형 열은 의미를 보존하는 방식으로 인코딩합니다. 텍스트라면 토큰화와 가중치 계산을 파이프라인 안에 묶어 검증 세트 정보가 새어 들어가지 않게 합니다. 이후 선형 SVM을 기준선으로 학습해 정확도만이 아니라 정밀도, 재현율, F1, 혼동 행렬을 함께 비교합니다. 클래스 비율이 크게 치우쳤다면 단순 정확도는 대부분 클래스를 맞히는 모델에도 높은 점수를 줄 수 있습니다. 이때 class_weight, 샘플링, 임계값 조정 중 무엇을 쓸지는 실제 오류 비용을 기준으로 결정합니다. 실험마다 난수 시드와 데이터 버전, 특성 목록, 분할 기준을 기록하면 나중에 성능 변화의 원인을 추적하기 쉬워집니다.

기준선의 오류를 읽은 뒤에야 C와 커널을 조정할 근거가 생깁니다. 훈련과 검증 성능이 모두 낮다면 표현력이 부족하거나 특성이 문제와 맞지 않을 수 있고, 훈련만 지나치게 좋다면 C가 너무 크거나 커널 경계가 데이터의 잡음까지 따라갔을 수 있습니다. RBF 커널을 시도할 경우에는 C와 gamma를 한 번에 촘촘히 탐색하기보다 넓은 범위에서 후보를 줄인 다음 교차 검증으로 좁히는 편이 계산 비용을 관리하기 좋습니다. 각 후보는 같은 분할에서 비교하고, 평균 점수뿐 아니라 분할별 편차도 확인합니다. 점수 차이가 작다면 더 단순하고 빠른 모델을 선택하는 것이 유지보수에 유리합니다. 특히 설명이 필요한 업무에서는 선형 모델의 계수와 오류 사례를 함께 제시할 수 있다는 장점이 커널 SVM의 작은 점수 우위를 넘어설 수 있습니다.

배포 전에는 새 데이터가 학습 데이터와 같은 형태로 들어오는지 점검하는 테스트를 둡니다. 열 순서, 단위, 결측값 표기, 범주 값의 철자가 달라져도 파이프라인이 안전하게 처리되는지 확인해야 합니다. 예측 결과를 곧바로 자동 처리에 연결한다면 확신이 낮은 사례를 사람 검토로 보내는 경로도 마련합니다. SVM의 결정 함수 값은 경계로부터의 상대적 거리이므로, 확률처럼 해석하려면 별도 보정과 검증이 필요합니다. 운영 후에는 전체 점수만 보지 말고 새로 들어온 라벨이 있는 표본으로 주요 집단별 오류와 입력 분포 변화를 주기적으로 비교합니다. 이러한 점검을 반복하면 SVM은 한 번 학습하고 끝나는 도구가 아니라, 데이터 품질과 업무 규칙의 변화를 드러내는 실용적인 분류 기준으로 활용할 수 있습니다.

마지막으로 모델 파일만 보관하지 말고, 학습에 사용한 전처리와 라벨 정의, 승인된 성능 기준을 함께 보관합니다. 재학습은 새 데이터가 충분히 쌓였다는 이유만으로 실행하기보다, 기존 모델과 같은 평가 절차에서 오류 비용을 줄이는지 확인한 뒤 결정합니다. 현업 담당자가 이해할 수 있는 오류 사례를 정기 보고에 포함하면 모델 점수와 실제 업무 경험 사이의 간극도 빨리 발견할 수 있습니다.