본문 바로가기
네이버클라우드/AI

AI 6일차 (2023-05-15) 인공지능 기초 _머신러닝 - Linear 모델과 SVM 모델 : SVC, SVR

by prometedor 2023. 5. 15.

Linear 모델

Perceptron

ㄴ 가장 간단한 형태의 인공 신경망 모델
ㄴ 이진 분류 문제를 해결하기 위해 사용
ㄴ 입력 데이터에 대해 가중치를 적용하고, 이를 활성화 함수를 통과시켜 예측을 수행
ㄴ 예측 결과를 기반으로 모델의 가중치를 업데이트하여 오분류를 최소화하도록 학습


Logistic Regression (분류 모델)

분류 문제를 해결하기 위한 선형 모델
ㄴ 입력 데이터에 대해 선형 가중치를 적용한 후, 시그모이드(sigmoid) 함수를 통과시켜 확률값을 출력함
ㄴ 이진 분류 뿐만 아니라 다중 클래스 분류에도 적용할 수 있음
로그 손실 함수를 최소화하는 방식으로 학습되며, 경사 하강법 등의 최적화 알고리즘을 사용함


Linear Regression (회귀 모델)

회귀 문제를 해결하기 위한 선형 모델
ㄴ 입력 데이터에 대해 선형 가중치를 적용하여 연속적인 출력 값을 예측함
ㄴ 예측 값과 실제 값의 차이를 최소화하는 방식으로 학습되며, 평균 제곱 오차를 최소화하는 최소자승법을 사용함
ㄴ 다양한 변형 모델이 존재하며, 예측 변수와 타깃 변수 간의 선형 관계를 가정함

 

SVM 모델

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyU2w7%2FbtqNe5n7NPN%2F0KrOvyF6RM8jYOTHwOYIv0%2Fimg.png

 

ㄴ 서포트 벡터 머신(SVM : Support Vector Machine)은 여백(Margin)을 최대화하는 지도 학습 알고리즘
여백(Margin) : 주어진 데이터가 오류를 발생시키지 않고 움직일 수 있는 최대 공간
분류를 위한 서포트 벡터 머신 : SVC
회귀를 위한 서포트 벡터 머신 : SVR

 

SVM 을 이용한 XOR 문제 해결 

ㄴ 다층 퍼셉트론(Multi-Layer Perceptron, MLP) 과 같으므로 SVM 으로도 해결 가능

 

ml01_xor_svm.py

import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.svm import SVC, SVR, LinearSVC, LinearSVR    # C = cassifier(분류), R = Regresser(회귀)
from sklearn.metrics import accuracy_score

# 1. 데이터
x_data = [[0, 0], [0, 1], [1, 0], [1, 1]]
y_data = [0, 1, 1, 0]

# 2. 모델
model = SVC()   # MLP(multi layer perceptron) 와 같음

# 3. 훈련
model.fit(x_data, y_data)	# 컴파일 안 해도 됨

# 4. 평가, 예측
result = model.score(x_data, y_data)
y_predict = model.predict(x_data)
acc = accuracy_score(y_data, y_predict)

print('모델의 score : ', result)
print(x_data, '의 예측 결과 :', y_predict)
print('acc : ', acc)

# 모델의 score :  1.0
# [[0, 0], [0, 1], [1, 0], [1, 1]] 의 예측 결과 : [0 1 1 0]
# acc :  1.0

 

 

 

SVC

ㄴ Support Vector Classifier

ㄴ 주어진 데이터를 분류하는 결정 경계를 찾는 알고리즘을 분류 작업에 적용한 것

이진 분류와 다중 클래스 분류 모두에 사용될 수 있음

ㄴ 주어진 훈련 데이터를 바탕으로 서포트 벡터를 찾고, 이를 기반으로 결정 경계를 생성

ㄴ 결정 경계는 클래스 간의 간격을 최대화하며, 이상치에 대한 영향을 최소화하도록 학습됨

ㄴ 학습 데이터의 특성을 잘 파악하여 일반화된 분류 모델을 만들 수 있음

 

 

ml02_svm_iris.py

# [실습] svm 모델과 나의 tf keras 모델 성능 비교하기
# 1. iris
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 1. 데이터
datasets = load_iris()  # 다중분류
x = datasets['data']
y = datasets.target

# print(x.shape, y.shape)     # (150, 4) (150,)
# print('y의 라벨 값 :', np.unique(y))    # y의 라벨 값 : [0 1 2]
x_train, x_test, y_train, y_test = train_test_split(
    x, y, train_size=0.7, random_state=100, shuffle=True
)

# 2. 모델
model = SVC()
# model = LinearSVC()

# 3. 훈련
model.fit(x_train, y_train)


# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)

# SVC() 결과 acc :  0.9777777777777777
# LinearSVC() 결과 acc :  0.9777777777777777
# my tf keras 모델 결과 acc :  1.0

 

ml02_svm_cancer.py

# [실습] svm 모델과 나의 tf keras 모델 성능 비교하기
# 1. iris
# 2. cancer
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

import tensorflow as tf
tf.random.set_seed(77)  # weight 의 난수값 조정

# 1. 데이터
datasets = load_breast_cancer()  # 이진분류
x = datasets['data']
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, train_size=0.7, random_state=100, shuffle=True
)

# 2. 모델
model = SVC()
# model = LinearSVC()

# 3. 훈련
model.fit(x_train, y_train)


# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)

# SVC() 결과 acc :  0.9064327485380117
# LinearSVC() 결과 acc :  0.9122807017543859
# my 결과 acc :  0.9298245614035088

 

ml02_svm_wine.py

# [실습] svm 모델과 나의 tf keras 모델 성능 비교하기
# 3. wine
import numpy as np
from sklearn.svm import SVC, LinearSVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

import tensorflow as tf
tf.random.set_seed(77)  # weight 의 난수값 조정

# 1. 데이터
datasets = load_wine()  # 다중분류
x = datasets['data']
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, train_size=0.7, random_state=100, shuffle=True
)

# 2. 모델
model = SVC()
# model = LinearSVC()

# 3. 훈련
model.fit(x_train, y_train)


# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 acc : ', result)

# SVC() 결과 acc :  0.5555555555555556
# LinearSVC() 결과 acc :  0.7222222222222222
# my 결과 acc :  0.9259259104728699

 

 

SVR

ㄴ Support Vector Regression

ㄴ 회귀 문제를 해결하기 위한 알고리즘

ㄴ 주어진 데이터로부터 회귀 모델을 학습하여 예측을 수행하는데, SVM 알고리즘의 기본 원리를 사용함

ㄴ 데이터 포인트들과 최대 마진을 가지는 회귀 선 또는 평면을 찾는 것을 목표로 함

ㄴ 이때, 마진 안에 있는 데이터 포인트들은 모델에 의해 잘 예측되어야 하며, 마진 밖에 있는 데이터 포인트들은 마진 내에 위치할 수 있는 한 가장 잘 예측되도록 제약을 가함

 

 

ml02_svm_california.py

# [실습] svm 모델과 나의 tf keras 모델 성능 비교하기
# 4. california (SVR, LinearSVR)
import numpy as np
from sklearn.svm import SVR, LinearSVR
from sklearn.metrics import accuracy_score
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split

import tensorflow as tf
tf.random.set_seed(77)  # weight 의 난수값 조정

# 1. 데이터
datasets = fetch_california_housing()   # 회귀분석
x = datasets['data']
y = datasets.target

x_train, x_test, y_train, y_test = train_test_split(
    x, y, train_size=0.7, random_state=100, shuffle=True
)

# 2. 모델
# model = SVR()
model = LinearSVR()

# 3. 훈련
model.fit(x_train, y_train)


# 4. 평가, 예측
result = model.score(x_test, y_test)
print('결과 r2 : ', result)


# SVR() 결과 r2 :  -0.01663695941103427
# 결과 r2 :  0.06830124384888547
# my tf keras 모델 r2스코어 :  0.5346585367965508