갓생 살고 싶은 대학생 블로그
article thumbnail
혼공머신 (머신러닝+딥러닝) 1주차 미션

코랩 실습 화면

구글 코랩

웹 브라우저 기반 파이썬 코드 실행 환경이다

별도의 환경 구축 없이 크롬과 같은 웹 브라우저로 간편하게 코드를 실행할 수 있다는 장점이 있다

(코드 실행 가능 + 데이터 사이언스 분야에서 주로 쓰이는 여러 라이브러리 제공)

작성된 코드들을 구글 드라이브에 바로 저장할 수 있다


머신러닝 = 머신러닝 프로그램을 만든다!

 

전통적인 프로그램

-> 누군가가 규칙을 정해서 프로그램을 작성

 

머신러닝 프로그램

-> 프로그램이 데이터를 바탕으로 스스로 규칙을 찾도록 하는 프로그램

 

캐글 생선 데이터셋 (도미)
산점도 그래프

matplotlib는 파이썬에서 그래프를 그릴 때 사용하는 대표적인 라이브러리이다

as 이후에 오는 것은 약어인데, pyplot은 plt라고 설정하는 것이 국룰이다

 

import를 통해 matplotlib 라이브러리를 불러온 뒤 scatter 함수를 사용해서 산점도 그래프를 그린 것이다x축이 길이, y축이 무게이고 xlabel,ylabel로 축 이름을 설정했다

 

캐글 생선 데이터셋 (빙어)
빙어, 도미 산점도 그래프

scatter 함수를 두번 사용하면 산점도 그래프가 두 개가 나오는 것이 아니라

하나의 그래프에 모두 나온다 !

 

이후 각 생선의 길이, 무게를 합쳐서 데이터를 구성한다.

사이킷런은 2차원 배열의 형태로 데이터가 입력하길 기대하기 때문에 이러한 형태로 데이터를 구성해야 한다.

리스트 내포

[9]의 코드는 length와 weight 두 리스트를 묶어서 length에서 하나 꺼내서 l에 할당, weight에서 하나 꺼내서 w에 할당하라는 뜻이다

[l,w]의 작은 리스트를 만든 뒤 그걸 다시 리스트에 담는다. 그럼 2차원 배열 형태가 된다.

 

정답

지도 학습은 정답을 함께 입력해야 한다.

도미를 찾는 모델을 만들 것이기 때문에 도미인 경우 1, 빙어인 경우 0을 넣어 리스트를 구성한다.

 

k-최근접 이웃 모델

k-최근접 이웃 모델을 사용했다

sklearn.neighbors 모듈에 KNeighborsClassifier라는 클래스로 구현되어 있는 알고리즘이다

class를 사용하기 위해서 ()를 붙여 인스턴트를 만들었다

fit 메서드에 fish_data와 fish_target을 전달한다

우리가 보통 모델이라고 부르는 것은 여기서 kn이 된다

 

얼마나 잘 학습되었는지를 score 메소드를 통해 확인할 수 있다

여기서는 1.0이 출력되는 것을 알 수 있는데 이는 100% 모든 정답을 맞힌 것을 의미한다

새로운 데이터의 결과 예측

predict 메서드는 새로운 데이터의 정답을 예측하는 일을 한다

k-최근접 이웃 모델을 이해하기 위해 새로운 데이터를 입력하여 예측 결과를 확인해 보았다

길이 30 무게 600의 생선은 산점도 그래프 상 도미 데이터들과 근접한 곳에 위치한다

그래프를 보았을 때 모두 이 생선을 도미라고 판단할 것이다

이 때 k-최근접 이웃 모델도 이 생선을 도미라고 판단했다 (결과값이 1이라고 나옴)

 

k-최근접 이웃 모델은 결과를 예측할 때 특정 데이터 주위의 다른 데이터를 보고 다수를 차지하는 것을 정답으로 사용한다

새로운 데이터에 대한 예측을 할 때 가장 가까운 직선거리에 어떤 데이터가 있는지를 확인하는 비교적 간단한 방식이다

이 모델의 단점은 데이터 수가 많아질 경우 시간, 메모리 등의 문제가 발생한다는 점이다

 

KNeighborsClassifier에서 n_neighbors(예측할 때 참고하는 데이터 개수) 매개변수의 디폴트 값은 5로 설정되어 있다

n_neighbors 매개변수 바꿔보기

5개가 최적의 값은 아닐 것이라고 생각해볼 수도 있으므로 매개변수를 수정하여 49개로 바꿔보았다

49개는 전체 생선 샘플의 수이다 -> 전체 샘플을 다 확인하게 되는 것

 

앞서 한 방식과 같이 fit시킨 후 score를 확인해보면 약 0.71의 정확도가 나온다

이는 전체 샘플 중 도미 수와 같은 수치이다 

전체 샘플을 다 확인하게 되면 도미가 더 많으므로 모두 도미라고 판단할 것이기 때문에 정확도 = 전체 샘플 중 도미 수 비율과 일치하게 된다


머신러닝에는 크게 

지도 학습(훈련 위한 데이터 & 정답 모두 필요) 과 비지도 학습 (타깃 데이터 없고 입력 데이터만 있을 때 유용) 이 있다

강화학습은 모델이 수행한 다음 결과에 대한 피드백을 받아 개선해 나아가는 방식이다

 

타깃 데이터(정답)이 필요하지만, 훈련 이후 평가를 할 때에는 훈련 데이터가 아닌 새로운 데이터를 통해 모델을 평가해야 한다이 때 새로운 데이터를 구할 수 있다면 좋겠지만, 대부분 훈련 데이터에서 일부를 뽑아내 테스트 데이터로 사용하게 된다

훈련 세트와 테스트 세트 나누기

k-최근접 이웃 모델 평가를 위해서 35개의 훈련 세트, 14의 테스트 세트로 데이터를 나누었다

[:35] -> 파이썬에서는 이런 연산자를 슬라이싱을 위해 사용한다

예를 들어,

a=[1,2,3,4]

a[1:3]

 => [2,3]

fit 메서드에는 훈련할 때 사용할 훈련 세트를 넣고 score 메서드에는 테스트에 사용할 테스트 세트를 넣었다

score 메서드를 통해 확인해 본 정확도는 0%가 나왔다

왜 갑자기 0이 됐을까 !?

이유는 샘플링 편향 때문이다

훈련 데이터를 잘못 나눈 것이다

전체 데이터 49개는 앞 35개가 도미, 뒤 14개가 빙어이다

이 때 훈련 데이터를 앞에서부터 35개로 지정하면 도미로만 학습을 하고 테스트는 빙어로 하게 되기 때문에 정확도에 문제가 생길 수 있다

따라서 예제에서는 훈련 세트와 테스트 세트를 나눌 때 각 세트에 도미와 빙어가 적절히 포함되도록 해야 한다

넘파이 라이브러리 사용

사이킷런의 predict 메서드는 반환값을 numpy 배열로 반환한다 (입력값도 numpy 배열이라고 가정)

numpy 라이브러리는 np로 임포트하는 것이 국룰이다

np.array 함수를 통해 쉽게 넘파이 배열로 바꿀 수 있다

 

데이터를 섞을 때에는 입력값과 타겟값이 쌍으로 섞이도록 만드는 것을 주의해야 한다

이 때는 인덱스를 만들어서 섞는 방법을 사용한다

인덱스를 섞은 이후 앞 35개는 훈련 세트로, 뒤 14개는 테스트 세트로 만드는 것이다

인덱스 섞기

arange 함수를 통해 인덱스를 만든다

np.arange(49)라는 코드를 실행하면 0에서부터 48까지의 배열이 만들어진다

이후 random 모듈의 shuffle 함수를 통해 인덱스를 무작위하게 섞어준다

훈련 세트 테스트 세트 나누기

섞은 이후 앞에서 35개는 훈련세트로, 나머지는 테스트 세트로 만들어준다

넘파이 라이브러리는 배열 인덱싱이라는 기능을 제공한다

아래의 코드 실행 결과를 보면, 앞에서 인덱스 배열을 형성했을 때 0번째 값이 9였기 때문에

train_input[0] 값과 input_arr[9] 값을 비교해보면 같게 나오는 것을 확인할 수 있다

배열 인덱싱

산점도 그래프에서의 푸른 점은 훈련 데이터, 주황색 점은 테스트 데이터이다

각 세트에 도미와 빙어가 적절히 섞여있는 것을 확인할 수 있다

 

그래프 그리는 코드를 해석해보자면,

train_input[:,0]은 0번째 열의 전체 행을 불러오는 것, train_input[:,1]은 1번째 열의 전체 행을 불러오는 것을 의미한다

 

훈련 세트와 테스트 세트를 나누어 모델을 훈련시켜 보았다

score메서드로 모델 정확도를 검증해보았더니 100%의 정확도가 나왔다


chapter 02-1 확인문제

 

#1 머신러닝 알고리즘의 한 종류로서 샘플의 입력과 타깃(정답)을 알고 있을 때 사용할 수 있는 학습 방법은 무엇인가요?

=> 지도학습

지도 학습이란 모델 훈련을 위한 데이터와 정답이 모두 필요한 방식이다

예제로 다룬 도미,빙어 예측에서는 지도학습의 방식을 사용했다

 

#2 훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상을 무엇이라고 부르나요?

=> 샘플링 편향

예제에서 처음으로 훈련 세트와 테스트 세트를 나눴을 때 훈련 세트에는 도미만, 테스트 세트에는 빙어만 포함되어 모델의 정확도가 0으로 나온 것을 확인할 수 있었다

 

#3 사이킷런은 입력 데이터(배열)가 어떻게 구성되어 있을 것으로 기대하나요?

=> 행 (샘플), 열 (특성)

예제에서 다룬 생선 데이터를 예시로 보자면, 49개의 샘플과 (49개의 행) 2개의 특성 (2개의 열)이 있는 데이터임을 확인할 수 있다

 

 

profile

갓생 살고 싶은 대학생 블로그

@파도의 물보라

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!