240807 TIL #460 AI Tech #3 선형회귀

김춘복·2024년 8월 7일
0

TIL : Today I Learned

목록 보기
461/543
post-custom-banner

Today I Learned

오늘 배운 내용은 선형회귀!


강의 복습

용어

  • 상관관계(Correlation)

    두 변수간 관계를 측정하는 통계적 개념. 선형관계의 강도와 방향.
    상관 계수(correlation coefficient)는 -1~1 사이의 값을 가지며 1에 가까울수록 강한 양의 상관관계, -1에 가까울수록 강한 음의 상관관계, 0에 가까울 수록 상관관계가 없다.

  • 인과관계(Causation)

    한 변수가 다른 변수에 직접 영향을 미치는 관계. 즉 단순한 연관성을 넘어 한 변수가 다른변수의 원인이 되는 것

  • 회귀분석(Regression Analysis)
    한 or 여러 독립 변수와 종속 변수간 관계를 모델링하는 통계적 기법.
    주어진 독립변수를 기반으로 종속변수를 예측하거나 설명하는 데 쓰인다.

선형 회귀

통계학에서 선형 회귀(線型回歸, 영어: linear regression)는 종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법 - wikipedia

  • 특징변수, 독립변수, 설명변수, x -> 목표변수, 종속변수, y

  • 표본상관계수

import numpy as np

correlation_matrix = np.corrcoef(x, t)
'''
1 r
r 1
np.corrcoef(x, t)는 모양의 2x2 행렬을 반환한다. r이 corrcoef값
'''
correlation_coefficient = correlation_matrix[0, 1] 
# [0,1]에있는 r값을 가져온다.

torch.nn.Module

신경망을 정의하고 구축하는 데 사용되는 기본 클래스
nn은 뉴럴 네트워크

  • 선형회귀 모델 구현
class LinearRegressionModel(nn.Module): #nn.Module 클래스를 상속받음
    def __init__(self): # 클래스 초기화 메서드
        super(LinearRegressionModel, self).__init__() # 부모 클래스 init 상속
        self.linear = nn.Linear(in_features=1, out_features=1) # 입력1 출력1

    def forward(self, x):
        return self.linear(x)  # 선형 변환
        
model = LinearRegressionModel() # 인스턴스 생성

학습

  • y = wx + b / 가중치 w, y절편(bias) b
    에서 학습 데이터를 가장 잘 표현하는 직선의 w와 b를 찾는 과정

  • 오차(목표변수t - 예측변수y)가 최소화되는 w와 b를 찾아야 한다.

  • 손실함수(Loss Function) : loss_funcion = nn.MSELoss()
    예측값과 실제값 간의 차이(오차)를 측정하는 함수
    손실함수의 값이 최소화 되어야 오차가 줄어든다.
    단순히 오차를 더하자니 오차는 +/-값 혼재한다.
    그래서 MSE(Mean Squared Error)는 오차의 제곱합의 평균으로 구한다.
    자세한 내용은 TIL #414 참고

경사하강법

자세히 정리한 내용은 TIL #416 참고

  • 기울기, 경사가 하강하는 방향으로 가중치 w를 업데이트 해야한다.
    (손실함수가 최소화 되어야 하므로)

  • 학습률(learning rate)
    가중치 w가 업데이트 되는 크기를 결정하는 하이퍼 파라미터

  • 에폭(epochs)
    전체 데이터셋을 완전하게 한번 학습하는 과정
    적으면 학습이 덜되고 너무 많으면 오버피팅 문제가 생긴다.

  • 손실 값이 크게 나오는 이유
    학습률이 너무 크거나, 데이터에 노이즈가 많거나, 에폭 수가 충분하지 않음.

  • 데이터표준화
    데이터 전처리를 수행해서 분포는 유지하되 값을 변경해 손실값(loss)을 줄이는 방법도 있다.

  • 테스트 데이터는 트레이닝에 포함되지 않는 데이터로 이를 통해 결과를 예측한다.

  • 테스트를 진행할 때는 model.eval()로 모델을 평가모드로 전환한다.


코드 정리

  • data.iloc[행인덱스, 열인덱스]
    pandas의 인덱싱 기능 함수. 특정 행,열을 indexing / slicing 할 때 사용
    iloc은 정수기반 인덱싱, loc은 라벨(이름) 기반 인덱싱

  • 데이터 표준화
    StandardScaler를 이용하되, 2차원 배열을 필요로 하기 때문에 shape을 맞춰준다.

from sklearn.preprocessing import StandardScaler

scaler_x = StandardScaler()
x_scaled = scaler_x.fit_transform(x.reshape(-1, 1)) 
# fit_transform은 평균과 표준편차를 이용해 표준화 해준다.
# x배열을 2차원 배열로 변환. StandardScaler()가 2차원 배열을 필요로 하기 때문
# 이는 numpy데이터므로 추후 torch.tensor로 변환해준다.
  • 옵티마이저 정의
import torch.optim as optim
optimizer = optim.SGD(model.parameters(), lr = 0.01)  # 학습률은 알잘딱하게 설정해야 함
  • epoch동안 하는 일
for epoch in range(num_epochs):
    y = model(x_tensor)  # 예측 변수 계산
    loss = loss_function(y, t_tensor)  # 손실 값 계산

    optimizer.zero_grad()  # 이전단계의 기울기들 0으로 초기화
    loss.backward()  # 현재 loss에 대한 기울기 계산
    optimizer.step()  # 계산된 기울기로 사용하여 가중치 업데이트

    loss_list.append(loss.item()) # 손실 값은 따로 리스트에 저장

피어세션

  • 모델의 테스트 부분에서 model.eval()을 키는 이유는 train에선 일반적으로 과적합 방지를 위해 dropout, batchnorm 기능이 사용되는데, 테스트 모드에선 그 기능이 없어야 한다. 따라서 model.eval()로 테스트 모드를 키면 이 기능 없이 테스트가 진행된다.

  • 과제 관련

img_reshaped = img_t.view(img_t.shape[1], img_t.shape[0], *img_t.shape[2:])
# 위에꺼 대신 아래 코드로 되나?
img_reshaped = img_t.reshape(img_t.shape[1], img_t.shape[0], -1)

회고

  • 우선 강의를 듣고 복습하면서 정리하는 것이 더 잘맞는 것 같다. 강의 들으면서 잘 모르겠는 부분은 계속 메모 하면서 듣기!

  • 어제까지는 괜찮았는데 오늘 선형회귀를 듣고 좀 어지러웠다. 수학, 통계학적 기초가 부족하니 벌써 어려워 지는 것 같았다. 주말에 부족한 부분 보충해서 공부 열심히 해보자!

profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글