본문 바로가기

say와 AI 챗봇친구 만들기 보고서

IT/혼자 공부하는 머신러닝+딥러닝

728x90
반응형
SMALL

IT/혼자 공부하는 머신러닝+딥러닝

# Page 01~43

혼자 공부하는 머신러닝+딥러닝 - 박해선 지음 - 한빛미디어

Chapter 01. 나의 첫 머신러닝 (이 생선의 이름은 무엇인가요?)

핵심 키워드:

  • 인공지능
  • 머신러닝
  • 딥러닝

 

학습 목표:

  • 인공지능머신러닝딥러닝의 차이점을 이해합니다.
  • 구글 코랩 사용법을 배웁니다.
  • 첫 번째 머신러닝 프로그램을 만들고 머신러닝의 기본 작동 원리를 이해합니다.

01-1. 인공지능과 머신러닝, 딥러닝

인공지능이란:

  • 인공지능(Artificial Intelligence)은 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술입니다.
  • 인공지능의 역사는 약 80년 남짓 되었지만 인류는 훨씬 더 오래전부터 지능적인 시스템을 생각했습니다.
  • 인공지능은 강인공지능과 약인공지능으로 나눌 수 있습니다.
  • 사람과 구분하기 어려운 지능을 가진 컴퓨터 시스템이 인공일반지능입니다.
  • 반면 현실에서 우리가 마주하고 있는 인공지능은 약인공지능(Week AI)입니다.
    • 특정 분야에서 사람의 일을 도와주는 보조 역할만 기능
    • 예시) 음성 비서, 자율 주행 자동차, 음악 추천, 기계 번역 등

머신러닝이란:

  • 머신러닝(Machine Learning)은 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야입니다.
  • 인공지능의 하위 분야 중에서 지능을 구현하기 위한 소프트웨어를 담당하는 핵심 분야입니다.
  • 머신러닝은 통계학과 깊은 관련이 있습니다.
  • 컴퓨터 과학 분야의 대표적인 머신러닝 라이브러리는 사이킷런(scikit-learn)입니다.
  • 사이킷런과 같은 오픈소스 라이브러리의 발전 덕분에 머신러닝 분야는 말 그대로 폭발적으로 성장했습니다.

딥러닝이란:

  • 많은 머신러닝 알고리즘 중에 인공 신경망(Artificial neural network)을 기반으로 한 방법들을 통칭하여 딥러닝(Deep Learning)이라고 부릅니다.
  • 종종 사람들은 인공 신경망과 딥러닝을 크게 구분하지 않고 사용합니다.
  • 인공 신경망이 이전과 다르게 놀라운 성능을 달성하게 된 세 가지 원동력
    1. 복잡한 알고리즘을 훈련할 수 있는 풍부한 데이터
    2. 컴퓨터 성능의 향상
    3. 혁신적인 알고리즘 개발

 

"2015년 구글은 딥러닝 라이브러리인 텐서플로(TensorFlow)를 오픈소스로 공개했습니다."

"페이스북도 2018년 파이토치(PyTorch) 딥러닝 라이브러리를 오픈소스로 발표했습니다."

 

"이 라이브러리들의 공통점은 인공 신경망 알고리즘을 전문으로 다루고 있다는 것과 모두 사용하기 쉬운 파이썬 API를 제공한다는 점입니다."

 

"지금이 이 기술을 배우기 가장 좋은 때라는 것은 의심의 여기자 없습니다."

"이 책을 통해 인공지능의 추상화를 걷어내고 직접 코딩하면서 머신러닝과 딥러닝의 실체가 무엇인지 배워 보겠습니다."

01-2. 코랩과 주피터 노트북:

핵심 키워드:

  • 코랩
  • 노트북
  • 구글 드라이브

 

"이 책은 사전 지식 없이도 누구나 쉽게 머신러닝의 기초를 학습할 수 있게 하겠다는 점을 목표로 하는 터라 '누구나 동일한 결과를 표현할 수 있게 쉽게 실습'할 수 있는 점을 고려했습니다."

"이 책에서 사용할 실습 환경은 네트워크에 연결된 컴퓨터와 구글 계정입니다."

구글 코랩:

  • 웹 브라우저에서 무료로 파이썬 프로그램을 테스트하고 저장할 수 있는 서비스입니다.
  • 심지어 머신러닝 프로그램도 만들 수 있습니다.
  • 클라우드 기반의 주피터 노트북 개발 환경
  • 링크: https://colab.research.google.com/
 

Google Colaboratory

 

colab.research.google.com

  • 웹 브라우저에서 텍스트와 프로그램 코드를 자유롭게 작성할 수 있는 온라인 에디터라고 생각하면 쉽습니다.
  • 코랩 파일을 노트북 혹은 코랩 노트북이라고 부릅니다.

 

"노트북의 장점: 노트북을 사용하면 코드를 설명하는 문서를 따로 만들지 않고 코드와 텍스트를 함께 담을 수 있습니다. 심지어 코드의 실행 결과도 노트북과 함께 저장됩니다. 다른 사람에게서 노트북 파일을 받으면 코드를 실행할 필요 없이 코드 설명과 실행 결과를 바로 확인할 수 있습니다."

 

코랩 접속 화면

텍스트 셀:

  • 은 코랩에서 실행할 수 있는 최소 단위입니다.
  • 텍스트 셀에서는 HTML과 마크다운을 혼용해서 사용할 수 있습니다.

코드 셀:

코드셀 예시

"코드 셀로 이동하면 코드와 결과가 함께 선택됩니다."

 

노트북:

  • 구글이 대화식 프로그래밍 환경인 주피터를 커스터마이징한 것입니다.
  • 주피터 프로젝트의 대표 제품이 바로 노트북입니다.
  • 흔히 주피터 노트북이라고 부릅니다.
  • 코랩 노트북은 구글 클라우드의 가상 서버를 사용합니다.
  • 서버의 메모리는 약 12기가이고 디스크 공간은 100기가입니다.
  • 구글 계정만 있으면 코랩 노트북을 사용해 무료로 가상 서버를 활용할 수 있습니다.

실습:

새 노트북 만들기:

  • [파일] - [새 노트] 선택
  • 코드 셀에 print("Hello World!") 입력 후, 저장
  • 저장된 파일은 자동으로 구글 드라이브에 저장 (Colab Notebooks 폴더 밑에 저장)
  • 노트북 제목을 Hello World로 변경

# Page 44 ~ 50

# To Be....

01-3. 마켓과 머신러닝:

핵심 키워드:

  • 특성
  • 훈련
  • k-최근접 이웃 알고리즘
  • 모델
  • 정확도

생선 분류 문제:

 

# 도미의 크기가 30보다 크거나 같다고만 정의되었을 때...
if fish_length >= 30:
    print("도미")

 

"보통 프로그램은 '누군가 정해준 기준대로 일'을 합니다."

"반대로 머신러닝은 누구도 알려주지 않는 기준을 찾아서 일을 합니다."

 

 

도미 데이터 준비하기:

"머신러닝에서 여러 개의 종류(혹은 클래스) 중 하나를 구별해 내는 문제를 분류(classification)라고 부릅니다."

"특히 2개의 클래스 중 하나를 고르는 문제를 이진 분류(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]

 

"각 도미의 특징을 길이와 무게로 표현한 것이죠."

"이 책에서는 이런 특징을 특성(feature)이라고 부르겠습니다."

 

"길이를 x축으로 하고 무게를 y축으로 정하겠습니다."

"그다음 각 도미를 이그래프에 점으로 표시해 보죠."

"이런 그래프를 산점도(scatter plot)라고 부릅니다."

 

"파이썬에서 과학계싼용 그래프를 그리는 대표적인 패키지는 맷플롯립(matplotlib)입니다."

 

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

plt.scatter(bream_length, bream_weight)
plt.xlabel('length') # x 축은 길이
plt.ylabel('weight') # y 축은 무게
plt.show()

 

 

"이렇게 산점도 그래프가 일직선에 가까운 형태로 나타나는 경우를 선형(linear)적이라고 말합니다."

 

빙어 데이터 준비하기:

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]
# 전체 코드
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]

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]

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

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length') # x 축은 길이
plt.ylabel('weight') # y 축은 무게
plt.show()

 

빙어와 도미의 산점도 표현

 

# To Be...

첫 번째 머신러닝 프로그램:

"k-최근접 이웃(k-Nearest Neighbors)알고리즘을 사용해 도미와 빙어 데이터를 구분해보겠습니다."

 

"앞에서 준비했던 빙어 데이터를 하나의 데이터로 합치겠습니다."

 

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

 

"패키지(사이킷런)를 사용하려면 각 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트를 만들어야 합니다."

 

"이렇게 만드는 가장 쉬운 방법은 파이썬의 zip() 함수와 리스트 내포 구문을 사용하는 것입니다."

  • zip() 함수는 나열된 리스트 각각에서 하나씩 원소를 꺼내 반환합니다.

 

# zip()함수와 리스트 내포 구문 사용
fish_data = [[l, w] for l, w in zip(length, weight)]

print(fish_data)
# 출력 결과
[[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0], [29.7, 450.0], [29.7, 500.0], [30.0, 390.0], [30.0, 450.0], [30.7, 500.0], [31.0, 475.0], [31.0, 500.0], [31.5, 500.0], [32.0, 340.0], [32.0, 600.0], [32.0, 600.0], [33.0, 700.0], [33.0, 700.0], [33.5, 610.0], [33.5, 650.0], [34.0, 575.0], [34.0, 685.0], [34.5, 620.0], [35.0, 680.0], [35.0, 700.0], [35.0, 725.0], [35.0, 720.0], [36.0, 714.0], [36.0, 850.0], [37.0, 1000.0], [38.5, 920.0], [38.5, 955.0], [39.5, 925.0], [41.0, 975.0], [41.0, 950.0], [9.8, 6.7], [10.5, 7.5], [10.6, 7.0], [11.0, 9.7], [11.2, 9.8], [11.3, 8.7], [11.8, 10.0], [11.8, 9.9], [12.0, 9.8], [12.2, 12.2], [12.4, 13.4], [13.0, 12.2], [14.3, 19.7], [15.0, 19.9]]

 

"마지막으로 준비할 데이터는 정답 데이터입니다."

"즉 첫 번재 생선은 도미이고, 두 번재 생선도 도미라는 식으로 각각 어떤 생선인지 답을 만드는 것입니다."

 

"곱셈 연산자를 사용하면 파이썬 리스트를 간단하게 반복시킬 수 있습니다."

 

# 곱셈 연산자 활용
# 정답 리스트는 도미와 빙어를 순서대로 나열했기 때문에 도미(1) 35번 등장 + 빙어(0) 14번 등장
fish_target = [1] * 35 + [0] * 14
print(fish_target)

# 출력 결과물
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

"이제 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier를 임포트합니다.

 

from sklearn.neighbors import KNeighborsClassifier

 

"임포트한 KNeighborsClassifier 클래스의 객체를 먼저 만듭니다.

 

kn = KNeighborsClassifier()

 

"이 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킵니다."

"이런 과정을 머신러닝에서 훈련(training)이라고 부릅니다."

"사이킷런에서는 fit() 메서드가 이런 역할을 합니다."

 

kn.fit(fish_data, fish_target)

 

"fit() 메서드는 주어진 데이터로 알고리즘을 훈련합니다."

 

"사이킷런에서 모델을 평가하는 메서드는 score() 메서드입니다."

"이 메서드는 0에서 1 사이의 값 반환합니다."

"1은 모든 데이터를 정확히 맞혔다는 것을 나타냅니다."

 

kn.score(fish_data, fish_target)

# 출력 결과물
1.0

 

"이 값을 정확도(accuracy)라고 부릅니다."

k-최근접 이웃 알고리즘:

"k-최근접 이웃 알고리즘은 매우 간단합니다."

"어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용합니다."

 

다수결의 원칙!!

 

 

# 임의의 물고기 데이터를 이용한 테스트
kn.predict([[30, 600]])

# 출력 결과물
array([1])

 

"predict() 메서드 새로운 데이터의 정답을 예측합니다."

"이 메서드도 앞서 fit() 메서드와 마찬가지로 리스트의 리스트를 전달해야 합니다."

 

  • 장점: 데이터를 모두 가지고 있으면 준비 완료!
  • 단점: 데이터가 아주 많은 경우 사용하기 어려움..

 

print(kn._fit_X)

# 출력 결과물
[[  25.4  242. ]
 [  26.3  290. ]
 [  26.5  340. ]
 [  29.   363. ]
 [  29.   430. ]
 [  29.7  450. ]
 [  29.7  500. ]
 [  30.   390. ]
 [  30.   450. ]
 [  30.7  500. ]
 [  31.   475. ]
 [  31.   500. ]
 [  31.5  500. ]
 [  32.   340. ]
 [  32.   600. ]
 [  32.   600. ]
 [  33.   700. ]
 [  33.   700. ]
 [  33.5  610. ]
 [  33.5  650. ]
 [  34.   575. ]
 [  34.   685. ]
 [  34.5  620. ]
 [  35.   680. ]
 [  35.   700. ]
 [  35.   725. ]
 [  35.   720. ]
 [  36.   714. ]
 [  36.   850. ]
 [  37.  1000. ]
 [  38.5  920. ]
 [  38.5  955. ]
 [  39.5  925. ]
 [  41.   975. ]
 [  41.   950. ]
 [   9.8    6.7]
 [  10.5    7.5]
 [  10.6    7. ]
 [  11.     9.7]
 [  11.2    9.8]
 [  11.3    8.7]
 [  11.8   10. ]
 [  11.8    9.9]
 [  12.     9.8]
 [  12.2   12.2]
 [  12.4   13.4]
 [  13.    12.2]
 [  14.3   19.7]
 [  15.    19.9]]

 

print(kn._y)

# 출력 결과물
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
 0 0 0 0 0 0 0 0 0 0 0 0]

 

"실제로 k-최근접 이웃 알고리즘은 무언가 훈련되는 게 없는 셈이네요."

"fit() 메서드에 전달한 데이터를 모두 저장하고 있다가 새로운 데이터가 등장하면 가장 가까운 데이터를 참고하여 도미인지 빙어인지 구분합니다."

 

"그럼 가까운 몇 개의 데이터를 참고할까요?"

"기본값은 5입니다."

 

kn49 = KNeighborsClassifier(n_neighbors=49) # 참고 데이터를 49개로 한 kn49 모델

 

"fish_data의 데이터 49개 중에 도미가 35개로 다수를 차지하므로 어떤 데이터를 넣어도 무조건 도미로 예측할 것입니다."

 

kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)

# 출력 결과물
0.7142857142857143

 

# 49마리의 생선 중 35마리만 조건을 만족한다면 정확도는?
print(35/49)

# 출력 결과물
0.7142857142857143

 

실제 코랩에 작성한 손코딩

 

복습 및 정리:

"특성은 데이터를 표현하는 하나의 성질"

"머신러닝 알고리즘이 데이터에서 규칙을 찾는 과정을 훈련이라고 합니다."

"k-최근접 이웃 알고리즘은 가장 간단한 머신러닝 알고리즘 중하나이며, 사실 어떤 규칙을 찾기보다는 전체 데이터를 메모리에 가지고 있는 것이 전부입니다."

"머신러닝 프로그램에서는 알고리즘이 구현된 객체를 모델이라고 부릅니다."

"정확도는 정확한 답을 몇 개 맞혔는지를 백분율로 나타낸 값입니다."

To-Be:

Chapter 02. 데이터 다루기

 

# page 65 ~ 73

Chapter 02. 데이터 다루기:

핵심 키워드:

  • 지도 학습
  • 비지도 학습
  • 훈련 세트
  • 테스트 세트

지도 학습과 비지도 학습:

"머신러닝 알고리즘은 크게 지도 학습(supervised learning)과 비지도 학습(unsupervised learning)으로 나눌 수 있습니다."

 

"지도 학습에서는 데이터와 정답을 입력(input)과 타깃(target)이라고 하고, 이 둘을 합쳐 훈련 데이터(training data)라고 부릅니다."

"그리고 앞서 언급했듯이 입력으로 사용된 길이와 무게를 특성(feature)이라고 합니다."

 

"지도 학습은 정답(타깃)이 있으니 알고리즘이 정답을 맞히는 것을 학습합니다."

 

"반면 비지도 학습 알고리즘은 타깃 없이 입력 데이터만 사용합니다."

 

"머신러닝 알고리즘은 지도 학습, 비지도 학습 외에 강화 학습(reinforcement learning)을 또 다른 종류로 크게 분류합니다."

  • 강화 학습 알고리즘은 타깃이 아니라 알고리즘이 행동한 결과로 얻은 보상을 사용해 학습
  • 이 책에서 강화 학습을 다루지는 않습니다.

훈련 세트와 테스트 세트:

"평가를 위해 또 다른 데이터를 준비하거나 이미 준비된 데이터 중에서 일부를 떼어 내어 활용하는 것입니다."

"일반적으로 후자의 경우가 많습니다."

"평가에 사용하는 데이터를 테스트 세트(test set), 훈련에 사용되는 데이터를 훈련 세트(train set)라고 부릅니다."

 

"훈련할 때 사용하지 않은 데이터로 평가해야 합니다."

"이를 위해 훈련 데이터에서 일부를 떼어 내어 테스트 세트로 사용하겠습니다."

 

모두 코랩을 열어주시길 바랍니다 :)

 

 

"먼저 1장에서처럼 도미와 빙어의 데이터를 합쳐 하나의 파이썬 리스트로 준비합니다."

  • 각 코드 블록 부분을 새로운 코랩 노트북에 입력해주세요.
  • 숫자를 손으로 모두 입력하려면 번거롭습니다.
도미와 빙어 데이터
  물고기 길이 = [ 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 , 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 ]
  물고기 무게 = [ 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 , 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 ]

 

다음 노트북을 참고해 보세요.
https://colab.research.google.com/drive/1OLlvwLdobQ-7gT10hSwF-kLMSSeyHENS#scrollTo=ULTsFua3bn4H

 

# 데이터를 리스트로 준비

fish_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, 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]
fish_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, 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]

 

"이제 두 파이썬 리스트 순회하면서 각 생선의 길이와 무게를 하나의 리스트로 담은 2차원 리스트를 만들겠습니다."

 

fish_data = [[l,w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1] * 35 + [0] * 14

 

"이 때 하나의 생선 데이터를 샘플(sample)이라고 부릅니다."

 

위의 상황에선 총 49개의 샘플이 존재! + 사용하는 특성은 길이와 무게 2개!

 

"이 데이터의 처음 35개를 훈련 세트로, 나머지 14개를 테스트 세트로 사용하겠습니다."

 

"사이킷런의 KNeighborsClassifer 클래스를 임포트하고 모델 객체를 만듭니다."

 

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

 

"이제 전체 데이터에서 처음 35개를 선택해야 합니다."

"일반적으로 리스트처럼 배열의 요소를 선택할 때는 배열의 위치, 즉 인덱스(index)를 지정합니다."

 

# 인덱스 활용
print(fish_data[4])

# 출력 결과물
[29.0, 430.0]

 

"파이썬 리스트 인덱스 외에도 슬라이싱(slicing)이라는 특별한 연산자를 제공합니다."

"슬라이싱은 콜론(:)을 가운데 두고 인덱스의 범위를 지정하여 여러 개의 원소를 선택할 수 있습니다."

 

# 슬라이싱 예시
print(fish_data[0:5])

# 출력 결과물
[[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0]]

 

"슬라이싱을 사용할 때는 마지막 인덱스의 원소는 포함되지 않는다는 점을 주의해야 합니다."

 

"이를 응용하면 생선 데이터에서 처음 35개와 나머지 14개를 선택하는 것을 간단하게 처리할 수 있습니다."

 

# 훈련 세트로 입력값 중 0부터 34번째 인덱스까지 사용
train_input = fish_data[:35]

# 훈련 세트로 타깃값 중 0부터 34번째 인덱스 까지 사용
train_target = fish_target[:35]

# 테스트 세트로 입력값 중 35번째부터 마지막 인덱스까지 사용
test_input = fish_data[35:]

# 테스트 세트로 타깃값 중 35번째부터 마지막 인덱스까지 사용
test_target = fish_target[35:]

 

"데이터를 준비했으니 훈련 세트로 fit() 메서드를 호출해 모델을 훈련하고, 테스트 세트로 score() 메서드를 호출해 평가해 보겠습니다."

 

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

# 출력 결과물
0.0

# 정확도가 0.0.....?!

샘플링 편향:

"이렇게 마지막 14개를 테스트 세트로 떼어 놓으면 훈련 세트에는 빙어가 하나도 들어 있지 않잖아요."

"빙어 없이 모델을 훈련하면 빙어를 올바르게 분류할 수가 없죠."

"훈련 세트와 테스트 세트를 나누려면 도미와 빙어가 골고루 섞이게 만들어야 해요."

 

"일반적으로 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링이 한쪽으로 치우쳤다는 의미로 샘플링 편향(sampling bias)이라고 부릅니다."

 

"훈련세트와 테스트 세트를 나누기 전에 데이터를 섞든지 아니면 골고루 샘플을 뽑아서 훈련 세트와 테스트 세트를 만들어야 합니다."

"이런 작업을 간편하게 처리할 수 있도록 새로운 파이썬 라이브러리인 넘파이에 대해 알아보겠습니다."

# To Be...

  • 넘파이(numpy)

두 번째 머신러닝 프로그램:

이전에 만든 훈련 세트와 테스트 세트로 k-최근접 이웃 모델을 훈련시켜 봅시다.

fit() 메서드를 실행할 때마다 KNeighborsClassifier 클래스의 객체는 이전에 학습한 모든 것을 잃어버립니다.

이전 모델을 그대로 두고 싶다면 KNeighborsClassifier 클래스 객체를 새로 만들어야 합니다.

 

kn = kn.fit(train_input, train_target)

kn.score(test_input, test_target)

# 출력 결과물
1.0

 

100%의 정혹도로 테스트 세트에 있는 생성 확인 가능!

 

 

predict() 메서드로 테스트 세트의 예측 결과와 실제 타깃 비교:

kn.predict(test_input)

# 출력 결과물
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])

test_target

# 출력 결과물
array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])

 

전체 소스 코드 링크:

넘파이:

"넘파이(numpy)는 파이썬의 대표적인 배열(array) 라이브러리입니다.

  • 파이썬의 리스트로 2차원 리스트를 표현할 수 있지만 고차원 리스트를 표현하려면 매우 번거롭습니다.
  • 넘파이는 고차원의 배열을 손쉽게 만들고 조작할 수 있는 간편한 도구를 많이 제공합니다.
    • 차원(dimension)이란 말은 조금씩 다른 의미로 쓰일 수 있습니다.
    • 배열에서 차원은 좌표계의 축과 같습니다.
    • 1차원 배열은 선, 2차원 배열은 면, 3차원 배열은 공간을 나타냅니다.
    • 보통의 xy 좌표계와는 달리 시작점이 왼쪽 아래가 아니고 왼쪽 위에서부터 시작합니다.

 

"먼저 넘파이 라이브러리를 임포트합니다."

 

"넘파이 array() 함수에 파이썬 리스트를 전달하면 끝입니다."

 

import numpy as np

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

print(input_arr)

# 출력 결과물
[[  25.4  242. ]
 [  26.3  290. ]
 [  26.5  340. ]
 [  29.   363. ]
 [  29.   430. ]
 [  29.7  450. ]
 [  29.7  500. ]
 [  30.   390. ]
 [  30.   450. ]
 [  30.7  500. ]
 [  31.   475. ]
 [  31.   500. ]
 [  31.5  500. ]
 [  32.   340. ]
 [  32.   600. ]
 [  32.   600. ]
 [  33.   700. ]
 [  33.   700. ]
 [  33.5  610. ]
 [  33.5  650. ]
 [  34.   575. ]
 [  34.   685. ]
 [  34.5  620. ]
 [  35.   680. ]
 [  35.   700. ]
 [  35.   725. ]
 [  35.   720. ]
 [  36.   714. ]
 [  36.   850. ]
 [  37.  1000. ]
 [  38.5  920. ]
 [  38.5  955. ]
 [  39.5  925. ]
 [  41.   975. ]
 [  41.   950. ]
 [   9.8    6.7]
 [  10.5    7.5]
 [  10.6    7. ]
 [  11.     9.7]
 [  11.2    9.8]
 [  11.3    8.7]
 [  11.8   10. ]
 [  11.8    9.9]
 [  12.     9.8]
 [  12.2   12.2]
 [  12.4   13.4]
 [  13.    12.2]
 [  14.3   19.7]
 [  15.    19.9]]

 

"눈으로 확인하는 것 외에도 넘파이 배열 객체는 배열의 크기를 알려주는 shape 속성을 제공합니다."

 

# shape 속성 사용
## 해당 속성을 사용하면 (샘플 수, 특성 수)를 출력합니다
print(input_arr.shape)

# 출력 결과물
(49, 2)

 

"이제 생선 데이터를 넘파이 배열로 준비했으므로 이 배열에서 랜덤하게 샘플을 선택해 훈련 세트와 테스트 세트로 만들 차례입니다."

 

"여기에서는 배열을 섞은 후에 나누는 방식 대신에 무작위로 샘플을 고르는 방법을 사용하겠습니다."

 

"한 가지 주의할 점은 input_arr와 target_arr에서 같은 위치는 함께 선택되어야 한다는 점입니다."

 

"이렇게 하려면 훈련 세트와 테스트 세트로 나눌 인덱스값을 잘 기억해야겠군요."

"항상 인덱스값을 기억할 수는 없으니 다른 방법이 필요합니다."

 

"넘파이 arange() 함수를 사용하면 0에서부터 48까지 1씩 증가하는 인덱스를 간단히 만들 수 있습니다."

  • 넘파이에서 무작위 결과를 만드는 함수들은 실행할 때마다 다른 결과를 만듭니다.
  • 일정한 결과를 얻으려면 초기에 랜덤 시드(random seed)를 지정하면 됩니다.
  • 책과 동일한 실습 결과를 얻을 수 있도록 랜덤 시드를 42로 지정
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

 

"넘파이 arange() 함수에 정수 N을 전달하면 0에서부터 N-1까지 1씩 증가하는 배열을 만듭니다."

 

"넘파이 random 패키지 아래에 있는 shuffle() 함수는 주어진 배열을 무작위로 섞습니다."

 

print(index)

# 출력 결과물
[13 45 47 44 17 27 26 25 31 19 12  4 34  8  3  6 40 41 46 15  9 16 24 33
 30  0 43 32  5 29 11 36  1 21  2 37 35 23 39 10 22 18 48 20  7 42 14 28
 38]

 

"랜덤하게 섞인 인덱스를 사용해 전체 데이터를 훈련 세트와 테스트 세트로 나누어 보죠."

"넘파이는 슬라이싱 외에 배열 인덱싱(array indexing)이란 기능을 제공합니다."

"배열 인덱싱은 1개의 인덱스가 아닌 여러 개의 인덱스로 한 번에 여러 개의 원소를 선택할 수 있습니다."

 

"예를 들면 다음처럼 input_arr에서 두 번째와 네 번째 샘플을 선택하여 출력할 수 있습니다."

 

print(input_arr[[1,3]])

# 출력 결과물
[[ 26.3 290. ]
 [ 29.  363. ]]

 

"비슷한 방식으로 리스트 대신 넘파이 배열을 인덱스로 전달할 수도 있습니다."

"앞서 만든 index 배열의 처음 35개를 input_arr와 target_arr에 전달하여 랜덤하게 35개의 샘플을 훈련 세트로 만들겠습니다."

 

train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]

 

"나머지 14개를 테스트 세트로 만들어 보겠습니다."

 

test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

 

"모든 데티거 준비되었네요."

"훈련 세트와 테스트 세트에 도미와 빙어가 잘 섞여 있는지 산점도로 그려 보죠."

 

import matplotlib.pyplot as plt
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(test_input[:,0], test_input[:,1])
plt.xlabel('length')
plt.ylabel('weight')
plt.show

 

 

"파란색이 훈련 세트이고 주황색이 테스트 세트입니다."

"의도한 대로 만들어진 것 같습니다."

 

"이제 모델을 다시 훈련시켜 보죠."

 

 

 

# To Be...

두 번째 머신러닝 프로그램

 

마무리 정리:

키워드로 끝내는 핵심 포인트:

  • 지도학습은 입력과 타깃을 전달하여 모델을 훈련한 다음 새로운 데이터를 예측하는 데 활용합니다. 1장에서부터 사용한 k-최근접 이웃이 지도 학습 알고리즘입니다.
  • 비지도 학습은 타깃 데이터가 없습니다. 따라서 무엇을 예측하는 것이 아니라 입력 데이터에서 어떤 특징을 찾는 데 주로 활용합니다.
  • 훈련 세트는 모델을 훈련할 때 사용하는 데이터입니다. 보통 훈련 세트가 클수록 좋습니다. 따라서 테스트 세트를 제외한 모든 데이터를 사용합니다.
  • 테스트 세트는 전체 데이터에서 20~30%를 테스트 세트로 사용하는 경우가 많습니다. 전체 데이터가 아주 크다면 1%만 덜어내도 충분할 수 있습니다.

 

핵심 패키지와 함수:

numpy

  • seed()는 넘파이에서 난수를 생성하기 위한 정수 초깃값을 지정합니다. 초깃값이 같으면 동일한 난수를 뽑을 수 있습니다. 따라서 랜덤 함수의 결과를 동일하게 재현하고 싶을 때 사용합니다.
  • arrange()는 일정한 간격의 정수 또는 실수 배열을 만듭니다. 기본 간격은 1입니다. 매개변수가 하나이면 종료 숫자를 의미합니다. 0에서 종료 숫자까지 배열을 만듭니다. 종료 숫자는 배열에 포함되지 않습니다.
    • 매개변수가 2개면 시작 숫자, 종료 숫자를 의미합니다.
    • 매개변수가 3개면 마지막 매개변수가 간격을 나타냅니다.
  • shuffle()은 주어진 배열을 랜덤하게 섞습니다. 다차원 배열의 경우 첫 번째 축(행)에 대해서만 섞습니다.

 

 

 

 

감사합니다 :) 

 
728x90
반응형
LIST