오늘 배운 내용은 선형회귀!
상관관계(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값을 가져온다.
신경망을 정의하고 구축하는 데 사용되는 기본 클래스
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) # 학습률은 알잘딱하게 설정해야 함
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)
우선 강의를 듣고 복습하면서 정리하는 것이 더 잘맞는 것 같다. 강의 들으면서 잘 모르겠는 부분은 계속 메모 하면서 듣기!
어제까지는 괜찮았는데 오늘 선형회귀를 듣고 좀 어지러웠다. 수학, 통계학적 기초가 부족하니 벌써 어려워 지는 것 같았다. 주말에 부족한 부분 보충해서 공부 열심히 해보자!