Categories: R

R에서 SVM(서포트 벡터 머신) (svm())

안녕하세요! R을 이용해서 데이터 분석하는 재미에 푹 빠져계신가요? 저도 그래요! 요즘 머신러닝 기법 중에서 강력한 성능으로 인기를 끌고 있는 SVM, 즉 서포트 벡터 머신에 대해 알아보고 싶어서 좀 공부해봤어요. R에서 svm() 함수를 활용하는 방법을 함께 익혀보면 좋을 것 같아서 이렇게 글을 쓰게 됐어요. SVM이 뭔지, 어떻게 작동하는지 궁금하시죠?

R에서 svm() 함수는 어떻게 사용하는지, 모델 성능은 어떻게 평가하는지, 또 실제 데이터에는 어떻게 적용하는지까지 차근차근 알려드릴게요. 걱정 마세요! 어렵지 않아요. 저와 함께라면 SVM 정복도 문제없답니다! 같이 시작해 볼까요?

 

 

SVM 이해하기

서포트 벡터 머신(Support Vector Machine, SVM)?! 이름만 들어도 왠지 복잡하고 어려울 것 같죠? 하지만 걱정 마세요! 차근차근 알아가다 보면 SVM의 매력에 푹 빠지게 될 거예요! ^^ SVM은 기본적으로 분류와 회귀 분석에 사용되는 강력한 머신러닝 알고리즘이랍니다. 특히 고차원 데이터에서도 뛰어난 성능을 보여주는 것으로 유명해요. 마치 마법 같죠?!

SVM의 핵심 아이디어: 최적의 초평면

SVM의 핵심 아이디어는 ‘최적의 초평면‘을 찾는 데 있어요. 초평면이 뭐냐고요? 쉽게 말해서, 데이터를 가장 잘 나누는 경계선이라고 생각하면 돼요. 2차원 공간에서는 직선, 3차원 공간에서는 평면, 그리고 그 이상의 차원에서는 초평면이라고 부른답니다.

마진(Margin)

자, 이제 조금 더 자세히 들어가 볼까요? SVM은 데이터 포인트들을 두 개의 그룹으로 나누는 최적의 초평면을 찾는데, 이때 ‘마진(margin)‘이라는 개념이 등장해요. 마진은 초평면과 가장 가까운 데이터 포인트 사이의 거리인데, SVM은 이 마진을 최대화하는 초평면을 찾으려고 노력한답니다. 마진이 크면 클수록 두 그룹 사이의 경계가 더욱 명확해지고, 새로운 데이터에 대한 예측 정확도도 높아지기 때문이죠! 마치 넓은 강을 사이에 두고 두 마을이 나뉘어 있는 것과 같은 이치예요. 강폭이 넓을수록 두 마을이 확실하게 구분되는 것처럼 말이죠!

커널 트릭(Kernel Trick)

하지만 세상일이 항상 쉽지만은 않죠? ^^; 데이터가 항상 선형적으로 완벽하게 분리되는 것은 아니에요. 이럴 때 SVM은 ‘커널 트릭(Kernel Trick)‘이라는 비밀 병기를 사용한답니다. 커널 트릭은 데이터를 고차원 공간으로 매핑하여 선형적으로 분리할 수 있도록 변환하는 기술이에요. 2차원 평면에서는 나눌 수 없던 데이터도 3차원 공간에서는 칼로 무 자르듯 깔끔하게 나눌 수 있게 되는 거죠! 정말 놀랍지 않나요?! 대표적인 커널 함수로는 Linear, Polynomial, Radial Basis Function (RBF), Sigmoid 등이 있어요. 각 커널 함수는 데이터의 특성에 따라 다른 결과를 보여주기 때문에 상황에 맞는 커널을 선택하는 것이 중요해요. 마치 요리에 따라 다른 칼을 사용하는 것과 같다고 할 수 있겠네요!

소프트 마진(Soft Margin)

SVM에는 ‘소프트 마진(Soft Margin)‘이라는 개념도 존재해요. 실제 데이터에서는 노이즈나 이상치 때문에 모든 데이터를 완벽하게 분류하는 것이 불가능하거나 오히려 과적합(overfitting)을 유발할 수 있어요. 이럴 때 소프트 마진은 일부 데이터가 마진을 침범하거나 잘못 분류되는 것을 허용하면서 일반화 성능을 높이는 역할을 한답니다. 마치 바둑에서 완벽한 수를 두는 것보다 전체적인 흐름을 읽는 것이 중요한 것처럼 말이죠! 소프트 마진은 ‘C’라는 매개변수를 통해 조절할 수 있는데, C 값이 클수록 마진 침범에 대한 페널티가 커지고, 작을수록 마진 침범을 더 많이 허용하게 된답니다. C 값을 적절히 조절하여 모델의 성능을 최적화하는 것이 중요해요!

SVM 회귀

SVM은 분류뿐만 아니라 회귀 분석에도 활용할 수 있어요. SVM 회귀는 주어진 데이터를 가장 잘 설명하는 함수를 찾는 것을 목표로 하는데, 이때 ‘엡실론(ε)‘이라는 개념이 사용된답니다. 엡실론은 함수와 데이터 포인트 사이의 허용 가능한 오차 범위를 의미해요. SVM 회귀는 엡실론 안에 최대한 많은 데이터 포인트를 포함하면서 동시에 함수의 복잡도를 최소화하는 것을 목표로 한답니다. 마치 옷을 만들 때 몸에 딱 맞으면서도 활동하기 편하게 만드는 것과 비슷하다고 할 수 있겠네요!

자, 이제 SVM의 기본적인 개념들을 살펴봤어요! 어때요? 처음에는 어렵게 느껴졌던 SVM이 조금은 친숙하게 느껴지나요? ^^ 다음에는 R에서 SVM을 구현하는 방법에 대해 알아볼 거예요. 기대해 주세요~!

 

svm() 함수 사용법

자, 이제 드디어 R에서 SVM 모델을 만들어내는 마법의 주문, `svm()` 함수를 깊이 있게 파헤쳐 볼 시간이에요! 마치 요리 레시피처럼, 어떤 재료들을 넣고 어떻게 조합해야 원하는 맛이 나는지 알아야 하잖아요? `svm()` 함수도 마찬가지랍니다. 어떤 옵션들을 어떻게 설정하느냐에 따라 모델의 성능이 천차만별로 달라질 수 있거든요! 그럼, 지금부터 `svm()` 함수의 세계로 떠나볼까요~?

`svm()` 함수는 `e1071` 패키지에 들어있어요. 그러니까 먼저 `library(e1071)`을 실행해서 패키지를 불러와야겠죠? 이 패키지는 SVM 뿐만 아니라 다른 머신러닝 알고리즘들도 제공하니까 아주 유용한 친구랍니다!

`svm()` 함수의 기본 형태

기본적인 `svm()` 함수의 형태는 다음과 같아요. 마치 마법 주문 같죠?

model <- svm(formula, data = data_frame, kernel = "radial", cost = 1, gamma = 1/ncol(data_frame), ...)

`svm()` 함수의 매개변수

자, 하나씩 뜯어볼게요!

  • `formula`: 모델을 만들 때 사용할 ‘공식’이에요. 예를 들어, y ~ x1 + x2 와 같이 종속 변수와 독립 변수를 지정해줘야 해요. 마치 요리 레시피에서 어떤 재료를 넣을지 정하는 것과 같아요! `y`는 예측하고 싶은 값이고, `x1`, `x2`는 예측에 사용할 변수들이랍니다.
  • `data = data_frame`: 데이터가 어디에 있는지 알려주는 부분이에요. `data_frame`에는 우리가 사용할 데이터가 담겨있어야 하죠. 냉장고에서 재료를 꺼내오는 것과 같다고 생각하면 돼요!
  • `kernel`: SVM의 핵심! 바로 커널 함수를 지정하는 부분이에요. 기본값은 radial인데, 이 외에도 linear, polynomial, sigmoid 등 다양한 종류가 있어요. 각 커널은 데이터를 다른 공간으로 매핑하는 역할을 해요. 마치 요리에 따라 다른 칼을 사용하는 것처럼, 데이터의 특성에 맞는 커널을 선택하는 것이 중요해요!
  • `cost`: 오분류에 대한 ‘벌칙’의 정도를 나타내는 값이에요. 값이 클수록 오분류를 엄격하게 다루겠다는 뜻이죠. 마치 숙제를 꼼꼼하게 검사하는 선생님처럼 말이에요! 너무 크면 과적합될 수 있고, 너무 작으면 제대로 학습이 안 될 수 있으니 적절한 값을 찾는 게 중요해요. 보통 0.1, 1, 10, 100처럼 10배씩 늘려가면서 테스트해 보는 경우가 많아요.
  • `gamma`: radial 커널에서 사용되는 매개변수예요. 데이터 포인트의 영향력 범위를 조절하는 역할을 해요. 값이 클수록 영향력 범위가 좁아지고, 작을수록 넓어진답니다. 마치 라디오 주파수를 맞추는 것처럼, 적절한 값을 찾아야 원하는 결과를 얻을 수 있어요! `gamma` 값도 `cost`처럼 여러 값을 시도해보면서 최적의 값을 찾아야 해요.
  • `…`: 이 부분에는 다른 추가적인 옵션들을 넣을 수 있어요. 예를 들어, scale = TRUE를 추가하면 데이터를 자동으로 스케일링해준답니다. 마치 요리하기 전에 재료들을 손질하는 것과 같아요!

`svm()` 함수 사용 예시

자, 그럼 실제 데이터를 사용해서 `svm()` 함수를 어떻게 사용하는지 예시를 한번 볼까요? iris 데이터셋을 사용해볼게요. iris 데이터셋은 붓꽃의 종류를 분류하는 데 사용되는 아주 유명한 데이터셋이에요!

library(e1071)
data(iris)

# 데이터를 훈련 데이터와 테스트 데이터로 나누기
index <- sample(1:nrow(iris), 0.7 * nrow(iris))
train_data <- iris[index, ]
test_data <- iris[-index, ]


# radial 커널 사용
model_radial <- svm(Species ~ ., data = train_data, kernel = "radial", cost = 1, gamma = 1/ncol(train_data))


# linear 커널 사용
model_linear <- svm(Species ~ ., data = train_data, kernel = "linear", cost = 1)


# polynomial 커널 사용 (degree = 3)
model_poly <- svm(Species ~ ., data = train_data, kernel = "polynomial", cost = 1, degree = 3)

위 코드에서는 iris 데이터를 7:3 비율로 훈련 데이터와 테스트 데이터로 나누고, radial, linear, polynomial 커널을 사용해서 각각 모델을 만들었어요. 커널에 따라 필요한 매개변수가 다르다는 것을 눈여겨보세요! polynomial 커널은 degree라는 추가적인 매개변수를 설정해 다항식의 차수를 지정할 수 있답니다.

`svm()` 함수를 사용하는 방법, 이제 감이 좀 잡히시나요? 처음에는 어려워 보일 수 있지만, 차근차근 하나씩 살펴보면 전혀 어렵지 않아요! 다음에는 이렇게 만든 모델의 성능을 어떻게 평가하는지 알아볼 거예요. 기대해주세요~! 😊

 

모델 성능 평가

휴~, 드디어 SVM 모델을 만들었어요! 그런데 이 모델, 정말 잘 만들어진 걸까요? 🤔 단순히 코드가 돌아간다고 끝이 아니죠! 마치 맛있는 케이크를 굽고 나서 맛을 봐야 하는 것처럼, 우리가 만든 SVM 모델도 꼼꼼하게 평가해야 해요. 자, 그럼 SVM 모델의 성능을 평가하는 다양한 방법들을 함께 알아볼까요?

정확도(Accuracy)

SVM 모델의 성능을 평가할 때 가장 흔하게 쓰이는 지표는 바로 정확도(Accuracy)예요. 정확도는 전체 데이터 중에서 모델이 정확하게 예측한 비율을 의미해요. 예를 들어, 100개의 데이터 중 90개를 정확히 예측했다면 정확도는 90%가 되는 거죠! 간단하고 직관적이라 많이 사용되지만, 데이터의 클래스 분포가 불균형할 때는 정확도만으로는 모델의 성능을 제대로 파악하기 어려울 수 있어요.😥

정밀도(Precision)와 재현율(Recall)

그래서 정밀도(Precision)재현율(Recall)이라는 지표도 함께 살펴봐야 해요. 정밀도는 모델이 Positive라고 예측한 것 중 실제로 Positive인 비율을 나타내고, 재현율은 실제 Positive인 것 중 모델이 Positive라고 예측한 비율을 나타내요. 정밀도와 재현율은 서로 trade-off 관계에 있는 경우가 많아요. 즉, 하나가 높아지면 다른 하나는 낮아지는 경향이 있죠. 🤔 예를 들어 스팸 메일 필터링에서 정밀도가 높다는 것은 스팸으로 분류된 메일 중 실제 스팸 메일의 비율이 높다는 것을 의미하고, 재현율이 높다는 것은 실제 스팸 메일 중 스팸으로 분류된 메일의 비율이 높다는 것을 의미해요. 상황에 따라 어떤 지표를 더 중요하게 생각해야 할지 달라지겠죠?

F1-score

이 두 지표를 조화롭게 평가하기 위해 F1-score라는 지표를 사용하기도 해요. F1-score는 정밀도와 재현율의 조화 평균으로, 두 지표 모두 높을 때 높은 값을 가져요. F1-score는 0부터 1까지의 값을 가지며, 1에 가까울수록 좋은 모델이라고 할 수 있어요. 계산 공식은 다음과 같아요: F1 = 2 * (정밀도 * 재현율) / (정밀도 + 재현율)

AUC(Area Under the ROC Curve)

또 다른 중요한 지표로는 AUC(Area Under the ROC Curve)가 있어요. ROC 곡선은 다양한 임계값에서의 True Positive Rate(민감도)와 False Positive Rate(1-특이도)를 나타내는 그래프예요. AUC는 이 ROC 곡선 아래의 면적을 의미하며, 0.5에서 1 사이의 값을 가져요. AUC가 1에 가까울수록 모델의 성능이 좋다고 평가할 수 있어요. 특히, 클래스 불균형 문제가 있는 데이터셋에서 유용하게 사용될 수 있답니다! 👍

혼동 행렬(Confusion Matrix)

이러한 지표들을 계산하기 위해서는 confusion matrix(혼동 행렬)을 이용하는 것이 좋아요. 혼동 행렬은 모델의 예측 결과를 실제 값과 비교하여 True Positive, True Negative, False Positive, False Negative의 개수를 표로 정리한 것이에요. 이를 통해 모델이 어떤 부분에서 잘 예측하고, 어떤 부분에서 오류를 발생시키는지 파악할 수 있죠!

R에서의 성능 평가

실제로 R에서 caret 패키지를 사용하면 confusionMatrix() 함수를 통해 혼동 행렬을 쉽게 구하고, 다양한 성능 지표들을 계산할 수 있어요. 예를 들어, predict() 함수를 사용하여 예측값을 얻고, confusionMatrix(예측값, 실제값)과 같이 사용하면 된답니다.

모델 개선

하지만 이러한 지표들은 단순히 숫자에 불과해요. 중요한 것은 이러한 숫자들을 통해 모델의 강점과 약점을 파악하고, 모델을 개선하는 방향을 찾는 것이에요. 모델의 파라미터를 조정하거나, 다른 종류의 커널 함수를 사용해 보는 것도 좋은 방법이죠. 💪

데이터의 특성과 분석 목적에 따라 적절한 평가 지표를 선택하고, 모델의 성능을 객관적으로 분석하는 것이 성공적인 머신러닝 모델 구축의 핵심이라고 할 수 있어요! 😄 다양한 지표들을 활용하여 여러분의 SVM 모델을 더욱 멋지게 만들어 보세요! ✨

 

실제 데이터 적용 예시

자, 이제 드디어! 배운 SVM 지식을 실제 데이터에 적용해 볼 시간이에요! 두근두근하지 않나요? ^^ 이론만으론 감이 잘 안 잡혔던 부분들이, 실제 데이터를 만져보면서 훨씬 명확해질 거예요. 마치 요리 레시피만 보다가 직접 재료를 다듬고 볶고 끓이는 것과 같은 이치랄까요?ㅎㅎ

Iris 데이터셋 소개

저희가 사용할 데이터는 바로 유명한 ‘붓꽃(Iris)’ 데이터셋입니다! 데이터 과학 분야에선 마치 ‘Hello World’처럼 친숙한 친구죠. 이 데이터셋은 붓꽃의 종류(setosa, versicolor, virginica) 세 가지를 꽃받침 길이(Sepal Length), 꽃받침 너비(Sepal Width), 꽃잎 길이(Petal Length), 꽃잎 너비(Petal Width)라는 네 가지 특징으로 분류하는 데이터입니다. 각 종마다 50개씩, 총 150개의 샘플 데이터로 이루어져 있어요. 데이터 분석의 기본기를 다지기에 아주 적합한 데이터셋이랍니다!

R에서 Iris 데이터셋 사용하기

R에서 iris 데이터셋은 기본적으로 내장되어 있어서 바로 사용할 수 있어요. 얼마나 편리한지 몰라요! 먼저 데이터를 살짝 엿볼까요? head(iris) 함수를 사용하면 데이터셋의 앞부분 몇 줄을 확인할 수 있답니다. 각 특징의 값들이 어떻게 분포되어 있는지, 종류별로 어떤 차이가 있는지 슬쩍 살펴보면 감을 잡는 데 도움이 될 거예요.

SVM 모델 생성

이제 본격적으로 SVM 모델을 만들어 볼게요! e1071 패키지의 svm() 함수를 사용하면 됩니다. 저희는 꽃받침과 꽃잎의 길이, 너비라는 네 가지 특징을 사용해서 붓꽃의 종류를 예측하는 모델을 만들어볼 거예요. svm(Species ~ ., data = iris)처럼 간단하게 함수를 호출하면 됩니다. `.`는 모든 특징을 사용한다는 의미예요. 참 쉽죠?

모델 성능 평가

모델을 만들었으면, 이제 얼마나 잘 작동하는지 확인해봐야겠죠? predict() 함수를 사용해서 예측값을 구하고, 실제 값과 비교해서 정확도를 계산해 볼게요. table() 함수를 사용해서 혼동 행렬(Confusion Matrix)을 만들면, 어떤 종류를 잘 분류하고 어떤 종류를 헷갈려 하는지 자세히 알 수 있답니다. 예를 들어 setosa는 거의 완벽하게 분류하지만, versicolor와 virginica는 종종 헷갈리는 경우가 있을 수 있어요. 이 혼동 행렬을 통해 모델의 강점과 약점을 파악할 수 있죠!

모델 성능 향상 팁

자, 여기서 잠깐! 모델의 성능을 더욱 높이기 위한 꿀팁 하나 알려드릴게요! 바로 커널 트릭입니다! SVM은 다양한 커널 함수를 사용해서 데이터를 고차원 공간으로 매핑하여 선형 분류가 가능하도록 만들 수 있어요. svm() 함수에서 kernel 매개변수를 조정해서 다양한 커널 (linear, polynomial, radial, sigmoid)을 적용해 보세요. 어떤 커널이 우리 데이터에 가장 적합한지 직접 실험해보는 것이 중요해요! 데이터의 특성에 따라 최적의 커널이 달라진답니다. 마치 요리할 때 재료에 따라 다른 양념을 쓰는 것과 같아요! 각 커널의 장단점을 이해하고, 데이터에 맞춰 적절히 선택하는 것이 모델 성능 향상의 핵심이라고 할 수 있어요!

또 다른 꿀팁! costgamma 매개변수도 꼭! 기억해주세요. cost는 오분류에 대한 페널티를 조절하는 매개변수이고, gamma는 커널 함수의 영향 범위를 조절하는 매개변수예요. 이 두 매개변수를 조정하면서 모델의 성능 변화를 관찰해 보세요. tune() 함수를 사용하면 최적의 costgamma 값을 자동으로 찾아준답니다! 정말 편리하죠? 이처럼 매개변수를 조정하는 과정을 모델 튜닝이라고 하는데, 마치 악기를 조율하듯이 모델을 세밀하게 조정해서 최상의 성능을 끌어내는 과정이라고 할 수 있어요.

다른 데이터셋 활용 및 실제 서비스 적용

자, 이제 Iris 데이터셋을 넘어, 다른 데이터에도 적용해볼까요? 다양한 데이터셋을 활용해서 실력을 갈고닦는 것이 중요해요. UCI Machine Learning Repository (https://archive.ics.uci.edu/ml/index.php) 에서는 다양한 종류의 데이터셋을 무료로 다운로드 받을 수 있답니다! 분류 문제뿐만 아니라 회귀 문제에도 SVM을 적용해 볼 수 있어요. 데이터 전처리, 특징 선택, 모델 튜닝 등 다양한 기법들을 활용해서 최고의 모델을 만들어 보는 거예요! 실패를 두려워하지 말고, 끊임없이 도전하고 배우는 자세가 중요해요. 마치 게임처럼, 레벨업을 하면서 점점 더 강력한 모델을 만들 수 있을 거예요! 화이팅!

더 나아가, SVM 모델을 실제 서비스에 적용하는 것도 생각해 볼 수 있겠죠? 예를 들어, 스팸 메일 분류, 이미지 인식, 의료 진단 등 다양한 분야에서 SVM이 활용되고 있답니다! 데이터 분석은 단순히 이론적인 지식을 쌓는 것에 그치는 것이 아니라, 실제 세상의 문제를 해결하고 더 나은 세상을 만드는 데 기여할 수 있다는 점에서 정말 매력적인 분야인 것 같아요! 데이터 분석의 세계는 무궁무진하답니다! 끊임없이 배우고 성장하면서, 데이터 과학자로서의 꿈을 펼쳐나가 보세요! 응원할게요!

 

자, 이렇게 R에서 SVM을 활용하는 방법에 대해 같이 알아봤어요! 어때요, 생각보다 어렵지 않았죠? 처음에는 조금 낯설 수도 있지만, 몇 번 연습하다 보면 금방 익숙해질 거예요. SVM강력한 분류 모델 중 하나이니, 여러분의 데이터 분석에 날개를 달아줄 수 있을 거라 믿어요. 다양한 파라미터를 조정하면서 최적의 모델을 찾는 재미도 쏠쏠하답니다. 혹시 궁금한 점이나 더 알아보고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요. 함께 더 깊이 있게 공부해 나가면 좋겠어요! 다음 포스팅에서는 더욱 흥미로운 주제로 찾아올게요. 기대해 주세요!

 

Itlearner

Share
Published by
Itlearner

Recent Posts

R에서 워드 클라우드 만들기 (wordcloud 패키지 활용)

안녕하세요! 데이터 시각화, 생각만 해도 뭔가 멋있지 않나요? 오늘은 R을 이용해서 멋진 워드 클라우드를 만드는…

5시간 ago

R에서 텍스트 데이터를 다루는 방법 (tm, tidytext 패키지 활용)

안녕하세요! 데이터 분석, 특히 텍스트 분석에 관심 있는 분들 환영해요! 요즘 텍스트 데이터 분석이 정말…

10시간 ago

R에서 PCA(주성분 분석) (prcomp())

안녕하세요! 데이터 분석의 세계에 오신 여러분 환영해요! 😄 오늘 우리 같이 재밌는 분석 기법을 하나…

14시간 ago

R에서 k-means 군집 분석 (kmeans())

안녕하세요! 데이터 분석의 세계에 오신 걸 환영해요! 오늘 함께 탐험해 볼 주제는 바로 k-means 군집…

19시간 ago

R에서 랜덤 포레스트 (randomForest())

안녕하세요, 여러분! 👋 오늘 함께 알아볼 주제는 바로 랜덤 포레스트(randomForest)에요! 혹시 나무를 보면서 숲을 못…

1일 ago

R에서 의사결정 나무 (rpart(), rpart.plot())

안녕하세요! 오늘은 데이터 분석에서 핫한 알고리즘 중 하나, 바로 의사결정 나무에 대해 같이 알아보는 시간을…

1일 ago