2023. 8. 8. 06:33ㆍ2023-2 KHUDA/ML 기초세션
이 게시물은 한빛미디어의 <혼자 공부하는 머신러닝 + 딥러닝>를 정리한 글입니다.
혼자 공부하는 머신러닝+딥러닝
혼자 공부하는 머신러닝 딥러닝, 무료 동영상 강의, 머신러닝+딥러닝 용어집을 다운로드 하세요. 포기하지 마세요! 독학으로 충분히 하실 수 있습니다. ‘때론 혼자, 때론 같이’ 하며 힘이 되겠
hongong.hanbit.co.kr
Chapter 01-1 인공지능과 머신러닝, 딥러닝
인공지능(Artificial intelligence)
- 사람처럼 학습하고 추론할 수 있는 지능을 가진 컴퓨터 시스템을 만드는 기술
강인공지능 - 사람과 구분하기 어려운 지능을 가진 컴퓨터 시스템 ex) <터미네이터>의 스카이넷
약인공지능 - 현실에서 우리가 마주하는 인공지능 ex) 알파고
머신러닝(Machine learning)
- 규칙을 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘
딥러닝(Deep learning)
- 머신러닝 알고리즘 중 인공 신경망을 기반으로 한 방법
- 텐서플로(TensorFlow)와 파이토치(PyTorch)가 대표적인 라이브러리이며, 인공 신경망 알고리즘을 전문으로 다룬다.
Chapter 01-2 코랩과 주피터 노트북
구글 코랩(Colab)은 웹 브라우저에서 무료로 파이썬 프로그램을 테스트하고 저장할 수 있는 서비스이며, 클라우드 기반의 주피터 노트북 개발 환경이다.
코랩은 구글 계정만 있다면 누구나 사용할 수 있고, 컴퓨터 성능과 상관없이 머신러닝 프로그램을 실습해 볼 수 있다!
Chapter 01-3 마켓과 머신러닝
가장 간단한 머신러닝 알고리즘 중 하나인 k-최근접 이웃을 사용하여 2개 생선의 종류를 분류하는 머신러닝 모델을 훈련할 것이다.
우선, 전통적인 방식의 프로그램은 다음과 같다.
if fish_length >= 30:
print("도미")
하지만 30cm보다 큰 생선이 무조건 도미라고 말할 수 없다. 이 문제를 해결하기 위해서 머신러닝을 이용해 도미 길이의 기준을 직접 찾도록 할 것이다.
아래와 같이 도미와 빙어 데이터를 준비한다.
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]
각 생선의 특징을 길이와 무게로 표현하였다. 이런 특징을 특성(Feature)이라 부른다.
도미와 빙어 데이터를 산점도(Scatter plot)로 표시하면 다음과 같다.

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()
파란색 점이 도미 데이터, 주황색 점이 빙어 데이터이다. 도미 데이터를 보면 산점도 그래프가 일직선에 가까운 선형(linear) 형태로 나타난다. 빙어의 산점도도 선형적이지만 무게가 길이에 영향을 덜 받는다.
첫 번째 머신러닝 프로그램
k-최근접 이웃 알고리즘을 사용하기 전, 도미와 빙어 데이터를 하나의 데이터로 합쳐준다.
length = bream_length + smelt_length
weight = bream_weight + smelt_weight #두 데이터를 합쳐야 머신러닝 프로그램이 두 생선을 구분할 수 있음
이 책에서 사용하는 머신러닝 패키지는 사이킷런(scikit-learn)이다. 이 패키지를 사용하려면 각 특성의 리스트를 세로 방향으로 나열한 2차원 리스트를 만들어야 한다.
#사이킷런이 기대하는 데이터 형태 #리스트 내포
fish_data = [[ㅣ,w] for ㅣ, w in zip(length, weight)]
"""
다른 방법
for i in range(len(length)):
fish_data = (length[i], weight[i])
"""
print(fish_data)
생선 49개의 길이와 무게를 모두 준비하였다. 마지막으로 정답 데이터를 만들어야 한다. 컴퓨터 프로그램은 문자를 직접 이해하지 못하기 때문에, 도미와 빙어를 숫자 1과 0으로 표현해준다.
fish_target = [1]*35 + [0]*14 #정답 준비, 지도 학습, 이진 분류, 도미를 찾기 위해 1로 둠
print(fish_target)
이제 k-최근접 이웃 모델을 생성해 훈련(training)하고 정확도(accuracy)를 측정할 것이다.
#K-최근접 이웃(가장 간단하고 쉬움)
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier() #모델 객체 생성
kn.fit(fish_data, fish_target) #두 데이터를 가지고 머신러닝 모델을 훈련시킴 #보통 이걸 머신러닝 모델이라 함 #다른 Class에도 fit() 있다
kn.score(fish_data, fish_target) #얼마만큼 잘 맞추는지 #1.0이 나오면 백퍼센트 다 맞춘 #정확도
#새로운 생선 예측
#kn.predict([[30,600]]) #predict()도 2차원 데이터로 넣어주어야 함 -> 출력하면 array([1])이 나옴
k-최근접 이웃 알고리즘은 새로운 데이터가 등장하면 가장 가까운 n개의 데이터를 참고하여 다수결의 원칙에 따라 도미인지 빙어인지를 구분한다. 가까운 몇 개의 데이터를 참고할지는 n_neighbors 매개변수(기본값 5)를 사용해 정한다. n_neighbors 매개변수를 49로 설정하면 다음과 같은 정확도가 나온다.
# 무조건 도미
kn49 = KNeighborsClassifier(n_neighbors=49)
# n_neighbors 매개변수로 주위에 샘플 갯수를 바꿔볼 수 있다. 바꾸면 알고리즘의 정확도가 변동이 된다.
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
# -> 0.7142857142857143
print(35/49)
# -> 0.7142857142857143
따라서 기본값이었던 n_neighbors=5를 사용하여 도미를 완벽하게 분류할 수 있다.
k-최근접 이웃 알고리즘은 사실 어떤 규칙을 찾기보다는 전체 데이터를 메모리에 가지고 있는 것이 전부이다.
'2023-2 KHUDA > ML 기초세션' 카테고리의 다른 글
| [혼자 공부하는 머신러닝 + 딥러닝] Chapter 04-1 로지스틱 회귀 (0) | 2023.08.15 |
|---|---|
| [혼자 공부하는 머신러닝 + 딥러닝] Chapter 03-3 특성 공학과 규제 (0) | 2023.08.08 |
| [혼자 공부하는 머신러닝 + 딥러닝] Chapter 03-2 선형회귀 (0) | 2023.08.08 |
| [혼자 공부하는 머신러닝 + 딥러닝] Chapter 03-1 k-최근접 이웃 회귀 (0) | 2023.08.08 |
| [혼자 공부하는 머신러닝 + 딥러닝] Chapter 02 데이터 다루기 (0) | 2023.08.08 |