본문 바로가기

파이썬 & 머신러닝과 딥러닝

인공신경망, 지도학습, 회귀모델

 

분류 모델

 

공부시간으로 성적 예측

np.array에 넣으면 행렬로 바껴서 각각의 리스트 원소에 더하기 가능해짐

np.array로 행렬로 바꿔주기

 

a = a - a' 를 했을때 순간기울기가 0이 되는 지점이 생기는데

0이 되는 지점에서는 더이상 학습해도 소용 없다는걸 알 수 있음

그걸 대입하면 직선의 방정식 기울기를 알 수 있음

 

 

 

 

3000 번 학습시키기 

 

 

 

오차를 출력하고 순간 기울기를 구하는 과정

→ 파라미터(a1, b)의 기울기가 0에 가까워지면 손실 함수가 최적화된 상태

 

 

오차가 최소가 되는 지점(손실 함수의 값이 최소가 되는 지점, 평균 제곱 오차(MSE)) 를 확인할 수 있음.

회귀선이 데이터 포인트와 가까울수록 손실 함수 값이 최소화되었다고 볼 수 있다.


 

두 개의 입력 특성 x1 (공부시간)과 x2 (문제집 푼 개수)로부터 y (성적) 예측

 

y = a1x1 + a2x2 + b로 만들어보기

 

특성이 늘어나면 굴곡이 생김

import numpy as np
import matplotlib.pyplot as plt

# 데이터
x1 = np.array([2, 4, 6, 8])  # 공부시간
x2 = np.array([1, 2, 1, 3])  # 문제집 푼 개수
y = np.array([20, 55, 45, 80])  # 성적

# 초기값
a1 = 0
a2 = 0
b = 0
lr = 0.001  # 학습률

# 학습 과정
for i in range(3000):  # 3000번 학습
    y_hat = a1 * x1 + a2 * x2 + b  # 예측값
    error = y_hat - y  # 오차
    
    # 기울기 계산
    a1_diff = 2 * np.sum(error * x1)  # a1의 편미분값
    a2_diff = 2 * np.sum(error * x2)  # a2의 편미분값
    b_diff = 2 * np.sum(error)  # b의 편미분값

    # 파라미터 업데이트
    a1 = a1 - lr * a1_diff
    a2 = a2 - lr * a2_diff  # 수정된 부분
    b = b - lr * b_diff

    # 학습 과정 출력
    print(f'{i+1}회 학습 / a1: {a1:.2f}, a2: {a2:.2f}, b: {b:.2f}')

 

→ 주어진 데이터와 모델의 파라미터를 업데이트하여 예측값과 실제값 간의 오차를 최소화

 

 


 

1. sin 그래프와 가장 오차가 작은 직선 그리기

# 1. sin 그래프와 가장 오차가 작은 직선 그리기
# 2. sin 그래프와 가장 오차가 작은 2차 함수 그래그 그리기

# 데이터 생성
x = np.arange(-3, 3, 0.01)  # x 값 생성
y = np.sin(x)  # sin(x) 값을 계산

# 초기값 설정
a = 0  # 기울기 초기값
b = 0  # 절편 초기값
lr = 0.0001  # 학습률 설정

# 경사 하강법 학습
for i in range(5000):  # 1000번 반복
    y_hat = a * x + b  # 예측값 계산
    error = y_hat - y  # 오차 계산

    # 기울기 계산
    a_diff = sum(2 * error * x)  # 기울기 a의 편미분값
    b_diff = sum(2 * error * 1)  # 기울기 b의 편미분값

    # 파라미터 업데이트
    a = a - lr * a_diff  # 기울기 a 업데이트
    b = b - lr * b_diff  # 절편 b 업데이트
    
    print(f'{i+1}회 학습 / a 기울기 : {a_diff:.2f}, b 기울기 :{b_diff:.2f}')

 

 


2. sin 그래프와 가장 오차가 작은 2차 함수 그래프 그리기

# 1. sin 그래프와 가장 오차가 작은 직선 그리기
# 2. sin 그래프와 가장 오차가 작은 2차 함수 그래프 그리기 (O)

x = np.arange(-3, 3, 0.01)
y = np.sin(x)

a = 0
b = 0
c = 0
lr = 0.00005

for i in range(5000):
    y_hat = a * x ** 2 + b * x + c
    error = y_hat - y
    
    a_diff = sum(2 * error * x ** 2)
    b_diff = sum(2 * error * x)
    c_diff = sum(2 * error * 1)
    
    a -= a_diff * lr
    b -= b_diff * lr
    c -= c_diff * lr
    
    print(f"{a_diff:.2f}, {b_diff:.2f}, {c_diff:.2f}")

 

 


 3. sin 그래프와 가장 오차가 작은 3차 함수 그래프 그리기

# 1. sin 그래프와 가장 오차가 작은 직선 그리기
# 2. sin 그래프와 가장 오차가 작은 2차 함수 그래프 그리기 (O)

x = np.arange(-3, 3, 0.01)
y = np.sin(x)

a = 0
b = 0
c = 0
d = 0
lr = 0.000005

for i in range(5000):
    y_hat = a * x ** 3 + b * x ** 2 + c * x + d
    error = y_hat - y
    
    a_diff = sum(2 * error * x ** 3)
    b_diff = sum(2 * error * x ** 2)
    c_diff = sum(2 * error * x)
    d_diff = sum(2 * error * 1)
    
    a -= a_diff * lr
    b -= b_diff * lr
    c -= c_diff * lr
    d -= d_diff * lr
    
    print(f"{a_diff:.2f}, {b_diff:.2f}, {c_diff:.2f}, {d_diff:.2f}")

 

 


 

 

 머신러닝 지도학습

 

훈련데이터와 시험데이터 적절히 섞여서 잘 만들어진 모습

 

실제값과 비교해서 예측이 잘된지 볼 수 있음.

 

score 함수로 예측 정확도 출력 가능

 

→ 컴퓨터가 모르는 데이터를 다 맞힌 상태(1.0)


→ 잘 학습된 모델인데 틀린 모습을 보임 (도미인데 빙어라고 나옴)

 

k최근접 이웃 : 가장 가까운 값들을 보여줌

 

주황 표시를 예측해야하는데 초록색 다수결로 빙어로 잘못 예측된 걸 알 수 있다.

 

→ 훈련데이터를 통해 알 수 있는 평균과 표준편차를 통해 예측을 해야함

→ 훈련데이터에도 평균을 뺌 (데이터 표준)

→ 평균을 빼고 표준편차로 나누어 표준화 (안되는 경우 중앙값 빼기)

 

모델 만들고 데이터 표준화해서 잘 학습되었다고 나온 모습

 

도미라고 이제는 잘 예측된 모습

 

 


 

fish2.csv(7종류의 생선 / 5개의 특성)

→ score 0.675

 

 

각각의 이웃숫자마다 성능을 출력

 

 


 

 

  • 정밀도는 모델이 양성으로 예측한 것 중에서 몇 개가 실제로 양성이었는가?
  • 정확도는 모델이 전체 샘플 중에서 얼마나 많이 맞췄는가?
  • 재현율실제 양성인 것 중에서 모델이 양성으로 정확히 예측한 비율

classification_report(실제값 예측값) 순서 지켜서 적어줘야함.

 

 


 

회귀모델 

 K 최근접 이웃 회귀 모델

연속된 모델 예측시 회귀모델 사용

 

 


 

비정형데이터 : 딥러닝


정형데이터

  • 데이터 균형하고 많다/적다 = 랜덤포레스트
  • 데이터가 불균형한데 많다 = XGboost(오차가 많을수록 잘 학습)
  • 데이터가 불균형한데 적다 = 서포트 벡터 머신

 

정형 데이터 : 트리 기반(결정트리, 랜덤포레스트, XGBoost)

1. 쉽다 (데이터 표준화 -> 연산 X)

2. 강력함

3. 데이터의 설명력을 가짐

 

 

훈련 >>>>>>> 시험 : 과대 적합

훈련 > 시험 : 0000

훈련 < 시험 : 과소적합 의심

둘 다 작게 나오는 경우 : 과소적합

 


 랜덤포레스트(결졍트리 100개) > 결정트리
1. 데이터 분할(정확도만 볼거라면)
2. 과대적합에 강함.

 

 

랜덤포레스트(배깅)
→ XGBoost(부스팅) : 약한 학습기(찍는 것 보단 나은 모델)를 활용해서 학습