반응형

지도 학습 알고리즘

지도 학습 알고리즘은 크게 분류와 회귀로 나뉨

분류 : 샘플을 몇 개의 클래스 중 하나로 분류하는 문제

회귀 : 클래스 중 하나로 분류하는 것이 아니라 임의의 어떤 숫자를 예측하는 문제

 

예) 내년도 경제 성장률을 예측하거나 배달이 도착하는 시간을 예측하는 것이 회귀 문제

 

# K-최근접 이웃 회귀

K-최근접 이웃 알고리즘이 회귀에도 작동한다.

K-최근접 이웃 알고리즘은 어떻게 숫자를 예측할 수 있는가?

- K-최근접 이웃 분류 알고리즘 : 

--> 예측하려는 샘플에 가장 가까운 샘플 k개를 선택 -> 샘플들의 클래스를 확인하여 다수 클래스를 새로운 샘플의 클래스로 예측

 

- K-최근접 이웃 회귀 알고리즘 : 

--> 예측하려는 샘플에 가장 가까운 샘플 k개를 선택 -> 이웃한 샘플의 타깃이 어떤 클래스가 아닌 임의의 수치 -> 이웃 샘플의 수치를 사용해 새로운 샘플 x의 타깃을 예측 ( 이웃 수치들의 평균을 구함)

 

실습

데이터 준비

넘파이 배열을 사용한 농어의 길이와 무게 데이터 준비

perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0, 21.0,
       21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5, 22.5, 22.7,
       23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5, 27.3, 27.5, 27.5,
       27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0, 36.5, 36.0, 37.0, 37.0,
       39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 40.0, 42.0, 43.0, 43.0, 43.5,
       44.0])
perch_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
       115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
       150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
       218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
       556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
       850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
       1000.0])

 

특성 데이터를 x축에 놓고 타깃 데이터를 y축에 놓아 데이터가 어떤 형태를 띠고 있는지 산점도로 표시

 

 

데이터를 머신러닝 모델에 사용하기 전에 훈련 세트와 테스트 세트로 나누기

사이킷런의 train_test_split() 함수를 사용해 훈련 세트와 테스트 세트로 나누기

from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(perch_length, perch_weight, random_state=42)

 

 

reshape() 메서드를 사용해 train_input과  test_input을 2차원 배열로 변경

train_input = train_input.reshape(-1,1)
test_input = test_input.reshape(-1,1)
print(train_input.shape, test_input.shape)

 

사이킷런에서 k-최근접 이웃 회귀 알고리즘을 구현한 KNeighborsRegressor 클래스를 사용

해당 클래스의 객체를 생성하고 fit() 메서드로 회귀 모델을 훈련

from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor();
knr.fit(train_input, train_target)
print(knr.score(test_input, test_target))

 

프린트 된 값은 결정계수 또는 R^2이라고 한다. 

이 값은 다음의 식으로 계산 된다.

R^2 = 1- ((타깃 - 예측)^2의 합 / (타킷 - 평균)^2 의 합)

타깃의 평균 정도를 예측하는 수준이라면 0에 가까워지고, 예측이 타깃에 가까워지면 1에 가까운 값이 된다.

 

타깃과 예측한 값 사이의 차이를 구햅면 어느 정도 예측이 벗어났는지 가늠하기 좋다.

사이킷런의 sklearn.metrics 패키지 아래 여러가지 측정 도구를 제공한다.

mean_absolute_error을 사용하면 타깃과 예측의 절대값 오차를 평균하여 반환

from sklearn.metrics import mean_absolute_error
test_prediction = knr.predict(test_input)
mae = mean_absolute_error(test_target, test_prediction)
print(mae)

 

훈련 세트에서 점수가 좋았는데 테스트 세트에서는 점수가 굉장히 나쁘다면 모델이 훈련세트에 과대적합 되었다고 한다. 훈련세트에만 잘 맞는 모델이라 테스트 세트와 나중에 실전에 투입하여 새로운 샘플에 대한 예측을 만들 때 잘 동작하지 않을 것이다. 

반대로 훈련 세트보다 테스트 세트의 점수가 높거나 두점수가 모두 낮은 경우는 과소적합이라고 한다. 모델이 너무 단하여 훈련 세트에 적절히 훈련되지 않은 경우이다. 훈련 세트가 전체 데이터를 대표한다고 가정하기 때문에 훈련 세트를 잘 학습하는 것이 중요하다.

 

 

위 샘플 데이터의 훈련 세트와 테스트 세트의 점수를 비교해보면 과소적합이라고 할 수 있다. 이것을 해결하기 위해 모델을 조금 더 복잡하게 만들어서 해결하면 된다. 훈련 세트에 더 잘 맞게 만들면 테스트 세트의 점수는 조금 나아질것이다. 

k-최근접 이웃 알고리즘으로 모델을 더 복잡하게 만드는 방법은 이웃의 개수를 줄이는 것이다. 이웃의 개수를 줄이면 훈련 세트에 있는 국지적인 패턴에 민감해지고, 이웃의 개수를 늘리면 데이터 전반에 있는 일반적인 패턴을 따를 것이다. 

 

 

[미션]  과대적합 과소적합 예측 그래프

knr = KNeighborsRegressor()
x = np.arange(5,45).reshape(-1, 1)
for n in [1,5,10]:
  knr.n_neighbors = n
  knr.fit(train_input, train_target)
  prediction = knr.predict(x)

  plt.scatter(train_input, train_target)
  plt.plot(x, prediction)
  plt.title('n_neibors = {}'.format(n))
  plt.xlabel('length')
  plt.ylabel('weight')
  plt.show()

결과

[선택 미션] 모델 파라미터

선형 회귀가 찾은 가중치처럼 머신러닝 모델이 특성에서 학습한 파라미터를 말한다.

모델에 적용할 하나 이상의 파라미터를 사용하여 새로운 샘플에 대한 예측을 하기 위해 사용

머신러닝 훈련 모델에 의해 요구되는 변수.

 

특징 

- 머신 러닝 훈련 모델의 성능은 파라미터에 의해 결정된다.

- 파라미터는 데이터로부터 추정 또는 학습 된다.

- 파라미터는 개발자에 의해 수동으로 설정하지 않는다. (임의 조정 불가)

- 학습된 모델의 일부로 저장

 

모델 파라미터의 예

- 인공신경망의 가중치

- 서포트 벡터 머신의 서포트 벡터

- 선형 회귀 또는 로지스틱 회귀에서의 결정계수

반응형
반응형
 
혼자 공부하는 머신러닝+딥러닝
이 책은 수식과 이론으로 중무장한 머신러닝, 딥러닝 책에 지친 ‘독학하는 입문자’가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있도록 구성했다. 구글 머신러닝 전문가(Google ML expert)로 활동하고 있는 저자는 여러 차례의 입문자들과 함께한 머신러닝&딥러닝 스터디와 번역ㆍ집필 경험을 통해 ‘무엇을’ ‘어떻게’ 학습해야 할지 모르는 입문자의 막연함을 이해하고, 과외 선생님이 알려주듯 친절하게 핵심적인 내용을 콕콕 집어준다. 컴퓨터 앞에서 〈손코딩〉을 따라하고, 확인 문제를 풀다 보면 그간 어렵기만 했던 머신러닝과 딥러닝을 개념을 스스로 익힐 수 있을 것이다! - 베타리더가 함께 만든 입문서 베타리딩 과정을 통해 입문자에게 적절한 난이도, 분량, 학습 요소 등을 고민하고 반영했다. 어려운 용어와 개념은 한 번 더 풀어 쓰고, 복잡한 설명은 눈에 잘 들어오는 그림으로 풀어 냈다. ‘혼자 공부해본’ 여러 입문자의 마음과 눈높이가 책 곳곳에 반영된 것이 이 책의 가장 큰 장점이다.
저자
박해선
출판
한빛미디어
출판일
2020.12.21

[기본]

인공지능, 머신러닝, 딥러닝 간단 정리

인공지능 : 사람처럼 학습하고 추론할 수 있는 지능을 가진 시스템을 만드는 기술. 강인공지능과 약인공지능으로 나뉜다.

머신러닝 : 규칙을 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘 연구분야. 사이킷런이 대표적인 라이브러리

딥러닝 : 인공 신경망. 텐서플로와 파이토치가 대표적인 라이브러리

 

 


구글 코랩

로컬 환경에 별도의 개발 환경을 구축하지 않아도 구글에서 지원해주는 웹브라우저 기반 파이선 프로그램의 테스트 및 저장할 수 있는 서비스.

 

요약 : 클라우드 기반의 주피터 노트북 개발 환경

 

구글 계정만 있다면 누구나 무료로 사용할 수 있다. 

 

로그인 및 코랩 접속은 (https://colab.research.google.com) 에서 할 수 있다.

구글 계정으로 로그인 하지 않아도 코랩에 접속할 순 있지만 코드 실행 및 저장을 위해서는 로그인하는 것을 권장.

 


1차 코랩 실습 

- k-최근접이웃 알고리즘을 사용하여 2개의 종류를 분류하는 머신러닝 모델 훈련

- #특성 #훈련 #k-최근접이웃알고리즘 #모델 #정확도

 

- 특성 : 데이터의 특징. 예) 도미의 특징을 길이와 무게로 표현한 것

아래 사용하는 생선 데이터셋은 캐글에 공개된 데이터셋을 사용.(https://www.kaggle.com/aungpyaeap/fish-market)

* 도미 데이터셋

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]

 

- 산점도 : x, y축으로 이뤄진 좌표계에 두 변수(x, y)의 관계를 표현하는 방법

- 맷플롯립(matplotlib)의 scatter() 함수를 사용하여 산점도 그래프를 사용

- 도미 데이터셋의 길이를 x축, 무게를 y축으로 산점도를 표시

import matplotlib.pyplot as plt

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]

plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

- 코랩 실행 결과

도미데이터를 기준으로 산점도를 표시한 결과

 

* 빙어 데이터셋

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]

 - 기존 scatter() 함수에 빙어 데이터셋 추가

import matplotlib.pyplot as plt

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]

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

 

- 코랩 실행 결과

빙어 데이터를 추가하여 산점도를 표시

 


k-최근접 이웃 알고리즘 적용

- k-최근접 이웃 알고리즘을 적용하여 도미와 빙어 데이터를 구분

- 사이킷런을 사용하여 머신러닝을 진행

- 사이킷런을 사용하기 위해서는 각 특성의 리스트를 세로 방향으로 늘어뜨린 2차원 리스트가 필요

- 파이썬의 zip() 함수와 리스트 내포(list comprehension) 구문을 사용하여 2차원 리스트를 생성

 

* 도미와 빙어의 데이터를 하나의 데이터로 만들기

length = bream_length + smelt_length
weight = bream_weight + smelt_weight

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

- 코랩 실행 결과

도미와 빙어의 데이터를 합쳐서 2차원 리스트로 만든 결과

 

- 머신 러닝을 하기 전에 준비할 정답 데이터셋.

- 머신 러닝 알고리즘이 생선의 길이와 무게를 보고 도미와 빙어를 구분하는 규칙을 찾기 원하기 때문

- 기존 데이터에서 어떤 것이 도미이고 어떤 것이 빙어인지 알려주어야 함

 

* 정답 데이터셋 만들기

fish_target = [1] * 35 + [0] * 14
print(fish_target)

 

- 코랩 실행 결과

정답 데이터셋

 

- 사이킷런의 k-최근접 이웃 알고리즘을 구현한 KNeighborsClassifier 클래스를 사용

- 훈련 : 기준 데이터를 사이킷런에 전달하여 학습시키는 과정

- 사이킷런에서는 fit() 메서드를 사용한다.

- fit() 메서드로 주어진 데이터로 알고리즘 훈련 후 얼마나 잘 훈련되었는지 score() 메서드를 사용하여 모델을 평가

- score() 메서드는 0~1 사이의 값을 반환. 1은 모든 데이터를 정확히 맞혔다는 것

 

* 데이터 알고리즘 학습

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)
kn.score(fish_data, fish_target)

- 코랩 실행 결과

알고리즘 학습 결과


[선택] 간단히 사이킷런을 사용하여 알고리즘 학습을 진행해 보았고, 책에 나온 문제 내용을 정리

 

1. 머신 러닝 알고리즘의 한종류. 샘플 입력과 타깃을 알고 있을 때 사용할 수 있는 학습 방법 - 지도학습 

- 지도학습 : 훈련하기 위한 데이터와 정답이 필요. 정답(타깃)이 있으니 알고리즘 정답을 맞히는 것을 학습

- 비지도학습 : 타깃 없이 입력 ㅔ이터만 사용. 정답을 사요하지 않으므로 무언가를 맞힐 순 없으나 데이터를 잘 파악하거나 변형하는 데 도움을 줌

- 차원축소 : 비지도 학습의 큰 축. 고차원의 원본 데이터를 저 차원의 부분공간으로 투영하여 데이터를 축소하는 기법. 예) 10차원 이상의 데이터가 주어졌을 때 2~3차원의 데이터로 부분공간으로 투영하여 데이터를 축소. 차원이 증가할수록 데이터 포인트 간 거리가 기하급수적으로 멀어져 희소한 구조를 가지게 됨. 피처가 많아지게 되면 개별 피처 간 상관관계가 높아 다중공선성의 문제 과적합이나 예측 성능이 저하될 우려가 있음.

- 강화학습 : 현재의 상태(state)에서 어떤 행동(action)을 취하는 것이 최적인지를 학습하는 것. 행동을 취할 때마다 외부 환경에서 보상(reward)이 주어지고, 보상을 최대화하는 방향으로 학습이 진행

 

2. 훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상 - 샘플링 편향

- 샘플링 오류 : sampling error는 랜덤 표본의 통계와 실제 모집단 값 사이의 불일치를 의미. 자연적인 우연인자를 말하는 것이지, 설계가 부실하고 실행이 잘 안되어 있는 실험에 의한 측정 오류는 아니다.

- 샘플링 실수 : 아직 답을 찾는 중입니다. 향후 업데이트

- 샘플링 편차 : 아직 답을 찾는 중입니다. 향후 업데이트

- 샘플링 편향 : 일반적으로 훈련 세트와 테스트 세트에 샘플이 골고루 섞여 있지 않으면 샘플링 한쪽으로 치우쳤다는 의미

 

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

- 테이블의 행은 수많은 샘플들로 구성되고, 열은 샘플의 특성들로 구성.

- 샘플이 특성에 비해 너무 적으면 overfit이 발생하거나 예측이 안될 수 있음.

 

반응형

'IT > 머신러닝&딥러닝' 카테고리의 다른 글

05. 비지도 학습  (0) 2023.02.12
04. 교차 검증 및 앙상블 학습  (0) 2023.02.05
03. 로지스틱 회귀  (0) 2023.01.24
02. 회귀 알고리즘과 모델 규제  (0) 2023.01.15
00. 혼자 공부하는 머신러닝 & 딥러닝  (0) 2023.01.08

+ Recent posts