본문 바로가기
머신러닝/혼공머신

[혼공머신] chapter 1. 머신러닝이란?

by 다이노소어 2022. 11. 17.
혼자 공부하는 머신러닝 + 딥러닝의 Chapter 1을 공부하면서 정리한 내용을 기반으로 작성하였다.

 

 

 

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


인공지능

인공지능(artificial intelligence)는 사람처럼 학습/추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술이다. 인공지능의 역사는 80년 정도이다.

인공지능 태동기 1950년 앨런 튜링이 튜링 테스트를 발표한다. 튜링테스트(Turing Test)는 인공지능이 사람과 같은 지능을 가졌는지 테스트 하는 것이다. 이후, 1956년 다크머스 AI 컨퍼런스에서는 인공지능의 전망이 굉장히 긍정적으로 보여졌다.
인공지능 황금기 1957년 프랑크 로젠블라트가 로지스틱 희귀의 초기 버전으로 볼 수 있는 퍼셉트론(Perceptron)을 발표했다. 1959년에는 데이비드 허블과 토르스텐 비셀이 시가 피질에 있는 뉴런 기능을 연구했다
AI 겨울 첫 번째 AI 겨울은 컴퓨터 성능의 한계로 간단한 문제를 해결하는 것에 그치면서 도래했고, 이 시기에는 인공지능에 대한 연구나 투자가 급감했다. 두 번째 AI 겨울은 첫 번째 AI 겨울 이후, 전문가 시스템(expert system)이 등장하고 AI 붐이 일어났지만 한계에 다다르면서 도래했다.

 

인공지능은 2가지로 나눠서 살펴볼 수 있는데, 현재 우리가 흔히 접하는 인공지능은 약인공지능(Week AI)로, 특정 분야에서 사람의 일을 도와주는 보조 역할만 가능하다. 알파고나, 자율주행 자동차, 음악 추천 등이 그 예이다. 또한, 영화에 나오는 인공일반지능(artificial general intelligence) 혹은 강인공지능(Strong AI)으로 분류할 수 있다. 이는 사람과 구분하기 어려운 정도의 지능을 가진다.

 

 

머신러닝

머신러닝(machine learning)은  인공지능의 하위 분야 중 지능을 구현하기 위한 소프트웨어를 담당하는 핵심분야이다. 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야이다.

 

머신러닝은 통계학과 깊은 관련이 있어 통계학에서 유래된 머신러닝 알고리즘이 많이 있으며 여전히 통계학과 컴퓨터 과학 분야가 상호작용하면서 발전하고 있다. 다만, 최근 들어 통계와 같은 수학이론보다 경험을 바탕으로 발전하는 경우가 많고, 이러한 발전은 컴퓨터 과학 분야가 이끌고 있다.

통계, 수학이론 R이 대표적인 오픈소스 통계 소프트웨어로 볼 수 있다.
경험 사이킷런(scikit-learn)이 컴퓨터 과학 분야의 대표적인 머신러닝 라이브러리로 볼 수 있다

 

사이킷런 라이브러리에 대해 좀 더 살펴보자.

 사이킷런 라이브러리는 파이썬 API를 사용하며 컴파일하지 않아도 되기 때문에, 쉽게 쓸 수 있다. 현재 큰 인기를 얻고 있는 라이브러리로, 이 외의 대표적인 다른 머신러닝 라이브러리를 찾기 힘들다.

 사이킷런 라이브러리에 모든 머신러닝 알고리즘이 포함되어 있지는 않다. 연구자들이 끊임없이 알고리즘을 연구/개발하고 시간이 어느정도 지나서 해당 알고리즘이 유익하다는 것이 증명되고 널리 사용될 때, 이 사이킷런 라이브러리 개발자들이 이 알고리즘을 라이브러리에 추가한다. 그렇기 때문에, 머신러닝 라이브러리에 포함된 알고리즘들은 안정적이고 성능이 검증되어 있다.

 

 

딥러닝

딥러닝(deep learning)은  머신러닝 알고리즘의 하위 분야 중 인공 신경망(artificial neural network)를 기반으로 한 방법들을 통칭한다. 종종 인공 신경망과 딥러닝을 크게 구분하지 않기도 한다.

 

 1998년 얀 르쿤이 신경망 모델 'LeNet-5' 를 만들어 손글씨 숫자를 인식하는 데 성공했다. 이 'LeNet-5'의 이름을 가진 신경망은 최초의 합성곱 신경망이다. 이 후, 2012년 이미지 분류 대회(ImageNet)에서 제프리 힌턴의 팀이 AlexNet이라는 이름의 모델로 압도적인 성능을 증명하며 우승했다. 이때에도 합성곱 신경망을 사용했고, 그러면서 합성곱 신경망이 이미지 분류 작업에 널리 사용되기 시작했다.

 국내에서는 2016년 이세돌과 알파고의 대국으로 딥러닝에 대한 관심이 크게 높아졌다.

 

LeNet-5, AlexNet이 압도적인 성능을 가진 요인으로

  1. 풍부한 데이터
  2. 컴퓨터 성능의 향상
  3. 혁신적인 알고리즘 개발

이렇게 3가지를 꼽을 수 있다.

 

2015년 구글은 딥러닝 라이브러리인 텐서플로(TensorFlow)를 오픈소스로 공개했고, 2018년 페이스북(meta)도 파이토치(PyTorch) 딥러닝 라이브러리를 오픈소스로 공개했다. 이 두 라이브러리 모두 인공 신경망(딥러닝) 알고리즘을 전문으로 다루면서도 파이썬 API를 제공하고 있다

 

 

 

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


구글 코랩

 구글 코랩(Colab)은 클라우드 기반의 주피터 노트북 개발 환경이다. 웹 브라우저에서 파이썬 프로그램을 테스트하고 저장할 수 있다. 코팹 파일을 노트북 (혹은 코랩 노트북)이라고 부른다.

 코랩 노트북은 구글 클라우드의 가상 서버(Virtual Machine)을 사용하여 구글 클라우드의 컴퓨트 엔진에 연결되어 있다.무료로 이용한다는 가정 하에, 동시에 사용할 수 있는 구글 클라우드 가상서버는 최대 5개이며 1개의 노트북을 12시간이상 실행할 수는 없다.

 노트북의 제목은 파일 이름으로도 사용되며, 노트북의 셀(cell)은 코드 또는 텍스트 덩어리가 될 수 있다. 텍스트 셀에서는 HTML과 Markdown을 혼용해서 사용할 수 있다. 코드 셀로 이동하면 코드와 결과가 함께 선택된다.

 

텍스트 셀에 사용할 수 있는 마크다운

**텍스트** 텍스트
*텍스트*
_텍스트_
텍스트
~~~텍스트~~~ 텍스트
`print('hello world!')` 백틱 기호를 사용해서 코드 서체로 쓴다
> 텍스트  들여쓰기한다
* 텍스트
- 텍스트
글머리 기호 목록을 만든다
[네이버] (https://www.naver.com/) 네이버
![네이버로고[(https://s.pstatic.net/static/www/mobile/edit/20221116/mobile_165357418217.png) 네이버로고이미지
$y = x \times z$  레이텍을 추가한다
*레이텍(LaTeX) : 수식, 그래프, 다이어그램 등을 그리는 데 유용한 문서 저작도구

 

 

01-3. 마켓과 머신러닝


해당 장에서는 가장 간단한 머신러닝 알고리즘 중 하나인 k-최근점 이웃을 사용하여 두 종류를 분류하는 머신러닝 모델을 훈련한다

 

생선 데이터

 

30cm이상이면 그 생선이 도미라고 전해들었다고 해서, 무조건적으로 30cm보다 큰 생선이 무조건 도미일 수는 없다.
보통은 if(fish_len >= 30 && fish_len <=40) ...와 같은 코드를 구성해야 하지만, 머신러닝으로 이러한 문제를 해결할 수 있다. 머신러닝은 스스로 기준을 찾아서 일을 수행한다.  즉, 누가 말해주지 않아도 머신러닝은 30~40cm 길이의 생선이 도미라는 기준을 스스로 찾는 것이다.

 

머신러닝에서는 여러 종류(혹은 클래스(class)) 중 하나를 구별해하는 문제를 분류(classification)이라고 하고, 두 개의 클래스에서 하나를 고르는 것을 이진 분류(binary classification)이라고 한다.

 

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]

#빙어 데이터
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]

 

2. 산점도 그래프 그리기

맷플롯립(matplotlib)은 파이썬에서 과학계산용 그래프를 그리는 대표적인 패키지이다. 맷플롯립에는 산점도(scatter plot; 값을 점으로 표시하는 그래프)를 그리는 scatter() 함수가 내장되어 있다. scatter()함수를 연달아 사용하면, 2개의 산점도를 한 그래프로 그릴 수 있다.

import matplotlib.pyplot as plt

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

 

 

첫 번째 머신러닝 프로그램

도미와 빙어데이터를 가지고 k- 최근접 이웃(k-Nearest Neighbors) 알고리즘을 사용해 도미를 찾아낸다. k- 최근접 이웃 알고리즘을 위해서는 데이터를 모두 가지고 있기만 하면 되고, 새로운 데이터에 대해서 예측할 때는 가장 가까운 직선거리에 있는 데이터들을 살핀다. 이러한 특징으로 인해, k-최근접 이웃 알고리즘은 데이터가 매우 많을 경우 취약하다. 데이터가 그기 때문에 많은 메모리가 필요하고 직선 거리 계산에 많은 시간이 필요하기 때문이다.

 

사이킷런(scikit-learn) 머신러닝 패키지를 사용할 것이고, 이 패키지를 사용하려면 2차원 리스트가 필요하다. 

 

1. 2차원 리스트(리스트의 리스트)

앞서 가져온 데이터를 2차원 리스트로 바꾸기 위해, 파이썬의  list comprehension 구문과 zip() 함수를 사용한다.

length = bream_length+smelt_length
weight = bream_weight+smelt_weight

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

 

머신러닝 알고리즘이 생선의 길이, 무게를 보고 생선을 구분하게 하기 위해서 어떤 생선인지 알려준다. 머신러닝에서 두 개를 구분할 때는 찾으려는 대상을 1, 그 외의 것을 0으로 둔다. 이 예제에서는 도미를 찾기 때문에, 도미가 1로 둔 것이다.

fish_target = [1]*35 + [0]*14

 

 

2. 모델 훈련(training) 및 평가

훈련은 모델에 데이터를 전달해서 규칙을 학습하게 하는 과정을 말한다.이 때, 사이킷런에서 제공하는 fit() 메서드를 이용해서 데이터를 인자로 주고 알고리즘을 훈련한다.

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)

 

사이킷런에서 제공하는 score() 메서드를 이용하면, 0 ~ 1 값을 반환하여 모델의 정확도(accuracy)를 확인할 수 있다. 즉, 1.0을 반환하면 정확도 100%인 셈이다.

kn.score(fish_data, fish_target)

 

3. 예측

새로운 데이터에 대해 예측할 때에는 predict() 함수를 사용한다.

kn.predict([[30, 600]])

 

 

4. 참고 데이터 범위 설정

사이킷런의 KNeighborsClassfier 클래스는 _fit_X 속성에는 우리가 전달한 데이터가, _y 속성에는 우리가 전달한 타겟팅 데이터가 들어 있다.

# kn._fit_X
# kn._y

 

KNeighborsClassfier의 기본 참고 데이터는 근방 5개이고, n_neighbors 매개변수를 이용해서 바꿀 수 있다.

kn49 = KNeighborsClassifier(n_neighbors=3)

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