본문 바로가기
스터디&프로젝트/데이터사이언스

[혼자 공부하는 머신러닝+딥러닝] 01나의 첫 머신러닝

반응형

 

오늘의 다짐: 진짜진짜 새로 접하는 분야 .. 너무 신나는데.. 하고 싶은 것 말고 해야 할 것도 잊지 말자.

*** 해당 글은 [한빛미디어 출판 / 박해선 지음] "혼자 공부하는 머신러닝+딥러닝" 책과, 인프런에서 무료로 제공하고 있는 혼자 공부하는 머신러닝+딥러닝 강의를 기반으로 작성함 ***


01 나의 첫 머신러닝

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

인공지능이란

인공지능 Artificial Intelligence

: 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술

 

인공지능의 역사 간단하게 훑기

➡️ 1943년 워런 매컬러,월터 피츠 최초로 뇌의 뉴런 개념 발표

➡️ 1950년 앨런 튜링의 튜링 테스트 - 인공지능이 사람과 같은 지능을 가졌는지 테스트

➡️ 1956년 다트머스 AI컨퍼런스 - 이때 인공지능에 대한 장미빛 미래를 예견하나, 나중에 틀렸다는 게 증명되며 실망ㅠㅠ

--- 황금기 ✨ ---

➡️ 1957년 프랑크 로젠블라트가 퍼셉트론 발표 - 앞으로 공부하며 자주 언급될 개념! 인공신경망의 가장 기본이 되는 알고리즘

➡️ 1959년 데이비드 허블,토르스텐 비셀 고양이를 사용하여 시각 피질에 있는 뉴런 연구 - 우리가 복잡한 형태를 인식하는 과정에 대하여 밝히는 기초가 되었음

--- 황금기 끝 ---

➡️ 1차 AI 겨울 - 컴퓨터의 성능이 따라주지 못하면서 ... ai에 대한 관심 하락

(전문가 시스템이 등장하며 두 번째 AI붐이 불었으나, 다시 한계를 드러냄)

➡️ 2차 AI 겨울 - 이때 꾸준히 연구했던 연구자들이 요즘에 와서 큰 성과를 이루어냈다고 볼 수 있음

--- 겨울 극복 이후 ---

➡️ LeNet-5 - 합성곱신경망, 최초로 우편번호 숫자를 인식하는 시스템을 실전에 적용했음

➡️ AlexNet - 합성곱신경망, 기존의 전통적인 방식보다 훨씬 더 작은 이미지에 있는 여러 물체를 잘 구분하는 것에 성공했음

➡️ 텐서플로 - 구글에서 딥러닝 라이브러리를 대중화 (기존에 있긴 했음 !)

이후 새로운 사건도 있고, 나온 라이브러리도 너무나 많기 때문에 하나하나 나열하기는 어렵다

 

🔎전문가 시스템이 뭐지? (from 위키백과)

인간이 특정분야에 대하여 가지고 있는 전문적인 지식을 정리하고 표현하여 컴퓨터에 기억시킴으로써, 일반인도 이 전문지식을 이용할 수 있도록 하는 시스템이다

 

🔎강인공지능 VS 약인공지능

1. 강인공지능 / 인공일반지능 artificial general intelligence

: 우리가 영화에서 자주 보는 사람과 구분하기 어려운 지능을 가진 컴퓨터 시스템 

2. 약인공지능 Week AI

: 현실에서 우리가 마주하고 있는 인공지능


머신러닝이란

머신러닝 Machine Learning

: 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야

: 인공지능의 하위분야 중에서도 '지능'을 구현하기 위해 소프트웨어를 담당하는 핵심 분야

 

머신러닝은 통계학과 깊은 관련이 있었으므로, 대표적인 오픈소스 통계 소프트웨어인 R에 다양한 머신러닝 알고리즘이 구현되어있었다.

그러나, 최근 머신러닝의 발전은 (통계, 수학적 이론)보다 (경험)을 바탕으로 발전하는 경우가 많으며, 대표적인 라이브러리로 '사이킷런 scikit-learn'을 소개할 수 있다.

 

 

어떤 알고리즘이 개발되어서보편적으로 옳고 안정적이라고 생각하면 ➡️ 널리 쓰이게 하기 위해 라이브러리로 유통이 되는데,

대표적인 머신러닝 알고리즘은 scikit, 파이썬 api를 두고 있으며,

대표적인 딥러닝 알고리즘은 텐서플로우, 파이썬 api를 두고 있다.

 

예전의 폐쇄적인 구조와 달리, 모두가 접근이 가능해지며 

새로운 이론과 기술은 직접 코드로 구현되고 통용되어야 그 가치를 입증할 수 있게 되었다. 이런 기조는 딥러닝 분야에서 더욱 증폭되었다!

( .. 이부분이 인상깊었다 .. 접근성이 높아진 만큼, 아무리 뛰어난 기술이더라도 많은 사람들에게 쉽고 편리하게 증명할 수 있어야 관심을 끌 수 있다는 점 ... )


딥러닝이란

딥러닝 Deeap Learning

: 많은 머신러닝 알고리즘 중 인공신경망 artificial neural network를 기반으로 한 방법들을 통칭한다

( 보통 인공신경망과 딥러닝을 크게 구분하지 않고 사용한다 )

 

1998년 얀 르쿤 Yann Lecun이 신경망 모델을 만들어 손글씨 숫자를 인식하는 데 성공 (WOW) = LeNet-5

2012년 제프리 힌턴 팀이 이미지 분류 대회ImageNet에서 압도적인 성능으로 우승 = AlexNet

2016년 이세돌과 알파고의 대결 두둥 ...

 

🔎인공신경망의 이러한 폭발적 성장의 토대?

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

➡️ 2015년 구글이 딥러닝 라이브러리 텐서플로TensorFlow 오픈소스 공개

➡️ 2018년 페이스북이 딥러닝 라이브러리 파이토치PyTorch 오픈소스 공개


[ 중간정리 ]

인공지능 / 머신러닝 / 딥러닝 개념 간의 관계를 처음 알게 되었다!

인공지능을 구현하기 위해 연구하는 여러 하위 분야 중 '머신러닝'이 있는 것이고, 머신러닝의 여러 알고리즘 방법들 중 한 부류인 '인공신경망'이 '딥러닝'과 같은 것. 또한, 우리가 익숙하게 접하는 인공지능은 '약안공지능'에 해당한다는 것.


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

구글 코랩

Colab코랩이란

: 클라우드 기반의 주피터 노트북 개발 환경 (?엥)

: 웹 브라우저에서 텍스트와 프로그램 코드를 자유롭게 작성할 수 있는 온라인 에디터 

➡️ 위의 '노트북'은 맥북같은 노트북이 아니라, 코랩 파일을 칭한다

 

텍스트 셀

셀Cell은 코랩에서 실행할 수 있는 최소 단위

(셀 안에 있는 내용을 한 번에 실행 후 노트북에 결과를 내타내줌)

➡️ HTML과 마크다운Markdown을 혼용해서 사용가능

이 아이를 말하는 것 같다

코드 셀

코드와 결과가 함께 선택된다

이런 식으로!

주피터

구글이 대화식 프로그래밍 환경인 주피터Jupyter를 커스터마이징한 것 (웹 브라우저 파이썬 코드 실행 환경)

코랩 노트북 = 구글 클라우드의 가상 서버 Virtual Machine를 사용

➡️ 이 노트북은 구글 클라우드의 컴퓨터 엔진에 연결되어 있고

➡️ 자동으로 구글 드라이브에 저장된다

 

🔎대화식 프로그래밍이란?

파이썬 대화형 인터프리터를 떠올렸는데, 입력에 따라 결과값이 바로바로 출력되는 과정이 대화처럼 느껴져서 생긴 이름인 것 같다.

'대화식 프로그래밍'이라는 키워드로 찾아봤을 때는, 제작자가 이미 실행하는 동안 프로그램을 변경할 수 있는 프로그래밍이라고 하는데, 정확한 워딩으로 표현은 못하겠으나 '대화식 프로그래밍 환경'이라는 게 어떤 걸 의미하는지는 감이 온다.


[ 01-3 마켓과 머신러닝 ]

생선 분류 문제

도미인지 아닌지 판단할 수 있는 기준을 어떻게 정할까? 

프로그램은 조건문의 설정을 통해 '누군가 정해준 기준대로' 일을 하지만, 머신러닝은 누구도 알려주지 않는 기준을 찾아서 일을 한다.

도미 데이터를 통해 어떻게 찾을 수 있을지 알아보자!

 

🔎[깨알개념] - 이진 분류 binary classification

분류classification = 머신러닝에서 여러 개의 종류(혹은 클래스) 중 하나를 구별해 내는 문제

➡️ 이때 2개의 클래스 중 하나를 고른다면, 이진분류에 해당한다

 

🔎[깨알개념] - 특성 feature

데이터의 특징을 말하는데, 여기에서는 도미의 특징을 길이와 무게로 표현한 것이 특성이다

 

🔎[깨알개념] - 산점도 scatter plot

x, y축으로 이뤄진 좌표계에 두 변수x,y의 관계를 표현하는 방법

➡️ 맷플롯립matplotlib = 파이썬에서 과학계산용 그래프를 그리는 대표적인 패키지 

 

 

미니실습1 - 도미데이터의 산점도 그려보기

import matplotlib.pyplot as plt

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]

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

xlabel, ylabel = 각각 x축, y축의 이름을 화면에 표시에 준다.

matlab 썼을 때와 매우 유사한 형태인 것 같다!

이와 같이 일직선에 가까운 형태로 나타날 때 '선형적 linear'이라고 말한다.

 

미니실습 2 - 도미데이터, 빙어 데이터 한꺼번에 산점도 그려보기

import matplotlib.pyplot as plt

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]

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)

plt.xlabel('length')
plt.ylabel('weight')
plt.show()

빙어데이터도 선형적으로 보이지만, 무게가 길이의 영향을 도미에 비해 덜 받는 것을 알 수 있다.

 

미니실습 3 - 간단한 파이썬 조작을 통해 2차원 리스트 만들기

length = bream_length + smelt_length
weight = bream_weight + smelt_weight
fish_data = [[l,w] for l,w in zip(length, weight)]

책에서 사용할 머신러닝 패키지 '사이킷런'을 사용하려면, 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트로 만들어주어야 한다.

리스트의 요소를 하나씩 꺼내서 반환하는 zip함수를 반복문으로 돌려서 fish_data에 2차원 리스트를 만들어준다.

 

이후, 우리는 어떤 특성이 도미이고 빙어인지 '정답'을 알려줘야 머신이 정답에 대한 기준을 스스로 찾을 수 있다.

이때 우리는 간단하고 쉬운 k-최근접 이웃 k-Nearest Neighbors 알고리즘을 사용할 것!

 

미니실습 4 - k-최근접 이웃 알고리즘을 구현한 클래스를 통해 기준 학습시키기

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

🔎[깨알개념] - 훈련 trainig

모델에 데이터를 전달하여 규칙/기준을 학습시키는 과정을 가리키며, 위의 코드에서 사이킷런의 fit()메서드가 담당한다.

➡️ 잘 훈련되었는지 평가하기 위해서는 사이킷런의 score()메서드를 활용하여 0(틀림) ~1(정확함) 사이의 값을 반환하는 것으로 확인한다.

score()값 = 정확도 accuracy

 

kn.predict()메소드를 통해 새로운 데이터의 정답을 예측할 수 있다

 

k-최근접 알고리즘 정리

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

( = 가장 가까운 직선거리에 어떤 데이터가 있는지 살피는 것 )

➡️ 데이터가 아주 많은 경우 사용하기 어려움 (메모리 많이 사용 / 직선거리를 계산하는 데 많은 시간 소요)

 

🔎[추가개념] - KNeighborsClassifier 클래스는?

: 기본값으로는 가장 가까운 데이터 '5개'를 참고하여 판단하고 있으나, n_neighbors매개변수로 바꿀 수 있다.


[ 총정리 ]

예시를 통해 머신러닝이 이런 것이구나~ 라고 찍먹할 수 있었다.

스터디에서 공유하고 싶은 질문은 '인공지능 / 머신러닝 / 딥러닝의 구분을 해당 분야에서는 얼마나 중시하고 있고, 그 경계가 명확한지?'

궁금하다 !

 

반응형