1. 인공지능, 머신러닝, 딥러닝 개념
▶ 인공지능
: 사람처럼 학습하고 추론 할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술
- 강인공지능: 사람과 분류하기 어려운 지능을 가진 컴퓨터 시스템
- 약인공지능: 특정 분야에서 사람의 일을 도와주는 보조 역할만 가능(음성비서, 자율주행자동차, 음악추천, 기계번역)
▶ 머신러닝
: 규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘 (인공지능 하위 분야 중 지능 구현 소프트웨어를 담당하는 핵심 분야)
→ 대표적인 라이브러리: 사이킷런
▶ 딥러닝
: 많은 머신러닝 알고리즘 중에 인공 신경망을 기반으로 한 방법 등을 통칭하여 딥러닝이라고 부름, 인공신경망과 딥러닝을 구분하지 않고 사용
→ 대표적인 라이브러리: 텐서플로(구글), 파이토치(메타/페이스북)
장점 | 단점 | |
텐서플로(TensorFlow) | 텐서보드(TensorBoard)를 통해서 파라미터 변화 양상이나 DNN의 구조를 알 수 있음 | 메모리를 효율적으로 사용하지 못함 |
케라스(Keras) | 배우기 쉽고 모델을 구축하기 쉬움 | 오류가 발생할 경우 케라스 자체의 문제인지 backend의 문제인지 알 수 없음 |
파이토치(Pytorch) | -간단하고 직관적으로 학습가능 -속도 대비 빠른 최적화가 가능 |
-텐서플로우에 비해 사용자층이 얇음 -예제 및 자료를 구하기 힘듦 |
2. 마켓과 머신러닝
▶ 이진분류
: 머신러닝에서 여러 개의 종류 중 하나를 구별해 내는 문제를 분류(classification), 2개의 클래스 중 하나를 고르는 문제를 이진분류(binary classification) 라고 함
2-1) 생선 분류 문제_도미
▶ 도미 데이터 준비하기(35개)
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]
: 리스트에서 첫 번째 도미의 길이는 25.4cm, 무게는 242g, 두 번째도미의 길이는 26.3cm, 무게는 290g ...
: 각 도미의 특징을 길이와 무게로 표현한 것
: 이런 특징을 특성(feature) 이라고 함
▶ matplotlib으로 데이터 시각화 해보기
: 파이썬의 과학계산용 그래프를 그리는 대표적인 패키지는 맷플롯립
: scatter() 함수로 산점도 그리기
: x축은 길이 y축은 무게
import matplotlib.pyplot as plt
plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
2-1) 생선 분류 문제_빙어
▶ 빙어 데이터 준비하기(14개)
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]
▶ matplotlib으로 데이터 시각화 해보기
: 도미와 빙어 데이터 모두 산점도로 그리기
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
>> 주황색 점이 빙어의 산점도
>> 도미에 비해 빙어는 무게도 가볍고, 크기도 작음
>> 빙어는 길이가 늘어나더라도 무게가 많이 늘지 않음
>> 빙어의 산점도도 선형적이지만 무게가 길이의 영향을 덜 받는다는 것을 알 수 있음
3. 첫 번째 머신러닝 프로그램
▶ k-최근접 이웃(k-Nearest Neighbors) 알고리즘
: 가장 간단하고 이해하기 쉬운 k-최근접 이웃(k-Nearest Neighbors) 알고리즘을 사용해 도미와 빙어 데이터를 구분
▶ 도미 데이터 + 빙어 데이터(35 + 14 = 49개)
: k최근접 이웃 알고리즘을 사용하기 전에 앞에서 준비했던 도미와 빙어 데이터를 하나의 데이터로 합침
: 두 리스트를 더해 하나의 리스트로 만들어 줌
length = bream_length + smelt_length
weight = bream_weight + smelt_weight
▶ 특성: 2차원 리스트로 만들기
: 머신러닝 패키지로는 사이킷런(scikit-learn)을 사용
: 각 특성의 리스트를 세로 방향으로 늘어 뜨린 2차원 리스트를 만들어야 함
fish_data = [[l, w] for l, w in zip(length, weight)]
print(fish_data)
▶ 도미는 1, 빙어는 0
: 머신러닝 알고리즘이 생선의 길이와 무게를 보고 도미와 빙어를 구분하는 규칙을 찾기를 원함
: 컴퓨터 프로그램은 문자를 직접 이해하지 못하기 때문에 도미와 빙어를 숫자 1과 0으로 표현
fish_target = [1]*35 + [0]*14
print(fish_target)
: 곱셈 연산자를 사용하면 파이썬 리스트를 간단하게 반복시킬 수 있음
: 도미와 빙어를 순서대로 나열했기 때문에 리스트는 1이 35번, 0이 14번 등장하면 됨
>> 첫번째 생선은 도미 이므로 1이고, 마지막 생선은 빙어이므로 0이 됨
▶ 사이킷런 설치 및 가져오기
: 사이킷런 패키지에서 k-최근접 이웃 알고리즘을 구현할 클래스인 KNeighbors Classsifier 가져오기
pip install scikit-learn
from sklearn.neighbors import KNeighborsClassifier
▶ import 한 KNeighborsClassifier 클래스의 객체를 생성
kn = KNeighborsClassifier()
▶ kn.fit()
: 주어진 데이터로 알고리즘을 훈련시키는 메서드(=학습시키는 것)
: 머신러닝에서는 훈련(training)이라고 부름
kn.fit(fish_data, fish_target)
: 이 객체는 fish_data와 fish_target을 순서대로 전달하여 도미를 찾기 위한 기준을 학습시킴
▶ kn.score()
: 객체(모델) kn이 얼마나 잘 훈련 되었는지 평가하는 메서드
: 이 메서드는 0에서 1사이의 값을 반환(이 값을 정확도라고 부름)
: 1은 모든 데이터를 정확히 맞혔다는 것을 나타냄(0.5는 절반)
kn.score(fish_data, fish_target)
>> 모든 fish_data의 답을 정확히 맞힘(정확도 100%)
>> 도미와 빙어를 완벽하게 분류(도미, 빙어 데이터를 다 알려줘놓고 분류하도록 했으니 당연히..정확함..ㅎ)
4. k-최근접 이웃 알고리즘
▶ k-최근접 이웃 알고리즘
: 어떤 데이터에 대한 답을 구할 때 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용
: 주위의 데이터로 현재 데이터를 판단
▶ 새로운 데이터 만들어보기
: 새로운 데이터(삼각형)를 만들어주고, 이 데이터는 도미와 빙어 중 어디로 분류하는지 살펴보기
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()
>> 삼각형 주위에 도미 데이터가 많으므로 삼각형을 도미(1)라고 판단할 것
▶ predict()
: 새로운 데이터의 정답을 예측하는 메서드
kn.predict([[30,600]])
: fit() 메서드와 마찬가지로 리스트의 리스트를 전달
: 도미는 1, 빙어는 0이었음
>> 반환 값이 1, 삼각형을 도미라고 판단함
* [20, 180] 값 predict() 적용해보기
kn.predict([[20, 180]])
>> 이 값도 도미로 판단함..ㅎ
▶ kn49 객체 만들기
: KNeighborsClassifier 클래스의 기본값은 5
: n_neighbors 매개변수로 바꿀 수 있음
kn49 = KNeighborsClassifier(n_neighbors = 49)
* kn49.fit() / kn49.score()
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
: 가장 가까운 데이터 49개를 사용하는 k-최근접 이웃 모델에 fish_data를 적용하면 fish_data에 있는 모든 생선을 사용하여 예측
>> fish_data 데이터 49개 중에 도미가 35개로 다수를 차지하므로 어떤 데이터를 넣어도 무조건 도미로 예측
댓글