파이썬이 요즘 가장 핫한 이유 중 하나가 머신러닝입니다. 하지만 막상 머신러닝 하면 전문가의 영역으로 넘어가 버리고 개인적으로 쓰기엔 약간 장벽이 느껴집니다.(제가...)

 

그래서 머신 러닝을 배우고 또 개인이 일상 생활에 이용할 수 있도록 실전 프로젝트를 해보기 전 아주 기본적인 머신러닝 기본에 대해서 익혀보겠습니다.

 

먼저 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가 아닌 실제 도움이 될 만한 머신러닝을 해보려 합니다! 결국 코딩은 응용인 것 같습니다.

+ Recent posts