[파이썬] 내가보려고 정리하는 파이썬 : Scikit-learn

2024. 4. 21. 20:49카테고리 없음

요근래 AI산업이 활성화 되면서 Ai와 고나련된 기술들이 굉장히 많이 일상행활에 들어왔다. 당장에 chaGPT, 바드, Copilot 만 보아도 말이다.

이렇게 Ai 가 성장할수있던 이유는 학습할수있는 데이터가 많이 축척되어있고, 그데이터를 발전되 하드웨어를 통해 매우 빠른시간동안 학습하고 발전시키도록 되어있어, 인간으로써는 도저히 소화할수없는 학습량을 소화할수있기 때문이다.

우리는 앞으로의 시대에서 살아남기위해서는 Ai의 뒤쳐지지않게 노력해야한다.

 

그렇다면 이 Ai들은 어떻게 학습을 진행하게 되는것일까? 이들은 종류에 따라 다르겠지만, 기본적으로는 어떠한 문제가 존재한다면, 문제의 풀이법을 알려주지않아도 컴퓨터가 축척된 데이터를 기반으로 이를 학습하여 해결하는 방식으로 진행하는것이 최근의 Ai기술들이다. 많은 모델이 있지만, 우리는 이것들중 머신러닝에 대해서 알아보고, 이를 수행하는 방법에 대해서 알아보도록할것이다.

 

머신러닝(machine running)

머신러닝은 반복적인 학습을 통해 손글씨를 보고 숫자를 추론해내거나, 동물의 사진을 보고 그 동물을 구분해내는등. 분류성능향상이 우상향 그래프를 그리는 알고리즘이 존재한다면, 이를 머신러닝이라고 칭한다.

 

머신러닝은 데이터에 기반한 수행방법이며, 해결방법을 정확하게 지정해줄수없는 문제에 대해서 효과적으로 작용한다.

 

여기서 중요한 부분은 머신러닝모델이 학습을 수행할때, 이를 잘수행할수있도록 특징을 적절하게 설정해주어야한다. 

우리가 특징을 설정해줄때는 3가지 중요한 요소를 기반으로 설정해주게 되는데, 그 3가지는 아래와 같다.

1. 해결해야할문제(작업)

수행해야 할동작을 성능척도를 통해 평가.

2. 성능척도

평가된 성능척도를 통해 경험을 축척

3. 경험

축척된 경험을 이용해 성능 척도를 더 나은 상태로 바꿔야한다. 

이 3가지 요소를 계속 반복해가면서, 작업을 수행해나가는것이 머신러닝의 핵심이다. 

 

작업을 수행하기전에 또다른 중요한 요소가 하나있는데, 바로 머신러닝모델에 학습을 지도해주는 교사의 여부다. 

이 여부에 따라, 학습은 지도학습, 비지도학습, 강화학습으로 나뉘게된다.

 

지도 학습

지도 학습에는 "교사"가 존재하여, 정답지 역할인 레이블이 존재하여, 입력된값을 레이블을 기반으로 결과를 도출하는학습이다.

ex) 동물들을 구분할때, 여러가지 동물들이 정확히 구분되어있는 레이블링 된 데이터를 충분히 제공한뒤 학습을 유도하는 과정이 필요하다.

학습내용을 바탕으로 레이블에 없는새로운데이터를 보고 종류를 판단하는것이다. 

 

비지도 학습

비지도 학습은 레이블이 존재하지않아 모델이 스스로 학습하여, 데이터에서 숨겨진 패턴을 발견하도록 유도하는 학습이다.

이에 대한 예시로는 군집화가 있다. 

(여러가지 데이터를 비슷한 특성끼리 묶는것)

 

강화 학습

강화 학습은 게임과 같은 환경으로 게임 캐릭터(에이전트)가 게임환경에서 액션을 수행했을때 이에대한 보상을통해서 다음 행동(정책)을 결정하는 방식이다. 

실제로 게임분야에서 이렇게 학습을 진행하는경우가 많다(길찾기, 플레이어에게 접근)

에이전트는 보상을 최대화 하도록 학습하며, 동적상태에서 현재 상황에 대한 정보를 수집하는과정이 포함되어있는 학습이다.

 

머신러닝에서는 일반적으로 지도 학습을 사용한다. 

 

지도학습에는 데이터가 (x, y)쌍으로 존재하며, 일반적으로 입력하는 데이터를 x. 레이블을 y로 칭한다.

이렇게 데이터와 레이블로 구성된 데이터를 훈련용 데이터, Training data라고 부르며, 머신러닝 모델을 테스트할때는 데이터에 포함되지않은 test data를 사용한다. 

 

또한 일반적으로는 데이터집합에서 80퍼센트를 training data, 20퍼센트를 test data로 사용한다. 

 

 

이렇게 학습된 모델에는 여러가지 형태가 존재한다.

Overfitting(과적합) Right Fit(적합) Underfitting(과소 적합)

 

Over fitting(과적합)

머신러닝 수행중 데이터에 대해 과도하게 최적화되어 트레이닝데이터에 대해서는 잘 동작하지만, 테스트 데이터에서는 잘동작하지 못하는 현상이다. 

 

Right fit(적합)

데이터가 적절하게 최적화 되어 대부분의 테스트데이터에서도 정상적으로 동작하는 상태

 

Under fitting(과소적합)

과적합과는 반대로 최적화가 거의 진행되지않아, 트레이닝 데이터에 대한 에러도 심하고 테스트데이터와의 에러도 심해지는 상태.

 

당연한 소리지만, 모든 머신러닝 데이터모델은 적합상태를 유지하는것이 가장 바람직하며, 이를 조절하기위해 업데이트 시간을 조절할필요가있다.

 

위에서 지도학습을 어떤 방식으로 진행해야좋은지에 대해 알아보았다면, 이제는 데이터에 따라 처리하는 방식을 알아보겠다.

 

지도학습에서는 데이터가 이산값인지 연속값인지에 따라 문제가 분류문제 인지 회귀분석 인지로 갈리게된다.

분류 : 이미지분류

회귀 : 키에대한 체중 예측, 시장 가격 예측

 

이중 회귀분석은 대표적인 지도학습 알고리즘으로, 관측된 데이터에서 독립변수와 종속변수의 관계를 추정하는것이다.

독립변수 : 사용자가 임의로 조절할수있는변수, 학습에서는 다른변수에 영향을 받지않는 변수

종속변수 : 관측, 측정이 가능한 변수로 독립변수에 따라 변화하는 변수. 

 

회귀 문제에서 주택면적과 거래가격의 관계에 대해서 조사하는 경우에 대해서 생각해보자,

 

  • 면적이 크면 일반적으로 판매가격도 높다.
  • 변수의 영향을 덜받는 면적은 독립변수.
  • 면적에 따라 영향을 받을수있는 거래가격이 종속변수 일때

y = f(x), 거래가격 = f(면적) 이 성립한다. 

주택가격은 면전이외에도 다른 조건에 의해서도 영향받을수있기때문에, 이를 잘설명할수있는 함수를 찾는것이 중요하다.

 

수학적으로 보았을때는 y = f(x)이고 x,y가 주어졌을때 이에대한 함수 f를 예측하는것이 회귀 분석이다.

 

만약 면적 x와 가격 y가 선형적으로 설명될수있는 1차방정식이라면, 관계를 y = wx + b 로 표현할수있다. (w:기울기, b : y절편) 이에따라 f1(x), f2(x)와 같이 여러가설들을 표현할수잇다.

 

가설 : 데이터에 숨겨진 관계를 표현하고 종속변수의 값을 예측

 

그렇다면 f1(x), f2(x)둘중 어떤 가설이 좋은 가설일까? 

-> 오차가 작은 가설이 더 좋은 가설이다

 

이런식으로 f()함수가 만들어내는 오차를 계속 측정하여, 오차를 줄이는 방향으로 값을 최적화하는과정을 수행하면, 우리가 위에서 알아본 머신러닝의 3요소 를 만족하게된다. 

 

가설로 알아본 이것들을 이제는 파이썬에서 직접 적용시켜 사용해보도록 하자. 이를 위해 필요한것이 바로, scikit-learn(사이킷런)이다. 사이킷런에는 지도학습, 비지도 학습을 위한 다양한 모델을 제공하고있으며, 이를 위한 시각화, 교차검증까지 다양한 모듈을 포함하고 있다. 

 

파이썬에서 선형회귀를 적용시키고자 하는경우, 식은 일반적으로 아래와같다.

 

y = Wx + b

x,y를 보유 데이터이고, w,b는 데이터에 대해 적합한 값으로 학습될수있는 파라미터다. 

 

선형회귀나 지도학습을 적용시킬때는 데이터를 원형그대로 사용할수도있지만, 데이터에서 특성을 추출하여 학습하고 테스트하는것이 일반적이다.

 

** 특성 : 관찰되는 현상에서 측정할수있는 속성

 

특성은 여러가지가 될수있지만, 기계학습에서 다룰수있는 특성의 예시는 사람의 키,몸무게등이 있다.(일반적으로 키가크면 무게가 많이 나가기 때문에)

 

이러한 특성을 기반으로 학습을 진행하여, 데이터를 설명하는데 가장 적절한 기울기와 절편값을 찾는것이 선형회귀 모델의 목적이다. 

 

이제 간단한 선형회귀를 수행해보겠다.

과정은 아래와 같다.

  • 트레이닝,테스트데이터준비
  • 특징 정규화
  • .fit() (입출력 지정)
  • .score() (평가)
  • .predict() (예측)
from sklearn import linear_model

regr = linear_model.LinearRegression

 

입력데이터집합 x와 레이블 y변수

x = [[163], [179], [166], [169], [171]] #트레이닝데이터
y = [54, 63, 57, 56, 58]  #레이블 데이터

# 입력과 출력을지정하는 함수 fit()
regr.fit(x,y)

이때 주의해야할점은 학습시키고자 하는데이터는 반드시 2차원 배열이여야한다. 

why? 사이킷런의 LinearRegression모델은 다중 회귀분석을 기반으로 설계되었기때문에, 오류를 발생시킬수있다.

 

이제 이에대한 직선식과 선형회귀 직선이 데이터를 얼마나 잘설명하는지에대해 모델을 구해보자.

coef = regr.coef_ #기울기
intercept = regr.intercept_ #절편
score = regr.score(x,y) #점수


print("y = {}* X + {:2f}".format(coef.round(2), intercept))
print("데이터와 선형 회귀 직선의 관계점수: {:.1%}".format(score))

# return
#y = [0.53]* X + -32.500000
#데이터와 선형 회귀 직선의 관계점수: 91.9%

 

이를 시각화 한다면 조금더 이해가기 좋으므로 한번 표현해보겠다.

import matplotlib.pyplot as plt

plt.scatter(x,y)

# 입력데이터로 예측값을 계산
y_pred = regr.predict(x)

plt.plot(x,y_pred)

데이터의 분포가 적절하게 잘설명되어있다.

 

이렇게 구해낸 예측값을 통해 테스트 데이터를 넣어 값을 예측해보자

unseen = [[167]]
result = regr.predict(unseen)
print("동윤이의 키가 {}cm 이므로 몸무게는 {}kg으로 추정됨".format(unseen, result.round(1)))

# return 
# 동윤이의 키가 [[167]]cm 이므로 몸무게는 [56.2]kg으로 추정됨

이를 보면 예측이 잘이루어진것을 확인할수있다.