@ 인공지능과 머신러닝, 딥러닝
1. 인공지능(AI, artificial intelligence)
- 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술
- 인공지능은 강인공지능과 약인공지능으로 나눌 수 있음
2. 머신러닝(machine learning)
- 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야
ex. 사이킷런(scikit-learn)
3. 딥러닝(deep learning)
- 많은 머신러닝 알고리즘 중에 인공 신경망(artificial neural network)을 기반으로 한 방법
ex. 텐서플로(tensorflow, 구글), 파이토치(pytorch, 페이스북)
@ 마켓과 머신러닝
생선 이름을 자동으로 알려주는 머신러닝을 개발하라!
생선 분류 문제
- 마켓에서 팔기 시작한 생선은 '도미', '곤들매기', '농어', '강꼬치고기', '로치', '송어'임.
생선을 분류하는 일이니 생선의 특징을 알면 쉽게 구분할 수 있을 것임.
if fish_length >= 30:
print('도미')
- 하지만 30cm보다 큰 생선이 무조건 도미라고 말할 수 없음.
- 또 도미의 크기가 모두 같을 리도 없음.
프로그램은 '누군가 정해준 기준대로 일'을 하지만, 머신러닝은 누구도 알려주지 않는 기준을 찾아서 일을 함.
- 누가 말하지 않아도 머신러닝은 '30~40cm 길이의 생선은 도미다'라는 기준을 찾는 것임.
머신러닝은 기준을 찾을 뿐만 아니라 이 기준을 이용해 생선이 도미인지 아닌지 판별가능함.
이진 분류
- 머신러닝에서 여러 개의 종류(클래스, class) 중 하나를 구별해 내는 문제를 분류(classification)이라고 함.
- 2개의 클래스 중 하나를 고르는 문제를 이진 분류(binary classification)라고 함.
도미 데이터 준비하기
- 각 도미의 길이와 무게로 표현한 것을 특성(feature)이라고 함.
- x, y축으로 이루어진 좌표계에 두 변수(x, y)의 관계를 표현하는 방법을 산점도(scatter plot)이라고 함.
- 산점도 그래프가 일직선에 가까운 형태로 나타나는 경우를 선형(linear)적이라고 함.
도미 데이터
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show

도미와 빙어 데이터
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show

- matplotlib은 2개의 산점도를 색깔로 구분해서 나타냄.
- 빙어는 도미에 비해 길이도 무게도 매우 작음.
- 빙어는 길이가 늘어나더라도 무게가 많이 늘지 않음.
- 빙어의 산점도도 선형적이지만 무게가 길이에 영향을 덜 받는다고 볼 수 있음.
도미와 빙어 구분 머신러닝 프로그램
'k-최근접 이웃(k-Nearest Neighbors)' 알고리즘 사용
- 두 리스트를 하나로 합산함.
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
사용할 머신러닝 패키지는 사이킷런(scikit-learn)
- zip( ) 함수는 나열된 리스트에서 원소를 하나씩 꺼내주는 일을 함.
fish_data = [[l, w] for l, w in zip(length, weight)]
print(fish_data)
- 결과적으로 첫 번째 생선에 대한 정보(길이, 무게)가 리스트를 형성하고, 이를 토대로 전체 리스트가 생성하게 됨. 이러한 리스트를 이차원 리스트라고 함.
마지막으로 준비할 데이터는 정답 데이터임.
- 즉, 첫 번째 생선은 도미이고, 두 번째 생선도 도미라는 식으로 각각 어떤 생선인지 답을 만드는 것임. 만약, 스무고개를 하는데 고개마다 답을 알려주지 않는다면 정답을 맞힐 수 없는 것과 비슷함.
- 앞서 도미와 빙어를 순서대로 나열했기 때문에 정답 리스트는 1이 35번 등장하고, 0이 14번 등장하면 됨.
fish_target = [1]*35 + [0]*14
print(fish_target)
사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현한 클래스인 KNeighborsClassifier를 사용할 것임.
- 이 객체에 fish_data와 fish_target을 전달하여 도미를 찾기 위한 기준을 학습시킴. 이런 과정을 훈련(training)이라고 함.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)
kn.score(fish_data, fish_target)
- 사이킷런에서는 fit( ) 메서드가 모델을 훈련하는 역할을 함.
- 머신러닝 알고리즘을 구현한 프로그램을 모델(model)이라고 함.
- 사이킷런에서 모델을 평가하는 메서드는 score( ) 메서드임. 이 메서드는 0에서 1 사이의 값을 반환함.
- 이 메서드는 정확도(accuracy)라고 부름.
k-최근접 이웃 알고리즘은 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용함.
- 새로운 데이터에 대해 예측할 때는 가장 가까운 직선거리에 어떤 데이터가 있는지를 살피기만 하면 됨.
- 단점은 k-최근접 이웃 알고리즘의 이런 특징 때문에 데이터가 아주 많은 경우 사용하기 어려움. 또한 데이터가 크기 때문에 메모리가 많이 필요하고 직선거리를 계산하는 데도 많은 시간이 필요함.