티스토리 뷰

#1 데이터 가져오기


url : https://github.com/pandas-dev/pandas/blob/master/pandas/tests/data/iris.csv

(csv파일을 저장하고 싶다면 RAW클릭 후 해당 내용을 전체 복사를 하고 메모장을 열어 복사한 내용을 붙여넣기 해서 다른이름으로 저장(iris.csv)를 해주면 됩니다.)



#2 품종 분류 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd #데이터를 읽어드리고 분할할때 편리
from sklearn import svm, metrics
"""
svm : 데이터를 분류하는 최적(margin을ㅇ 최대화)선을 찾는 것을 의미.
metrics : 정답률을 쉽게 구할 수 있게 됨.
"""
csv = pd.read_csv("iris.csv")
data = csv[["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
label = csv["Name"]
#기계학습
clf = svm.SVC()
clf.fit(data, label)
#데이터 예측
"""
predict()메서드 : 답을 얻고 싶은 데이터를 '리스트 형식'으로 넣는다.
"""
results = clf.predict([
    [5.12.91.40.2]
])
print(results)
cs



※ SVM 알고리즘에 대한 설명은 나중에 다시 정리를 해서 게시물 작성을 하도록 하겠습니다.


7번째줄 : pandas를 사용해서 read_csv메소드를 사용하면 csv 파일을 읽어드릴 수 있다. 그래서 그 내용을 csv 변수에 저장한다.

8번째줄 : 리스트[] 안에 있는 내용들을 열 이름으로 분할해서 data 변수에 저장한다는 의미이다.

9번째줄 : 리스트[]안에 있는 내용을 label 변수에 저장한다는 의미이다. 

(8~9번째줄은 아래 사진 참고)

(iris.csv 파일 내용)


실제 data와 label을 출력해보면 다음과 같이 출력이 되는것을 볼 수 있다.


(data에 저장된 값)


(label에 저장된 값)



위 내용들은 데이터 작업을 쉽게 하기 위해서 '데이터'와 '레이블'을 분리를 한 것 이다. 이렇게 '데이터'와 '레이블'로 분류를 하는 이유는 바로 다음에 사용될 fit() 메서드에서 필요한 메서드를 맞추기 위해서 이렇게 분류가 되는것이다.



12번째줄 : 기계학습에 대한 코드이다. SVM 객체를 만든 후 fit() 메서드를 이용해서 데이터를 학습을 시키게 된다. 첫 번째 메소드로는 학습할 데이터의 배열을 전달하고 두 번째 메소드로는 데이터에 대한 결과값의 레이블 배열을 전달한다. 이로서 기계학습은 시작하게 되는 것 입니다.

17번째줄 : 내가 답을 얻고 싶은 데이터를 '리스트 형식'으로 넣습니다. 저는 여기서 scv에 있는 값들 중. 내가 원하는 값을 랜덤을오 선정헤ㅐ서 넣어두었습니다.


출처 : http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html


위 코드에서 사용된 메서드들 입니다. 우선 fit()메서드 같은 경우는 모는 바와 같이 입력된 학습된 학습데이터에 따라서 원하는 값이 들어올때  값들과 맞춰보게 되는 것 입니다.


predict()메서드는 "예측하다"라는 뜻을 가지고 있습니다. 즉, 내가 답을 얻고 싶은 데이터를 리스트 형식으로 넣으면 return 값으로 리스트형태로 값을 얻게 됩니다.


위 내용을 한번 실행해보고 어떠한 결과값이 나오는지 확인을 해보겠습니다.



내가 원하는 데이터값은 아래 표와 같습니다.


SepalLength 

SepalWidth 

PetaLength 

PetalWidth 

5.1 

3.0 

1.3 

0.2 


이 데이터값을 훈련된 학습모델에 집어넣었을때 이 값은 Iris-setosa붖꽃이라는것을 출력해 주는 내용 입니다.


여기서 하나 생각을 해보고 가야할게 있습니다.


Q : 꽃받침하고 꽃임의 크기가 붖꽃의 종류와 관계가 있을까? 만약 있다면 그 정답률은 얼마나 될까? 라는것을 생각을 해볼 수 있습니다.

그러나 그 답변은


모름


그 이유는 [5.1, 3.0, 1.3, 0.2]의 데이터데로 생긴 꽃이 어떤 꽃인지 확실하게 모르기 때문이다. 그래서 보통 데이터가 200개가 있으면 그 중 50개 데이터는 데이터를 위한 데이터로 준비를 해두고 나머지 150개의 데이터로 학습을 시킨 후  50개 테스트 데이터로 학습모델에 집어넣을 때 정답률이 95% 이상이 나온다면 해당 데이터는 증명이 되었다고 판단을 할 수 있다. 따라서 전체 데이터 200개를 모두 다시 학습을 시켜서 학습 모델을 만들 수 있다.



이제 정답률을 구하는 코드를 확인하고 설명을 하겠습니다.




#3 정답률 확인 소스코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
from sklearn improt svm, metrics
from sklearn.model_selection import train_test_split
 
#데이터 추출
csv = pd.read_csv("iris.csv")
data = csv[["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
label = csv["Name"]
 
#학습 전용 데이터와 테스트 전용 데이터로 분류
train_data, test_data, train_label, test_label =\
    train_test_split(data, label)
 
#기계학습
clf = svm.SVC()
clf.fit(train_data,  train_label)
results = clf.predict(test_data)
 
score = metrics.accuracy_score(results, test_label)
print("정답률 : ", score)
cs


아! 그 전에 13번째줄에 학습 전용 데이터와 테스트 전용 데이터를 print로 출력을 해보면 임의 값들이 랜덤하게 배치가 되어있는것을 볼 수 있습니다. 그 이유는 train_test_split() 메서드때문에 그렇습니다. 이 메서드에 대해 간단하게 알아보자면 다음과 같습니다.



출처 : http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html


다시 한번 더 알아보면 train_test_spllit(전체 데이터, 레이블) -> 전체 데이터와 레이블을 넣으주게 되면 앞에 있는 변수만큼 자동으로 봅아주게 됩니다.



이하 나머지 내용들은 위에서 말했던 내용과 동일해서 생략을 하고 19번째 내용에 대해 설명을 하겠습니다.


19번째줄 : metrics를 사용하게 되면 정답률을 쉽게 구할 수 있게 됩니다. 그래서 여기서는 results에 따라서 test_label의 값이 정답률이 얼마나 되는지 확인을 하게 됩니다.




이렇게 되면 증명이 완료가 되니 나중에 사용을 할때는 label과 data 전체로 학습을 시키면 됩니다.




※ 머신러닝,딥러닝 실전개발 입문을 공부하고 정리한 글 입니다.

Comments