PyTorch's Linear Regression

duckbill413·2024년 8월 8일
0

PyTorch

목록 보기
4/5
post-thumbnail

Linear Regression (선형회귀)

  • 선형 회귀(Linear Regression)는 주어진 데이터에서 두 변수 사이의 선형 관계를 모델링하는 통계적 기법
  • 독립 변수(입력 변수)와 종속 변수(출력 변수) 간의 관계를 선형 방정식 형태로 나타내어 예측 수행
  • 트레이닝 데이터를 통해 모델을 학습시켜 새로운 데이터의 결과를 연속적 숫자 값으로 예

선형 회귀의 장점과 단점

  • 장점
    • 간단하고 이해하기 쉽움
    • 계산이 효율적이고 빠름
    • 해석이 용이 (각 독립 변수의 영향력을 쉽게 파악할 수 있음)
  • 단점
    • 종속 변수와 독립 변수 간의 관계가 반드시 선형이어야 함
    • 이상치(outlier)에 민감
    • 다중공선성(multicollinearity) 문제를 겪을 수 있음 (독립 변수들 간의 강한 상관관계)

      💡 이상치(Outlier)
      이상치는 다른 데이터 포인트와 비교했을 때 현저히 다르거나 극단적인 값을 가지는 데이터 포인트를 말합니다.
      이상치는 모델의 성능에 큰 영향을 미칠 수 있습니다.

      💡 다중공선성 (Multicollinearity)
      다중공선성은 독립 변수들 간에 강한 상관관계가 존재하는 경우를 말합니다. 이는 회귀 계수의 추정에 불안정성을 초래하며, 해석이 어려워질 수 있습니다.

nn.Module

nn.Module 은 PyTorch 에서 신경망을 구현할 때 사용

  • 코드 구조화
    • 계층적 구조: nn.Module을 사용하면 복잡한 모델을 여러 계층으로 나누어 관리할 수 있습니다. 이를 통해 모델의 각 부분을 쉽게 이해하고 수정할 수 있습니다.
    • 모듈화: 각 계층이나 서브모델을 개별 모듈로 정의할 수 있어, 코드의 가독성과 유지보수성이 높아집니다.
  • 재사용성
    • 재사용 가능한 모듈: 여러 프로젝트나 모델에서 재사용 가능한 모듈을 정의할 수 있습니다. 예를 들어, 동일한 구조의 레이어를 여러 모델에서 사용할 수 있습니다.
  • 파라미터 관리
    • 파라미터 자동 관리: nn.Module을 사용하면 모든 파라미터가 자동으로 관리되며, parameters() 메서드를 통해 쉽게 접근할 수 있습니다.
    • 장치 관리: 모델의 모든 파라미터를 손쉽게 CPU나 GPU로 이동할 수 있습니다. to() 메서드를 사용하여 전체 모델을 원하는 장치로 이동할 수 있습니다.
  • 자동 그래디언트 계산과 최적화
    • 자동 미분: PyTorch의 자동 미분 기능과 결합되어, nn.Module을 사용하면 역전파(backpropagation)를 쉽게 구현할 수 있습니다. 이는 모델 학습의 복잡성을 줄여줍니다.
    • 최적화: nn.Module과 PyTorch의 최적화 알고리즘을 함께 사용하면 모델의 파라미터를 손쉽게 최적화할 수 있습니다. torch.optim 패키지의 다양한 옵티마이저를 사용할 수 있습니다.

Correlation Coefficient (상관 계수)

상관 계수(Correlation Coefficient)는 두 변수 간의 선형 관계의 강도와 방향을 측정하는 통계적 지표입니다. 상관 계수는 -1과 1 사이의 값을 가지며, 두 변수 간의 관계를 수치적으로 나타냅니다.

  • 피어슨 상관 계수 (Pearson Correlation Coefficient)
    r=i=1N(xixˉ)(yiyˉ)i=1N(xixˉ)2i=1N(yiyˉ)2r = \frac{\sum_{i=1}^{N} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{N} (x_i - \bar{x})^2 \sum_{i=1}^{N} (y_i - \bar{y})^2}}
    • 두 변수 간의 선형 관계를 측정
    • r = 1: 완벽한 양의 선형 관계
    • r = -1: 완벽한 음의 선형 관계
    • r = 0: 선형 관계 없음
  • numpycorrcoef 를 이용한 상관 계수
    import numpy as np
    
    # 두 데이터 배열 정의
    x = np.array([1, 2, 3, 4, 5])
    y = np.array([2, 3, 4, 5, 6])
    
    # 상관 계수 계산
    correlation_matrix = np.corrcoef(x, y)
    
    print("상관 계수 행렬:")
    print(correlation_matrix)
    
    상관 계수 행렬:
    [[1. 1.]
     [1. 1.]]

Linear Regression Model (선형 회귀 모델)

선형 회귀 모델은 입력 변수와 출력 변수 간의 선형 관계를 모델링하는 회귀 분석 기법입니다.

주어진 입력 변수 x에 대해 연속적인 출력 변수 y를 예측합니다.

import torch
import torch.nn as nn  # PyTorch의 신경망 모듈을 임포트

# 선형 회귀 모델 정의
class LinearRegressionModel(nn.Module):  # nn.Module을 상속받아 새로운 클래스 정의
    def __init__(self):
        super(LinearRegressionModel, self).__init__()  # 부모 클래스(nn.Module)의 생성자 호출
        self.linear = nn.Linear(1, 1)  # 입력 차원 1, 출력 차원 1인 선형 계층 정의

    def forward(self, x):
        return self.linear(x)  # 입력 x를 선형 계층에 전달하여 출력 계산

# 모델 초기화
model = LinearRegressionModel()  # LinearRegressionModel 클래스의 인스턴스 생성
  • 생성자 메서드(__init__)
    • nn.Module을 상속받은 클래스에서는 주로 모델의 계층(layer)들을 정의하고 초기화하는 역할
  • 순전파 메서드(forward)
    • 순전파 메서드는 모델의 순전파(forward pass) 과정을 정의
    • 입력 데이터가 주어졌을 때, 이를 통해 출력 데이터를 계산하는 방법을 지정
    • forward 메서드는 직접 호출하지 않고, 모델 인스턴스를 호출함으로써 간접적으로 호출됩니다.

y = wx + b

  • 선형 회귀(Linear Regression) 모델의 기본 형태
  • 데이터 포인트 간의 선형 관계를 찾는 통계적 기법

손실 함수 (Loss Function)

  • 손실 함수는 모델의 예측 값과 실제 값 간의 차이를 측정하는 함수
  • 모델의 성능을 평가하고 최적화하는데 사용
  • 평균 제곱 오차 (Mean Squared Error, MSE)
    MSE=1Ni=1N(yiy^i)2{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2
  • 평균 절대 오차 (Mean Absolute Error, MAE)
    MAE=1Ni=1Nyiy^i{MAE} = \frac{1}{N} \sum_{i=1}^{N} \left\lvert y_i - \hat{y}_i \right\rvert
    • 절댓값을 이용하여 오차를 측정
  • 교차 엔트로피 손실 (Cross-Entropy Loss)
    • 분류 문제에서 주로 사용
    • 예측 확률과 실제 클래스 간의 차이를 측정

Gradient Descent (경사하강법)

  • 기계 학습과 최적화 문제에서 널리 사용되는 알고리즘
  • 기울기를 따라 이동하면서 손실 함수를 최소화하려는 방법
  • 경사하강법은 특히 비용 함수 (cost function) 를 최소화하는 데 많이 사용
  • 전체 데이터셋을 사용하기 때문에 대규모 데이터셋의 경우 계신 비용이 큼
  • 지역 최솟값(local minimum) 에 빠질 수 있음
    • 지역 최솟값 (Local Minimum)
      • 함수가 정의된 특정 구간 내에서 가장 작은 값을 가지는 지점

      • 함수의 다른 점들보다 낮은 값을 가지지만, 전체 범위에서 가장 낮은 값은 아닐 수 있음

        import numpy as np
        import matplotlib.pyplot as plt
        
        # 함수 정의
        def f(x):
            return np.sin(x) + 0.5 * x
        
        # x 범위 설정
        x = np.linspace(-10, 10, 400)
        y = f(x)
        
        # 그래프 그리기
        plt.plot(x, y, label='f(x) = sin(x) + 0.5x')
        plt.title('Local vs Global Minimum')
        plt.xlabel('x')
        plt.ylabel('f(x)')
        plt.legend()
        plt.show()

        • 특정 구간에서 가장 낮은 점이 전체의 가장 낮은 점은 아닐 수 있음

Stochastic Gradient Descent, SGD (확률적 경사하강법)

  • 확률적 경사하강법은 경사 하강법의 변형 중 하나로, 전체 데이터셋이 아닌 하나의 데이터 포인트에 대해 기울기를 계산하고 파라미터를 업데이트
  • 각 단계에서 하나의 데이터 포인트만 사용하므로 계산이 빠름
  • 랜덤하게 선택된 데이터 포인트로 인해 기울기에 노이즈가 발생
  • 노이즈가 최적화 경로를 불안정하게 하지만, 지역 최솟값(local minimum) 을 벗어나는 데 도움이 될 수 있음
  • 초기화
    • 파라미터를 임의로 초기화.
  • 반복 과정
    • 데이터셋에서 랜덤하게 하나의 데이터 포인트를 선택.
    • 선택된 데이터 포인트에 대한 손실 함수의 기울기를 계산.
    • 파라미터를 기울기 방향으로 업데이트.
    • 이 과정을 전체 데이터셋에 대해 반복.

Epock (에폭)

  • 하나의 에폭 동안, 모델은 전체 데이터셋을 한 번 모두 사용하여 가중치 업데이트를 수행
  • 여러 에폭을 거치며 모델은 데이터셋을 ㅇ여러 번 반복하여 학습
  • 너무 많은 에폭은 과적합을 초래할 수 있음, 너무 적은 에폭은 과소적합을 초래

데이터 표준화 (Standardization)

  • 데이터 전처리 단계에서 중요한 기법
  • 각 피처(feature) 가 공통된 스케일을 갖도록 변환하는 과정
  • StandardScaler 라이브러리를 이용하여 간단하게 표준화 가능
    • fit: 데이터의 평균과 표준편차 계산하여 스케일러 학습
    • transform: 학습된 스케일러를 사용하여 데이터 표준화
    • fit_transform: fit과 transform을 한 번에 수행
from sklearn.preprocessing import StandardScaler
import numpy as np

# 샘플 데이터 생성
data = np.array([[1.0, 2.0, 3.0],
                 [4.0, 5.0, 6.0],
                 [7.0, 8.0, 9.0]])

# StandardScaler 객체 생성
scaler = StandardScaler()

# 데이터의 평균과 표준편차 계산하여 스케일러 학습
scaler.fit(data)

# 학습된 스케일러를 사용하여 데이터 표준화
standardized_data = scaler.transform(data)

# 또는 fit과 transform을 한 번에 수행
standardized_data = scaler.fit_transform(data)

# 표준화된 데이터를 원래 스케일로 변환
original_data = scaler.inverse_transform(standardized_data)

# 각 피처의 평균과 표준편차 확인
print("Mean:", scaler.mean_)
print("Scale:", scaler.scale_)
print("Variance:", scaler.var_)

print("원본 데이터:\n", data)
print("표준화된 데이터:\n", standardized_data)
print("복원된 데이터:\n", original_data)
Mean: [4. 5. 6.]
Scale: [2.44948974 2.44948974 2.44948974]
Variance: [6. 6. 6.]
원본 데이터:
 [[1. 2. 3.]
 [4. 5. 6.]
 [7. 8. 9.]]
표준화된 데이터:
 [[-1.22474487 -1.22474487 -1.22474487]
 [ 0.          0.          0.        ]
 [ 1.22474487  1.22474487  1.22474487]]
복원된 데이터:
 [[1. 2. 3.]
 [4. 5. 6.]
 [7. 8. 9.]]

  1. loss.backward()

    • loss.backward()는 손실 함수의 값인 loss에 대해 모든 파라미터에 대한 기울기를 계산하는 메서드 (역전파 수행)
    • 이 메서드는 각 파라미터의 grad 속성에 기울기를 저장
    import torch
    import torch.nn as nn
    
    # 간단한 모델 정의
    model = nn.Linear(2, 1)
    criterion = nn.MSELoss()  # 손실 함수 정의
    
    # 임의의 입력과 출력
    inputs = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
    targets = torch.tensor([[5.0], [6.0]])
    
    # 예측
    outputs = model(inputs)
    
    # 손실 함수 계산
    loss = criterion(outputs, targets)
    
    # 기울기 계산
    loss.backward()
  2. optimizer.step()

    • optimizer.step()은 기울기를 사용해 파라미터를 업데이트하는 메서드
    • 이전에 계산된 기울기를 바탕으로 파라미터를 조정
    import torch.optim as optim
    
    # 옵티마이저 정의
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    
    # 기울기 계산 후 파라미터 업데이트
    loss.backward()  # 기울기 계산
    optimizer.step()  # 파라미터 업데이트
  3. optimizer.zero_grad()

    • optimizer.zero_grad() 는 모든 파라미터의 기울기를 0으로 초기화
    • 이전 기울기가 누적되지 않도록 하기 위함
    # 파라미터 업데이트 후 기울기 초기화
    optimizer.step()  # 파라미터 업데이트
    optimizer.zero_grad()  # 기울기 초기화
profile
같이 공부합시다~

0개의 댓글

관련 채용 정보