본문 바로가기

머신러닝/분석 base

SVM: programming

1. import packages

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

 

2. 데이터 불러오기

df = pd.read_csv(r"train.csv")  
test=pd.read_csv(r"test.csv")   

 

3. SVM model 생성

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# feature 와 target 분리

# target은 우리의 target 데이터인 "price_range"
yt=np.array(df['price_range']) #array 형태

# feature는 target 데이터를 뺀 나머지 데이터 전부
xt=df.drop(['price_range'], axis=1) 
xt=np.array(xt) #array 형태로 바꿔줌
# scaler : 각 Feature의 값을 일정한 범위 또는 규칙에 따르게 하기 위해서 스케일링을 사용
# MinMaxScaler : 최소 0 ~ 최대 1 사이로 feature의 값을 변환

scaler = MinMaxScaler()
xt=scaler.fit_transform(xt)
# train test 데이터 split
# 훈련용 데이터인 'train.csv' 의 데이터 값들을 다시 훈련과 검증용 데이터로 split 해야함
# x_train :  data 값
# y_train : target 값 (price_range)
# x_valid : data 값
# y_valid : target 값 (price_range)
# 훈련용 : 검증용 데이터를 8 : 2 로 분리  --> test_size = 0.2

xtrain,xtest,ytrain,ytest=train_test_split(xt, yt, test_size=0.2, random_state=42)

 

3.1 linear kernel SVC를 이용하여 적절한 C값 찾기

  • C 는 SVM의 기본 파라미터

  • 슬랙 변수의 가중치

  • 분류를 하는데 오차를 허용하는 범위인 마진 값을 조정함

  • C 값이 커질수록 오분류 허용 X

  • C 값이 작아지면 margin 폭 좁아짐.

  • C 값이 커지면 margin 폭 넓어짐.

# Linear 커널 SVC

scores = []
for thisC in [*range(1,50)]:
    svc = SVC(kernel='linear', C = thisC)  #linear kernel SVC의 파라미터 : kernel , C
                                            #from sklearn.svm import SVC으로 svc를 불러온 상태임
    model = svc.fit(xtrain, ytrain)  #svc에 x,y train을 fit 시킨 모델 생성
    scoreTrain = model.score(xtrain, ytrain) #svc 안에는 score 함수도 있음~~
    scoreTest = model.score(xtest,ytest)
    print("Linear SVM : C :{}, training score:{:2f}, test score:{:2f}".format(thisC, scoreTrain, scoreTest))
scores.append([scoreTrain, scoreTest])

3-2. rbf kernel 사용한 SVC를 통해 적절한 C 와 gamma 찾기 

  • 가우시안 함수의 표준편차와 관련있는 매개변수

  • gamma는 RBF 커널에서 하나의 데이터 샘플이 영향력을 행사하는 거리를 나타냄

  • gamma가 크면 데이터 포인터들이 영향력을 행사하는 거리가 짧아짐

  • gamma가 작으면 영향력을 행사하는 거리가 커짐

  • gamma가 커질수록 곡률 높음

# RBF 커널 SVM
for thisGamma in [.1, .25, .5, 1] :  # gamma 값을 [ 0.1 , 0.25 , 0.5 , 1 ]로 다양하게 지정
    for thisC in [ 1, 5, 10, 20, 40, 100] : # C 값을 [ 1, 5, 10, 20, 40, 100 ] 으로 다양하게 지정
        model2 = SVC(kernel="rbf", C=thisC, gamma = thisGamma).fit(xtrain, ytrain) #linear kernel SVC의 파라미터 : kernel , C , gamma
        m2train = model2.score(xtrain, ytrain)
        m2test = model2.score(xtest, ytest)
        print("RBF SVM : C:{}, gamma:{},training score:{:2f},test score:{:2f} \n".format(thisC, thisGamma, m2train, m2test))

 

3.3 GridSearchCV 사용

최적의 파라미터와 그 때의 score 값을 한 번에 찾아줌

from sklearn.model_selection import GridSearchCV
param={'C':[1,5,10,20,40,100],
      'gamma':[.1, .25, .5, 1]}
GS=GridSearchCV(SVC(kernel='rbf'),param, cv=5)
GS.fit(xtrain, ytrain)
print(GS.best_params_)
print(GS.best_score_)

{'C': 5, 'gamma': 0.1}

0.90375

 

4. 예측

model=SVC(kernel='rbf', C=5, gamma=.1).fit(xtrain, ytrain)
scoretest = model.score(xtest, ytest)

0.9075

'머신러닝 > 분석 base' 카테고리의 다른 글

Resnet  (0) 2021.02.23
Boosting & Adaboost  (0) 2021.02.09
Bagging & Random Forest : Programming  (0) 2021.02.09
Bagging & Random Forest  (0) 2021.02.09
SVM (Support Vector Machine)  (0) 2021.02.08