티스토리 뷰

DL/Pytorch

[Ch3] 선형회귀분석

jeong_reneer 2022. 1. 15. 19:44

3.1 선형회귀분석

선형회귀분석 : 주어진 데이터를 가장 잘 설명하는 직선을 찾는 것

단순선형회귀(Simple Linear Regression) : 하나의 독립변수에 대한 선형회귀

= x, y 라는 데이터가 주어졌을 때, y = w*x + b 에서 데이터를 가장 잘 표현할 수 있는 가중치 w와 편차 b를 찾는 것

다중선형회귀(Multivariate Linear Regression) : 여러 개의 독립변수에 대한 선형회귀

 

3.2 손실 함수 및 경사하강법

1) 손실함수(loss function)

ex) 평균제곱오차(MSE) : 예측값과 실제값의 차이를 제곱(L2 loss)하여 평균한 것

 

2) 경사하강법(gradient descent)

: w_(t+1) = w_t - gradient * learning rate

 

3.3 파이토치에서의 경사하강법

1) 파이토치

(1) 데이터 기본 연산 단위 : Tensor = 다차원 배열 (multidimensrional array)

torch.tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False)

data : 배열

dtype : 데이터를 저장할 자료형 (기본값 : FloatTensor)

device : 해당 텐서를 어느 기기에 올릴 것인지 (CPU or CUDA device)requires_grad : 해당 텐서에 대한 기울기를 저장할지 - backward() 통해 기울기 계산 결과를 얻으려면 True로 설정해줘야 함- True로 설정하더라도, with torch.no_grad() 통해 해당 부분만 기울기 계산을 끌 수 있음 (Inference Mode)

 

(2) 라이브러리

torch.nn as nn : 인공신경망 모델 (ex. Linear, Convolution, RNN 등)

torch.optim as optim : 모델 최적화 함수 (ex. SGD, ADAM, LBFGS 등)

torch.nn.init as init : 텐서 초기화하는 함수 (ex. uniform, normal, xavier 등)

 

2) 선형회귀

# 데이터 생성
num_data = 1000 
num_epoch = 500
noise = init.normal_(torch.FloatTensor(num_data,1),std=0.2)
x = init.uniform_(torch.Tensor(num_data,1),-10,10) # (1000 x 1)
y = 2*x+3
y_noise = y + noise # (1000 x 1)

# 데이터 시각화
plt.figure(figsize=(10,10))
plt.scatter(x.numpy(),y_noise.numpy(),s=7,c="gray")
plt.axis([-12, 12, -25, 25])
plt.show()

# 모델, 손실함수, 최적화함수 설정
model = nn.Linear(1,1)
loss_func = nn.L1Loss()
optimizer = optim.SGD(model.parameters(),lr=0.01)

# 모델 학습 및 중간 확인
loss_arr =[] # 손실 변화 확인 위해
label = y_noise # 목표값

for i in range(num_epoch):
    optimizer.zero_grad() # 이전 학습의 기울기 삭제하여 최적화 함수 초기화
    output = model(x)
    loss = loss_func(output,label)
    loss.backward() # 손실에 대한 기울기
    optimizer.step() # 구한 기울기 통해 모델의 변수 업데이트
     
    # loss_arr에 손실값 추가
    loss_arr.append(loss.detach().numpy())


# 손실 그래프
plt.plot(loss_arr)
plt.show()

# 최종 결과 확인
plt.figure(figsize=(15,15))
plt.scatter(x.numpy(), y_noise.numpy(), s=5,c="gray")
plt.scatter(x.detach().numpy(), output.detach().numpy(), s=5, c="red")
plt.axis([-10, 10, -30, 30])
plt.show()

# 학습 후 모델 변수(weight, bias) 값 확인
param_list = list(model.parameters())
print("Weight:",param_list[0].item(),"\nBias:  ",param_list[1].item())

 

 

+) 추가 내용

https://jeonggg119.tistory.com/18

 

[DS] 통계기초/회귀분석

1. 통계기초 1) ML : 지도학습(회귀, 분류) + 비지도학습(군집화, 변화, 연관) + 강화학습 독립변수, 종속변수가 존재할 때 - 회귀(Regression) : 예측하고 싶은 종속변수가 숫자(수치형 데이터)일 때 사

jeonggg119.tistory.com

 

'DL > Pytorch' 카테고리의 다른 글

[Ch7] 학습 시 생길 수 있는 문제점 및 해결방안  (0) 2022.01.22
[Ch6] 순환신경망(RNN)  (0) 2022.01.20
[Ch5] 합성곱 신경망(CNN)  (0) 2022.01.15
[Ch4] 인공 신경망(ANN)  (0) 2022.01.15
[Ch1, 2] Deep Learning & Pytorch  (0) 2022.01.10
댓글
공지사항