나의 손글씨 데이터로 머신 러닝시킨 후 나의 손글씨로 테스트하기 with 사이킷 런 svm.SVC

mer

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의에서는 나의 손글씨로 제작한 데이터로 머신 러닝시킬 거예요.

그리고 나의 손글씨로 머신 러닝한 결과가 어느 정도 예측하는지 테스트합니다.

현재 1000개에서 3300개의 손글씨가 있는 7개의 데이터 파일이 있습니다.

그리고 0부터 9까지 20번씩 같은 수를 입력한 파일이 있습니다.

손글씨 데이터와 샘플 데이터 다운받기

먼저 pandas를 import하여 파일 내용을 비트맵 부분과 수 부분으로 분리하는 작업을 할게요.

현재 CSV파일에는 손글씨 하나가 20X20 픽셀의 비트맵 이미지를 0과 1로 작성하였습니다. 그리고 해당 이미지가 어떤 수를 쓴 것인지를 기록하여 한 줄에 총 401개의 수로 구성합니다.

이를 분리하기 위해 각 줄의 맨 뒤의 컬럼과 나머지 컬럼을 분리할 거예요.

그리고 이렇게 분리한 하나의 행 정보들을 묶어 data(비트맵 부분)와 label(실제 입력한 수)로 분리할게요.

pandas로 csv 파일에서 원하는 컬럼 추출하기 [미래 실험실 pYTHON]

def read_data(fname):
    mr = pd.read_csv(fname,header=None)
    label=[]
    data=[]
    for row_index,row in mr.iterrows():
        label.append(row.loc[400])
        other_data=[]
        for v in row.loc[0:399]:
            other_data.append(v)
        data.append(other_data)
    return label,data

간단하게 테스트를 하나 해 볼게요.

handwriting1.csv 파일로 머신 러닝하고 4.csv로 얻어온 샘플을 얼마나 정확하게 예측하는지 테스트 합시다.

svm.SVC 개체를 생성하여 fit 메서드로 머신 러닝한 후 predict로 예측합니다.

그리고 metrics.accuracy_score로 결과와 샘플과 비교한 결과를 출력합니다.

label , data = read_data("handwriting1.csv")
tl, td = read_data("4.csv")
clf = svm.SVC()
label, data = read_data(bfile)
clf.fit(data,label)
results = clf.predict(td)
score = metrics.accuracy_score(results,tl)
print("{0}:{1}".format(tl[0],score))

이제 임시 확인하기 위한 코드는 없애고 전체 파일을 테스트 코드로 변경합시다.

머신 러닝에 사용할 파일들을 bfiles에 추가하고 테스트할 샘플 파일들을 tfiles에 추가합시다.

bfiles = []
for i in range(1,8): #현재 handwriting1.csv ~ handwriting7.csv
    bfiles.append("handwriting"+str(i)+".csv")
tfiles =[]
for i in range(0,10): #0.csv~9.csv
    tfiles.append(str(i)+".csv")

bfiles의 각 파일을 반복하여 기계 학습 시킵니다.

그리고 내부 반복문에서 tfiles의 각 파일로 예측을 시도하여 결과를 출력합니다.

clf = svm.SVC()
for bfile in bfiles:
    label, data = read_data(bfile)
    clf.fit(data,label)
    print("===",bfile)
    for tfile in tfiles:
        tl,td = read_data(tfile)
        results = clf.predict(td)
        score = metrics.accuracy_score(results,tl)
        print("{0}:{1}".format(tl[0],score))

다음은 전체 소스 코드입니다.

import pandas as pd
from sklearn import svm, metrics
def read_data(fname):
    mr = pd.read_csv(fname,header=None)
    label=[]
    data=[]
    for row_index,row in mr.iterrows():
        label.append(row.loc[400])
        other_data=[]
        for v in row.loc[0:399]:
            other_data.append(v)
        data.append(other_data)
    return label,data

bfiles = []
for i in range(1,8):
    bfiles.append("handwriting"+str(i)+".csv")
tfiles =[]
for i in range(0,10):
    tfiles.append(str(i)+".csv")

clf = svm.SVC()
for bfile in bfiles:
    label, data = read_data(bfile)
    clf.fit(data,label)
    print("===",bfile)
    for tfile in tfiles:
        tl,td = read_data(tfile)
        results = clf.predict(td)
        score = metrics.accuracy_score(results,tl)
        print("{0}:{1}".format(tl[0],score))