machineLearning의 svm이 무엇이고 직접 그래프로 구분짓기

2018. 4. 22. 21:21Python-이론/python-인공지능

svm 이란??



svm이란 machineLearning의 일종의 방법으로 데이터들이 비슷한 특징들을 나타낼때 그 패턴을 컴퓨터가 쉽게 알게 하기위해 데이터 사이에 선을 긋는 것을 뜻한다. 주로 교사학습과 회귀분석 분류에 많이 쓰인다.

예시



그럼 처음부터 데이터 만드는 것 부터 시작해서 머신러닝 후 그래프 그리는 것 까지 해보겠다.



1. 데이터 얻어오기
import random

def getStatus(w,h):
    bmi = w/(h/100)**2
    if bmi <18.5: return 'thin'
    elif bmi < 25: return 'normal'
    else: return 'fat'


#1.작성할  파일을 오픈하죠
csvFile = open('learning.csv','w',encoding = 'utf-8')
csvFile.write('weight,height,label\n')
#몸무게 상태 명수 변수 초기화
weightInfo = {'thin':0,'normal':0,'fat':0}

for idx in range(20000):
    w = random.randint(50,120)
    h = random.randint(140,200)
    status = getStatus(w,h)
    weightInfo[status] += 1
    csvFile.write('{0},{1},{2}\n'.format(w,h,status))
csvFile.close()
print(weightInfo)


2.machineLearning 실행하기
import pandas as pd
from sklearn import metrics, svm
from sklearn.model_selection import train_test_split

csvFile = pd.read_csv('learning.csv')

wData = csvFile['weight']/120
hData = csvFile['height']/200
label = csvFile['label']

wh = pd.concat([wData,hData],axis=1)

#데이터 분리

trainData, testData, trainLabel, testLabel = train_test_split(wh,label,test_size = 0.33)

clf = svm.SVC()
clf.fit(trainData,trainLabel)
pre = clf.predict(testData)

score = metrics.accuracy_score(pre,testLabel)
report = metrics.classification_report(pre,testLabel)

print(score)
print(report)




3그래프 그리기

import matplotlib.pyplot as plt
import pandas as pd

#index_col=2 가로축 2개의 인자의 값만 사용하겠다.
csvFile = pd.read_csv('learning.csv',index_col=2)

fig = plt.figure()
#첫인자 행 개수 두번째 인자 렬 세번째는 몇번째 subplot에 적용할 건지
ax = fig.add_subplot(111)

def scatter(lbl,color):
    b = csvFile.loc[lbl]
    #인자 x,y좌표 세번째는 색깔 네번째는 저 색들을 나누는 기준->legend에 쓰임
    ax.scatter(b["weight"],b["height"],c=color,label =lbl)

scatter("fat","red")
scatter("normal","yellow")
scatter("thin","purple")


#loc 어디 둘지 bbox_to_anchor 처음이 0 끝이 1
#legend의 가운데가 기준으로 이동 시킬 수 있음
#ncol 한줄에 몇개의 contents를 둘 수 있는지 나타낸다.
ax.legend()
#위의 주석 bbox_to anchor을 통해 색분류가 무슨의미를 하는지 표시하는 부분의 위치를 바꿀 수 있다.
plt.savefig("bmi-test3.png")