파이썬이 요즘 가장 핫한 이유 중 하나가 머신러닝입니다. 하지만 막상 머신러닝 하면 전문가의 영역으로 넘어가 버리고 개인적으로 쓰기엔 약간 장벽이 느껴집니다.(제가...)
그래서 머신 러닝을 배우고 또 개인이 일상 생활에 이용할 수 있도록 실전 프로젝트를 해보기 전 아주 기본적인 머신러닝 기본에 대해서 익혀보겠습니다.
먼저 scikit-learn이라는 라이브러리라는 가장 기본적이고 정석이라는 모듈을 설치합니다.
pip install scikit-learn scipy matplotlib scikit-image
pip install pandas
scikit-learn 이외에도 다른 여러 보조 라이브러리도 미리 설치해 줍니다.
그리고 실제 머신 러닝 입문시 배우는 붓꽃 데이터 분류하는 코딩을 해 봅시다.
아래는 '파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문' 이라는 책을 보고 작성한 자료임을 미리 밝혀 둡니다.
구글에 'iris.csv'를 검색하면 수많은 페이지들이 검색되고 그 자료는 다음과 같습니다.
"sepal.length","sepal.width","petal.length","petal.width","variety"
5.1,3.5,1.4,.2,"Setosa"
4.9,3,1.4,.2,"Setosa"
4.7,3.2,1.3,.2,"Setosa"
4.6,3.1,1.5,.2,"Setosa"
5,3.6,1.4,.2,"Setosa"
5.4,3.9,1.7,.4,"Setosa"
4.6,3.4,1.4,.3,"Setosa"
5,3.4,1.5,.2,"Setosa"
4.4,2.9,1.4,.2,"Setosa"
... 생략 ...
각 값은 순서대로 꽃받침의 길이/꽃받침의 너비/꽃잎의 길이/꽃잎의 너비/품종
총 5개로 150개로 구성되어 있고 품종은 총 세가지 품종 중 하나입니다.
그리고 코딩은 총 150개의 Data중 100개의 꽃받침과 꽃잎 Data에 대한 품종을 학습(상관관계를 학습)하고 나머지 50개의 꽃받침과 꽃잎의 Data만으로 각 품종을 추리해 내는 것입니다. 그리고 실제 품종과 추리해 낸 품종을 비교하여 얼마나 제대로 추리해 냈는지 점수를 1점 만점에 몇점인지 확인합니다.
모든 코딩라인에 주석을 달았습니다.
from sklearn import svm, metrics # 관련 모듈 임포트
import random, re
csv = [] # csv 파일을 열어 리스트로 저장하기 위한 변수 생성
with open('iris.csv', 'r', encoding='utf-8') as fp: # iris.csv 파일 오픈하여 변수 fp로 저장
for line in fp: # 각 줄을 for문으로 반복
line = line.strip() # 줄변경 삭제
cols = line.split(',') # 각 줄의 항목들을 분할하여 리스트로 변경
fn = lambda n : float(n) if re.match(r'^[0-9\.]+$', n) else n # 문자는 숫자(소수)로 변경하는 함수 생성
cols = list(map(fn, cols)) # map을 이용하여 cols에 fn함수를 적용
csv.append(cols) # 각 라인의 항목 리스트를 항목으로 csv 리스트에 추가
'''
csv = [
['\ufeff"sepal.length"', '"sepal.width"', '"petal.length"', '"petal.width"', '"variety"'],
[5.1, 3.5, 1.4, 0.2, '"Setosa"'],
[4.9, 3.0, 1.4, 0.2, '"Setosa"'],
[4.7, 3.2, 1.3, 0.2, '"Setosa"'],
... 위와 같이 csv를 만듭니다.
]
'''
del csv[0] # 첫줄은 그냥 삭제합니다.
random.shuffle(csv) # csv 리스트를 random.shuffle()을 이용하여 순서를 섞습니다.
total_len = len(csv) # 전체 개수 - 150개 데이터
train_len = int(total_len * 2/3) # 학습하는 개수는 전체 개수의 2/3으로 설정 - 100개 학습
train_data = [] # 학습 데이터 리스트 생성
train_label = [] # 학습 레이블 리스트 생성
test_data = [] # 확인 데이터 리스트 생성
test_label = [] # 확인 레이블 리스트 생성
for i in range(total_len): # 150번 반복
data = csv[i][0:4] # 꽃받침의 길이/너비, 꽃잎의 길이/너비 값을 data 변수
label = csv[i][4] # 꽃종을 label 변수
if i < train_len: # 100개 학습을 마치기 전이면...
train_data.append(data) # train_data에 저장
train_label.append(label) # train_label에 저장
else: # 100개 학습 이후면...
test_data.append(data) # test_data에 저장
test_label.append(label) # test_label에 저장
clf = svm.SVC() # svm.SVC()를 clf로 저장
clf.fit(train_data, train_label) # .fit 함수로 학습 train_data에 따른 train_label 관계
pre = clf.predict(test_data) # .predict로 test_data를 입력하면 train_label의 형식에 맞게 결과 예측
'''
pre = [
'"Versicolor"' '"Versicolor"' '"Setosa"' '"Versicolor"' '"Setosa"'
'"Versicolor"' '"Virginica"' '"Setosa"' '"Virginica"' '"Versicolor"'
'"Virginica"' '"Versicolor"' '"Versicolor"' '"Setosa"' '"Setosa"'
'"Setosa"' '"Setosa"' '"Versicolor"' '"Setosa"' '"Versicolor"'
'"Virginica"' '"Virginica"' '"Versicolor"' '"Virginica"' '"Setosa"'
'"Setosa"' '"Virginica"' '"Setosa"' '"Versicolor"' '"Virginica"'
'"Setosa"' '"Setosa"' '"Versicolor"' '"Virginica"' '"Setosa"' '"Setosa"'
'"Setosa"' '"Versicolor"' '"Setosa"' '"Versicolor"' '"Setosa"'
'"Versicolor"' '"Setosa"' '"Versicolor"' '"Virginica"' '"Setosa"'
'"Setosa"' '"Versicolor"' '"Virginica"' '"Virginica"'
]
'''
ac_score = metrics.accuracy_score(test_label, pre) # test_label과 pre를 비교하여 얼마나 동일한지 확인
print("정답률 = ", ac_score) # 동일한 정도를 출력
마지막 라인과 같이 정답률은 계속해서 0.98~1 사이로 나옵니다. 거의 정확하다는 것이지요!
그냥 하고싶은 말은 최소한 위의 머신러닝은 그렇게 어렵지 않습니다. 사실 대부분의 코딩이 머신러닝 시키기 위한 밥상 차려주는 작업이고 학습은 .fit과 .predict 단 두줄로만 한 것이니깐요.
좀 머리를 굴려보면 뭔가 적용할 것들이 많이 생길것 같습니다. 다음에는 재미없는 붓꽃 Data가 아닌 실제 도움이 될 만한 머신러닝을 해보려 합니다! 결국 코딩은 응용인 것 같습니다.