5. SVM


파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문

파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문 책과 강의를 바탕으로한 코드 리뷰 및 정리입니다. 자세한 내용은 책과 강의를 참고해주세요.


4. 머신러닝

4-5. SVM


책의 이론들은 상대적으로 많이 부실해 나중에 제가 따로 정리하도록 하고, SVM 실습 위주로 정리해보려 합니다.


사이트 를 보시면 scikit-learn에서 사용할 수 있는 분류기들의 종류와 각 분류기들이 어떤식으로 분류를 하는지에 대한 이미지를 확인할 수 있습니다.


SVM

간단히 설명하면 SVM(Support Vector Machine)으로 속도가 빠르며 높은 인식 성능을 발휘하는 분류방법입니다. 데이터를 분류하는 선(평면)을 찾는데 이때 각 데이터가 떨어진 거리를 가장 극대화 시키는 선을 찾는 방법입니다.

img

또한 선형이 아닌 데이터의 모형에서도 그 특징을 잘 구분할 수 있는데 차원을 확대한다는 아이디어를 쓴다는 것이 눈에 띄는 점입니다. 이후의 설명은 따로 정리하도록 하겠습니다.


SVM의 종류

scikit-learn에서 지원하는 SVM은 세가지 입니다.

  • SVC : C는 Classification. 표준적로 구현된 SVM
  • NuSVC : SVC와 오류처리 방법에서 차이가 있음.
  • LinearSVC : 선형 분류에 특화된 SVM. 선형 분류가 가능할 경우 계산이 빠르다.


실습

  • BMI sampe data를 생성하여 SVM분석 후 결과까지 확인
#BMI sample data 생성
import random

#BMI 계산 후 레이블 리턴
def calc_bmi(h,w):
    bmi=w/(h/100)**2
    if bmi < 18.5: return "thin"
    if bmi < 25 : return "normal"
    else : return "fat"

#출력파일 준비
fp=open("bmi.csv", "w", encoding='utf-8')
fp.write("height,weight,label\r\n")

#무작위 데이터 생성
cnt={"thin":0, "normal":0, "fat":0}
for i in range(20000):
    h=random.randint(120,200)
    w=random.randint(35,80)
    label=calc_bmi(h,w)
    cnt[label]+=1 #label = thin, normal, fat 등
    fp.write("{0},{1},{2}\r\n".format(h,w,label))
    
fp.close()
print("ok",cnt) 
#bmi.csv data로 svm 분류
from sklearn import svm, metrics
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
import time
start_time=time.time()


#키와 몸무게 데이터 읽어들이기
df=pd.read_csv("bmi.csv")

#칼럼을 자르고 정규화하기
label=df["label"]
w=df["weight"]
h=df["height"]
wh=pd.concat([w,h],axis=1) #데이터프레임 합치기 ###정규화가 어디서 일어난거?

#학습 전용 데이터와 테스트 전용 데이터로 나누기
data_train, data_test, label_train, label_test = train_test_split(wh,label)

#데이터 학습하기
clf=svm.SVC() #support vector classification
clf.fit(data_train, label_train)

#데이터 예측하기
predict=clf.predict(data_test)

#결과 테스트하기 
ac_score=metrics.accuracy_score(label_test, predict)
cl_report=metrics.classification_report(label_test, predict)
print("정답률=", ac_score)
print("리포트=\n", cl_report)
정답률= 1.0
리포트=
              precision    recall  f1-score   support

        fat       1.00      1.00      1.00      1964
     normal       1.00      1.00      1.00      1502
       thin       1.00      1.00      1.00      1534

avg / total       1.00      1.00      1.00      5000


import matplotlib.pyplot as plt
import pandas as pd

#csv load
df=pd.read_csv("bmi.csv", index_col=2)

#그래프 그리기 시작
fig=plt.figure()
ax=fig.add_subplot(1,1,1)

#서브 플롯 전용 - 지정한 레이블을 임의의 색으로 칠하기
def scatter(lbl, color):
    b=df.loc[lbl]
    ax.scatter(b["weight"], b["height"],c=color, label=lbl)
    
scatter("fat","red")
scatter("normal","yellow")
scatter("thin", "purple")

ax.legend()
plt.savefig("bmi-test.png")
plt.show()

img





© 2018. by yeo0

Powered by yeo0