5. SVM
in Data on Machine Learning
파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문
파이썬을 이용한 머신러닝, 딥러닝 실전개발 입문 책과 강의를 바탕으로한 코드 리뷰 및 정리입니다. 자세한 내용은 책과 강의를 참고해주세요.
link: github
4. 머신러닝
4-5. SVM
책의 이론들은 상대적으로 많이 부실해 나중에 제가 따로 정리하도록 하고, SVM 실습 위주로 정리해보려 합니다.
이 사이트 를 보시면 scikit-learn에서 사용할 수 있는 분류기들의 종류와 각 분류기들이 어떤식으로 분류를 하는지에 대한 이미지를 확인할 수 있습니다.
SVM
간단히 설명하면 SVM(Support Vector Machine)으로 속도가 빠르며 높은 인식 성능을 발휘하는 분류방법입니다. 데이터를 분류하는 선(평면)을 찾는데 이때 각 데이터가 떨어진 거리를 가장 극대화 시키는 선을 찾는 방법입니다.
또한 선형이 아닌 데이터의 모형에서도 그 특징을 잘 구분할 수 있는데 차원을 확대한다는 아이디어를 쓴다는 것이 눈에 띄는 점입니다. 이후의 설명은 따로 정리하도록 하겠습니다.
SVM의 종류
scikit-learn에서 지원하는 SVM은 세가지 입니다.
SVC
: C는 Classification. 표준적로 구현된 SVMNuSVC
: 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()