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

챕터 01

codehunter 2023. 7. 2. 14:14

이 글은 혼자 공부하는 머신러닝 + 딥러닝 (한빛미디어 2020)이라는 책을 공부하면서 정리한 글이다.

 

인공지능이란?

역사

좀 더 자세한 역사는 다른 글이나 영상에서 언급되어 있기 때문에 여기서는 간단히 중요 사건만 정리해보면

최초의 언급은 150년전 소설에서 등장한다. 그후에는 막연히 공상과학 소설에서나 간간히 등장하던 개념이 1943년 워런매컬러와 월터 피츠가 최초로 뇌의 뉴런 개념을 발표하면서 인공지능이라는 개념이 실체화되기 시작한다. 이후 1950년에 그 유명한 엘런 튜링이 튜링 테스트를 발표하고 1956년에 다트머스 AI 컨퍼런스에서 인공지능에 대한 전망이 최고조에 도달하게 된다. 1957년에는 프랑크 로젠블라트의 퍼셉트론이라는 중요한 AI연구의 기본이 되는 알고리즘이 발표된다. 1959년에 데이비드 허블과 토르스텐비셀이 고양이를 사용해 시각 피질에 있는 뉴런기능을 연구했다.

이처럼 활발히 연구되는 AI가 컴퓨터의 한계로 인해 1970년~1980년 사이에는 연구와 투자가 크게 감소했는데 AI의 겨울이라고 언급하게 됐고 80년대에 다시 전문가 시스템이라는 AI 붐이 일었지만 데이터의 활용을 못해 다시 한계에 다다르게 되었다.

이후 관심은 적어도 계속 연구는 되다가 컴퓨터성능의 발전과 여러 알고리즘의 발전에 힘입어 2012년부터 합성곱 방식의 알렉스넷의 방식이 널리 쓰이면서 본격적인 AI붐이 다시 일게 되었고 2015년에는 구글에서 텐서플로라는 딥러닝 라이브러리가 발표되면서 일반 개발자들도 쉽게 사용할수 있게 되었다.

이처럼 여러차례의 한계와 상승기를 거쳐 요즘의 ChatGPT에 이르러 실생활에 본격적으로 적용하는 단계까지 오게 된것이다.

 

머신러닝

인공지능의 하위 파트중에 하나로 규칙을 일일히 프로그래밍 하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야

대표적인 머신러닝 라이브러리는 사이킷런이 있다.

 

답러닝

머신러닝의 하위 파트중에 하나로 인공 신경망을 기반으로 한 방법들을 통칭하는 딥러닝이라고 부른다.

대표적인 딥러닝 라이브러리는 텐서플로가 있다.

이 책의 7장부터 9장까지는 텐서플로를 사용한 딥러닝 알고리즘을 다룬다.

 

개발환경

언어환경 : 파이썬

통합 개발 환경 : 구글 코랩(웹 브라우저에서 무료로 파이썬 프로그램을 테스트하고 저장할 수 있는 서비스)

필요한 API : 사이킷런, 텐서플로 (이런것들은 코랩에서 기본 제공)

 

코랩 접속후 연습하기

 

챕터 01-3 마켓과 머신러닝

문제 : 생선 길이로 생선 무게로 도미 알아내기

도미 35마리의 길이와 무게 데이터와

빙어 14마리의 길이와 무게 데이터의 합인

생선 49마리의 길이와 무게 데이터가 주어지는데 저 중에 어떤것이 도미인지 그외의 것이지를 나타내는 정답데이터도 함께 주어진다. 이 데이터들을 가지고 훈련을 한 다음 다시 이 생선 데이터를 가지고 다시 예측을 해보면 100%의 정답율을 가진 모델을 얻게된다. (당연하게도 훈련한 데이터로 그대로 다시 예측을 했으니...)

이번 챕터에서는 전체적으로 어떤식으로 문제를 풀어가면 좋을지 연습해보는 챕터라고 보면 된다. 

데이터 입력 및 파악, 훈련하는 법, 예측하는 법 이 세가지 순서대로 진행하면 된다.

 

데이터 입력 및 파악

35마리, 14마리의 도미와 빙어의 각각 길이, 무게 데이터가 배열형식으로 제공되었고 코랩에 다음과 같이 입력할수 있다.

 

그럼 이 데이터가 어떤식으로 패턴을 이루고 있는지 그래프로 바로 그려볼수 있는데 두 데이터를 나란히 그려보면 된다.

그래프를 그리는 자세한 문법사항등은 책을 참조하면 되고 전체를 어떤식으로 작업해 나가는지 파악하는게 중요하다고 본다.

주황색인 빙어 데이터들인데 도미에 비해 길이와 무게 모두 작은걸 파악할수 있다. 이제 프로그램으로 이걸 훈련시켜보자

 

훈련하는 법

이 챕터에서 사용하는 머신러닝 패키지는 사이킷 런이다. 이 패키지를 사용하려면 문법에 맞게 데이터를 가공해야 하는데 역시 자세한건 책을 참조하자. 아무튼 도미와 빙어의 길이 데이터, 도미와 빙어의 무게 데이터를 한데 합쳐서 2차원 데이터를 만든다.

이렇게 전체 데이터를 만들고 (fish_data), 이 중에 어떤 데이터가 정답인지 알려주는 데이터도 준비해서(fish_target) 사이킷런 패키지 중에서 k-최근접 이웃 알고리즘(KNeighborsClassifier)을 구현한 클래스를 이용해서 훈련한다.

 

역시 중요한건 문법이 아니고 KNeighborsClassifier (모델)의 fit 메서드를 이용해서 훈련시킨다는 개념과 그 훈련시킨 결과값이 1.0 즉 100% 로 모든 데이터를 맞첬다는 개념이다. 

여기서 k-최근접 이웃 알고리즘은 어떤 데이터가 있을때 주변 데이터들과의 거리로 주어진 데이터가 어느쪽에 속하는지 판단하는 알고리즘이다.

 

예측하는 법

주어진 데이터에는 없는 새로운 데이터를 위 훈련시킨 모델에 적용하면 어떻게 나올까?

길이 30, 무게 600짜리 물고기는 1 즉 도미로 판정되는걸 알 수 있다.

 

이렇게 데이터 준비 및 파악 -> 훈련 -> 예측의 전체 과정을 거쳐서 머신러닝이 어떤식으로 동작하는지 이해의 첫 걸음을 떼었다고 할 수 있겠다.

 

최종코드와 스크린샷

## 생선 분류 문제
### 도미 데이터 준비하기
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]
                

### 도미 데이터 추세 파악해보기
import matplotlib.pyplot as plt

plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

### 빙어 데이터 준비하기
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(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

## 첫 번째 머신러닝 프로그램
### 데이터를 모델에 쓸수 있게 2차 리스트로 만들기
length = bream_length + smelt_length
weight = bream_weight + smelt_weight

fish_data = [[l, w] for l, w in zip(length, weight)]
print(fish_data)

fish_target = [1] * 35 + [0] * 14
print(fish_target)

### 데이터를 가지고 훈련시키기
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)
kn.score(fish_data, fish_target)

### 임의의 데이터로 확인해보기
kn.predict([[30, 600]])

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.scatter(30, 600, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

### 최적의 이웃 갯수 찾기
for n in range(5, 50):
  kn.n_neighbors = n
  score = kn.score(fish_data, fish_target)
  print("n:", n, ", score:", score)

  if score < 1:
    print(n, score)
    break

'AI > 혼자 공부하는 머신러닝+딥러닝 책' 카테고리의 다른 글

챕터 03 - 3  (0) 2023.07.15
챕터 03 - 2  (0) 2023.07.15
챕터 03 - 1  (0) 2023.07.10
챕터 02 - 2  (1) 2023.07.08
챕터 02 - 1  (0) 2023.07.06