본문 바로가기
인공지능과 정보보호

[Week3] 머신러닝 기본 with Colab

by 슝숑슝 2022. 10. 20.

Google Colab 사용하기

  • 초기에는 파이썬 IDE 환경 사용: 코드 전체를 실행해야 한다.
  • 그러나 머신 러닝 개발 시 특정 부분만 반복적으로 돌리거나 수정할 일들이 발생. 띠라서 코드 자체를 모듈화 할 필요성이 있고 기존의 에디터가 적절하지는 않았다.
  • 주피터 노트북: 코드를 블록 단위로 실행 가능

01. 머신러닝 라이브러리

  • 텐서플로
    • 데이터 플로우 그래프를 통한 풍부한 표현이 가능
    • 데이터셋을 변수로 표현(값, 이미지, 문자열 등의 다양한 데이터의 형태)
    • 구글에서 개발한 open source library
    • 다양한 신경망 학습에 사용됨.
    • sample data set도 제공됨
    • 계산 구조와 목표 함수 정의 및 자동으로 미분 계산을 처리함
    • 텐서보드를 통해서 파라미터 변화 양상 및 DNN 구조를 알 수 있음
    • (단점) 메모리를 효율적으로 사용하지 못하고 함수가 있어도 텐서 타입으로만 적용해야 함
  • 케라스
    • 구글에서 만든 open source library
    • 사용자 친화적, 모듈성, 확장성이 있음
    • 일관되고 간결한 API 제공: 내부 구조를 잘 몰라도 사용 가능
    • 배우기 쉽고 모델 구축이 쉬움
    • 컨볼루션 신경망, 순환 신경망, 둘의 조합까지 모두 지원
    • (단점) API 함수 안에 많은 모델에 대한 세부적인 내용을 포함하기 때문에 오류가 나면 백엔드에서 오류 위치를 찾기가 어렵다. 그래서 케라스 자체의 문제인지, 백엔드 언어의 문제인지 특정하기 어려움
  • 파이토치
    • facebook의 인공지능 연구팀이 개발한 파이썬 기반의 open source library인 torch에 기반하여 만들어진 framework이다.
    • 그래프를 동적으로 처리 가능, GPU 사용이 가능하며 자연어 처리 등의 기능을 위해 많이 사용된다. 
    • 언어 처리에서 능력이 좋음
    • 익히기 쉽고 간결하며 구현이 빠르게 됨
    • 비교적 빠른 최적화가 가능
    • 그래프를 만들면서 동시에 값을 할당하는 define by run 방식으로 코드를 깔끔하게 작성할 수 있음
    • (단점) 텐서플로우에 비해 학습에 필요한 예제를 구하기 쉽지 않으며 텐서플로우보다 디테일한 모델링이 불가능함

02. Colab 살펴보기

  • Colab UI: 텍스트셀, 코드셀, 출력, 노트의 기능
  • Notebook
    • 구글 클라우드 가상머신 사용 현황을 보여줌
      • RAM(12G), HDD(100G) 제공
      • 최대 5개 노트북 지원
      • 노트북당 12시간 실행 시간 제한 

머신러닝 기본 실습

1. 생선 분류 문제

01. Kaggle

  • 2010년 설립된 예측모델 및 분석 대회 플랫폼으로 2017년 3월 구글에 인수
  • 기업 및 단체에서 데이터와 해결과제 등록 → 데이터 과학자들이 해결하는 모델 개발 및 경쟁

02. 분류한다는 것?

  • 비슷하니까!

03. Fish-market dataset

  • 생선 중 도미 분류하기
    • 30cm 이상 크다면 도미라고 판단하는 프로그램 작성
    • (문제점) 30cm 이하 도미가 존재한다면 잘못 판단하게 됨
if fish_length >= 30
	print("도미")
  • 머신 러닝을 이용해보자!
  • 도미 데이터 준비하기
    • 도미(bream)와 빙어(smelt) 구분하기 - 길이. 무게 feature 선정
    • class: 머신러닝 데이터셋의 종류
    • classification: 머신러닝에서 분류
    • binary classification: 이진분류
#도미 데이터(도미의 길이와 무게) 준비
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

04. 도미 분포 산점도로 출력하기

#matplotlib pyplot 함수를 plt로 줄여서 사용
import matplotlib.pyplot as plt

#산점도 그래프 그리기
plt.scatter(bream_length, bream_weight)
plt.xlabe('length')
plt.ylabe('weight')
plt.show()
  • 산점도 그래프(scatter plot): x축, y축으로 점(관계표현)으로 표현하는 그래프
  • Matplotlib: 과학계산용 그래프 그려주는 파이썬 라이브러리

05. 빙어 데이터 준비하고 산점도 출력하기

#빙어 데이터(빙어의 길이와 무게) 준비
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

2. 첫 번째 머신러닝 프로그램

01. K-최근접 이웃(k-nearest neighbors)

  • 종류를 구분하려면?
    • 같은 종류는 비슷한 특징을 갖는다.
    • 크기, 무게, 모양 등 다양한 특징 존재
    • 그래프로 표현하면 구별되기도 함
  • k-최근접 이웃
    • 대표적 분류 알고리즘
    • 파이썬 클래스: KNeighborsClassifier
    • 비슷한 특징을 갖는 데이터는 비슷한 범주에 속함
      • 모델 생성: 훈련데이터 셋 저장 (훈련 = 저장)
      • 분류기준: 가까운 점 k개를 찾고 해당하는 요소로 분류
    • k: 항상 분류가 가능하도록 홀수로 설정(동률 방지), 총 데이터 수의 제곱근 값을 사용, 기본값은 5
    • 장점: 단순하기 때문에 구현하기 쉬움. 훈련을 하지 않기 때문에  빠른 사용 가능
    • 단점: 특징이 명확한 데이터셋만 분류 가능, 변수와 클래스 간의 관계에 의존적
    • 사용분야 예시: 이미지처리, 글자/얼굴 인식, 추천 알고리즘, 의료 분야 등

02. 머신러닝 기본 코딩

  • 데이터셋 통합(도미+빙어)
#데이터셋 통합(도미+빙어)
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
  • 점으로 찍기 위해 (x, y) 추출 - fish_data
#점으로 찍기 위해 (x, y) 추출 - fish_data
fish_data = [[l, w] for l, w in zip(length, weight)]
  • 각 요소에 대해서 도미와 빙어로 라벨링 - fish_target
    • 1은 도미, 0은 빙어 (도미 데이터 35개, 빙어 데이터 14개)
#각 요소에 대해서 도미와 빙어로 라벨링 - fish_target
fish_target = [1]*35 + [0]*14
print(fish_target)

03. k-최근접 이웃 알고리즘 선언 및 기본 사용

  • 싸이킷런
    • 데이터 분석 예측을 위한 효과적인 라이브러리
    • NumPy, SciPy와 matplotlib 기반으로 구축
    • 오픈소스, 상업적 사용 가능(BSD 라이센스)
#싸이킷런 패키지로부터 임포트
from sklearn.neighbors import KNeighborsClassifier

#k-최근접이웃 분류기 선언
kn =  KNeighborsClassifier()

#fit()은 머신러닝의 훈련 메소드, score()는 평가메소드
#kn모델에 요소(fish_data)와 레이블(fish_target)을 지정하여 훈련함
kn.fit(fish_data, fish_target)

#kn모델에 요소(fish_data)와 레이블(fish_target)을 지정하여 평가함
kn.score(fish_data, fish_target)

04. 평가 TEST

  • predict(): 새로운 정답을 예측하는 메소드
  • 리스트 안의 리스트로 넣어야 함 ([[30, 600]])
#산점도 그래프 그리기
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)

#특정요소가 (30. 600)을 화면에 출력
plt.scatter(30, 600, marker='^')
#x축 제목 - length
plt.xlabel('length')
#y축 제목 - weight
plt.ylabel('weight')
plt.show()

#특정요소가 (30, 600)의 값을 갖는다면 kn 모델은 무엇으로 예측 하는가?
kn.predict([[30, 600]])

05. 모델 보기

  • KNeighborsClassifier 속성
    • _fit_X: 모델의 첫 번째 파라미터, 학습된 데이터 값 ex) fish_data
    • _y: 모델의 두 번째 파라미터, 학습된 레이블 값 ex) fish_target
    • n_neighbors: k로 k개 만큼 가까운 데이터 참고, 기본 값은 5 
  • n_neighbors 값을 49로 설정해보자.
    • 가까운 점을 49개로 잡아서 많이 나오는 쪽으로 분류
    • 도미가 35개로 더 많기 때문에 모든 생선을 도미로 분류할 것이다.
    • 49개의 생선 중 35개는 도미이기 때문에 그만큼만의 정확도를 보인다. (0.71 = 35/49)
#모델에 학습된 데이터 값
print(kn._fit_X)
#모델에 학습된 레이블 값
print(kn._y)

#모든 데이터셋 개수인 49개만큼 가까운 데이터를 참고하는 모델 생성
kn49 = KNeighborsClassifier(n_neighbors = 49)

#모델 학습 및 평가(정확도 출력)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
#도미 35개에 대해서만 정확히 맞추기 때문에 35/49와 같은 정확도를 보임
print(35/49)

확인문제 & 응용 문제

확인문제 

n_neighbors의 값이 49일 때 정확도는 1.0보다 작습니다. k 값을 기본값이 5부터 49까지 바꾸어 가면서 정확도가 1.0 아래로 내려가기 시작하는 이웃의 갯수를 찾아보시오. 이 문제를 위해 KNeighborsClassifier 클래스 객체를 다시 만들 필요 없이 n_neighbors 속성 값만 바꾸면 됩니다. (학습이 필요 없이 저장만 하면 되는 모델이기 때문)

kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)

for n in range(5, 50) :
  #k-최근접 이웃 개수 설정
  kn.n_neighbors = n
  #정확도 계산
  score = kn.score(fish_data, fish_target)
  #100% 정확도 아래로 내려가는 순간의 이웃 갯수와 정확도 출력
  if score < 1 :
    print(n, score)
    break

응용 문제 

빙어를 제외한 다른 물고기 종류와 도미를 분류하는 코드를 작성하고 두 종류를 잘 분류하고 있는지 예측하시오.

'인공지능과 정보보호' 카테고리의 다른 글

[Week7-1] 결정 트리  (1) 2022.10.24