3강 - 마켓과 머신러닝

2021. 5. 27. 21:30ICT 멘토링/혼자 공부하는 머신러닝+딥러닝

3강 - 마켓과 머신러닝

 

학습 로드맵 - 마켓과 머신러닝

첫 번째 머신러닝 프로그램

프로그램을 만들어 머신러닝이 무엇인지 쉽게 파악.

 

한빛 마켓 - 생선 판매. 생선 구분 필요.

도미 크기 - 30~40cm 

 

전통적인 프로그램

기준이나 규칙을 정하고 프로그램 작업함.

 

 

미리 규칙을 정하기 어려울 때가 있을 수 있음.

미리 30cm 보다 크면 도미라고 알고 있다면 프로그램을 작성할 수 있지만, 실제로는 길이가 30cm 보다 크면 무조건 도미라고 정할 수 없음.

머신러닝이 생선을 보고 도미인지 아닌지 판단해야 함.

 

따라서 머신러닝 프로그램과 전통적인 프로그램의 차이점은 규칙을 스스로 찾느냐 아니냐임.

 

어디서 규칙을 찾을 수 있을까? - 데이터

데이터가 먼저 준비되어야 함.

 

도미 vs 빙어

2개의 클래스(class)

분류(classification)

이진 분류(binary classification)

 

머신러닝에서 종류를 나타낼 때 클래스라고 말함.

구분하는 작업을 분류라고 함.

도미와 빙어 2개를 분류하므로 이진 분류라고 함.

 

도미 데이터

도미의 길이, 무게 2가지를 가지고 판단.

 

35개의 도미 데이터를 가지고 만든 파이썬 리스트.

위의 예에서 각각의 생선 데이터를 샘플(관측)이라고 함.

데이터 = 샘플.

35개의 샘플 존재.

 

샘플의 길이, 무게같은 것들을 특성(속성)이라고 함.

샘플의 요소(항목) 각각 = 특성.

 

산점도(scatter plot)

산점도 - 특성이 2개 있을 때, 잘 표현할 수 있는 그래프

import matplotlib.pyplot as plt			# matplotlib 라이브러리 import 하고 약어로 plt 라고 부름.

plt.scatter(bream_length, bream_weight)		# plt.scatter(x축에 놓을 데이터, y축에 놓을 데이터)
plt.xlabel('length')				# x축 이름
plt.ylaber('weight')				# y축 이름
plt.show()					# 그래프 출력

# 파이썬에서 그래프를 그리는 가장 대표적인 라이브러리 - matplotlib

 

# 약어는 보통 규칙적이라 동일한 관례 그대로 따름. 강제는 아니지만 거의 모든 사람들이 동일한 약어 사용.

코드 결과

길이 커지면 무게도 같이 커짐.

 

빙어 데이터

14개의 빙어 데이터를 가지고 만든 파이썬 리스트 

plt.scatter(bream_length, bream_weight)		# plt.scatter(x축에 놓을 데이터, y축에 놓을 데이터)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')				# x축 이름
plt.ylaber('weight')				# y축 이름
plt.show()					# 그래프 출력

scatter 함수를 2번 연속 호출하면 각각의 그래프가 따로 그려지는 것이 아니라 그래프를 합쳐서 하나의 그래프의 모든 데이터를 표시함.

각 데이터 색을 각각 달리하여 표시함.

코드 결과 - 도미 데이터(파랑)와 빙어 데이터(노랑)

 

도미와 빙어 합치기

합쳐야 머신러닝이 두 생선을 구분하는 법을 배움. 하나의 데이터만 전달한다면 구분할 수 없음.

두 생선 모두 전달해줘야 함.

length = bream_length+smelt_length		#덧셈 연산자 오버로딩 - 두 리스트 합쳐서 하나의 리스트로 만듦.
weight = bream_weight+smelt_weight

코드 결과 - 두 리스트가 합쳐져 하나의 리스트로!

사이킷런은 샘플 하나의 데이터가 하나의 리스트에 담기도록, 외각쪽에 리스트가 있도록 해야 함.

데이터의 형식을 2차원 배열로 변경해줘야함.

사이킷런이 기대하는 데이터 형태

 

리스트 내포

fish_data = [[l, w] for l, w in zip(length, weight)]

리스트 내포 - 대괄호로 리스트를 만드는데 리스트 안에 for문이 들어있는 것.

zip 함수를 써서 length와 weight를 묶으면 length에서 원소를 하나 뽑아 l에 넣고, weight에서 원소를 하나 뽑아 w에 넣음.

length, weight 리스트가 끝날 때까지 반복함.

l과 w를 큰 외곽 리스트에 넣어줌.

리스트 내포 결과

 

정답 준비

fish_target = [1]*35 + [0]*14

어떤 것이 도미고 어떤 것이 빙어인지 알려줌.

정답을 알려주지 않으면 규칙을 찾지 못 함.

지도학습 - 정답을 알려주고 학습시킨 뒤에 분류함.

코드 결과 - 정답

앞의 35개의 데이터가 도미고 뒤의 14개의 데이터가 빙어이므로 도미 데이터가 1이라고 하여 도미를 찾을 수 있도록 함.

이진 분류의 경우 정답은 1, 0으로 표시함.

찾을 것 : 1, 아닌 것 : 0

 

k-최근접 이웃

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()

kn.fit(fish_data, fish_target)

kn.score(fish_data, fish_target)

클래스 사용시에는 클래스 이름 뒤에 ()괄호를 붙여 클래스 인스턴스(객체)를 만듦.

fit(데이터, 정답) 해서 fit 메소드에 데이터와 정답을 전달해줌.

여기선 kn.fit()되었는데 kn을 모델이라고 함.

머신러닝 프로그램의 알고리즘이 객체화된 것 또는 알고리즘 자체를 모델이라고 함.

얼마나 잘 학습되었는지 알기 위해 score 메소드 사용. 

score(데이터, 정답)

 

위 코드에선 score 메소드 결과가 1.0이 나옴.

 

새로운 생선 예측

새로운 생선

kn.predict([[30,600]])
array([1])

하나의 샘플만이라도 2차원 배열로 넣어줘야 함!

 

주위 샘플들 보고 가장 많은 클래스를 정답으로 삼음.

보통 기본값은 k=5로 5개의 주변 데이터를 봄.

주변에 도미 2개, 빙어 3개면 빙어로 예측.

 

무조건 도미

kn49 = KNeighborsClassifier(n_neighbors=49)

kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)

# 0.7142857142857243

print(35/49)

# 0.7142857142857243

k의 값을 크게 해서 전체 데이터의 개수로 하면 전체 모델 중 도미의 개수만큼의 정확도를 가지게 됨.

도미는 제대로 맞추고 빙어는 다 틀림.

 

참고 자료

혼자 공부하는 머신러닝+딥러닝 강의

https://www.youtube.com/watch?v=GOCVVSMeIf8&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=3