머신러닝 기초 | 인공지능, 머신러닝, 딥러닝 의미 | 사이킷런 사용예시 | k-최근접 이웃 알고리즘 사용법 | fit() / score() / predict() 메소드

728x90

 

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개로 다수를 차지하므로 어떤 데이터를 넣어도 무조건 도미로 예측

728x90

댓글