Linear Regression with Pytorch
Linear Regression (선형 회귀)
선형 회귀란, 주어진 데이터의 선형 관계를 모델링하는 방법이다. 선형 회귀의 기본 아이디어는 입력 변수와 출력 변수 사이의 관계를 직선(또는 다차원에서는 평면)으로 설명하는 것이다.
우리는 특징 변수와 목표 변수 사이의 선형 관계를 분석하기 위해서 "표본상관계수"를 이용한다.
상관계수 = 1
- 의미: 두 변수 간에 완벽한 양의 선형 관계가 있다
상관계수 = 0
- 의미: 두 변수 간에 선형 관계가 없음을 나타낸다.
상관계수 = -1
- 의미: 두 변수 간에 완벽한 음의 선형 관계가 있다.
# 상관계수 계산
corr_matrix = np.corrcoef(x, y)
# 상관계수 행렬 출력
print("Correlation matrix:")
print(corr_matrix)
# 상관계수 추출
corr_coefficient = corr_matrix[0, 1]
print(f"Pearson Correlation Coefficient between x and y: {corr_coefficient}")
선형 회귀 모델
이때 변수간의 선형관계를 함수로 모델링한 것이 선형 회귀 모델이다.
선형 회귀 모델의 주요 목표는 주어진 데이터에 가장 잘 맞는 직선 또는 평면을 찾는 것이다.
1. 단순 선형 회귀
2. 다중 선형 회귀
선형 회귀 모델의 손실함수
경사하강법을 통하여 손실함수를 최소화 한다.
캐글을 이용한 예제
https://www.kaggle.com/competitions/playground-series-s4e7
Binary Classification of Insurance Cross Selling | Kaggle
www.kaggle.com
캐글 Playground에 있는 'Binary Classification of Insurance Cross Selling' 이용하여 선형회귀를 진행해보자.
목표
'특징 변수': Gender, Age, Driving_License, Region_Code등 10개
'목표 변수': Response.
캐글 데이터의 선형 회귀 모델
1. 데이터 생성, 데이터 처리
# 1. 데이터 생성
train_data = pd.read_csv("/kaggle/input/playground-series-s4e7/train.csv")
test_data = pd.read_csv("/kaggle/input/playground-series-s4e7/test.csv")
# 데이터 처리
# Object Type은 일단 제거해 둔다.
# id 또한 학습에는 필요없는 데이터이므로 제거해준다.
y = train_data['Response']
train_data.drop(labels=['id'],axis=1,inplace=True)
train_data.drop(labels=['Response'],axis=1,inplace=True)
train_data.drop(labels=['Gender'],axis=1,inplace=True)
train_data.drop(labels=['Vehicle_Age'],axis=1,inplace=True)
train_data.drop(labels=['Vehicle_Damage'],axis=1,inplace=True)
'train_data'의 'Response'는 목표 변수이기 때문에 y에 담아두고 'train_data'에선 제거해준다.
'train_data'에 존재하는 'id'는 학습에 필요없는 데이터 이므로 제거해준다.
'Gender', 'Vehicle_Age', 'Vehicle_Damage'는 Object Type이므로 곧바로 학습에 이용할 수 없기 때문에 제거해준다.
2. 데이터 정규화
# 2. 데이터 정규화
# 실제론 Driving_License와 Previously_Insured값은 0,1 밖에 없지만 편의를 위해 모두 표준화 한다
from sklearn.preprocessing import StandardScaler
scaler_X = StandardScaler()
#scaler_y = StandardScaler()
X_normalized = scaler_X.fit_transform(train_data)
#y_normalized = scaler_y.fit_transform(y.values.reshape(-1, 1))
#X_np = X_normalized.to_numpy()
y_np = y.to_numpy()
X_tensor = torch.tensor(X_normalized, dtype = torch.float32) # torch.Size([11504798, 7])
y_tensor = torch.tensor(y_np, dtype = torch.float32).view(-1, 1) # torch.Size([11504798, 1])
sklearn의 StandardScaler을 통해 'train_data'를 정규화해준다.
이때 'Driving_License'와 'Previously_Insured'의 데이터는 0과1의 값밖에 가지지 않지만 편의를 위해 모두 표준화 한다.
목표 변수인 'Response'는 0과 1의 값 밖에 가지지 않으므로 표준화를 진행하지 않는다.
3. 모델 정의
# 3. 모델 정의
import torch.nn as nn
class LinearRegressionModel(nn.Module):
def __init__(self, input_size):
super(LinearRegressionModel, self).__init__()
self.linear = nn.Linear(input_size, 1) # 입력 차원 input_size, 출력 차원 1
def forward(self, x):
return self.linear(x)
model = LinearRegressionModel(X_tensor.shape[1])
torch의 nn.Module을 이용하여 'LinearRegressionModel'을 정의한다.
4. 손실 함수와 옵티마이저 정의
# 4. 손실 함수와 옵티마이저 정의
import torch.optim as optim
criterion = nn.MSELoss() # 평균 제곱 오차
optimizer = optim.SGD(model.parameters(), lr=0.0001) # 확률적 경사 하강법
손실함수는 MSE를 사용하고, 옵티마이저로는 SGD를 사용해준다.
5. 모델 학습
# 5. 모델 학습
num_epochs = 100000
for epoch in range(num_epochs):
# 모델 예측
y_pred = model(X_tensor)
# 기울기 초기화
optimizer.zero_grad()
# 손실 계산
loss = criterion(y_pred, y_tensor)
# 역전파 수행
loss.backward()
# 가중치 업데이트
optimizer.step()
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')
6. Test data로 모델 평가
# 5. Test data로 모델 평가
#test_data = pd.read_csv("/kaggle/input/playground-series-s4e7/test.csv")
test_data.drop(labels=['id'],axis=1,inplace=True)
test_data.drop(labels=['Gender'],axis=1,inplace=True)
test_data.drop(labels=['Vehicle_Age'],axis=1,inplace=True)
test_data.drop(labels=['Vehicle_Damage'],axis=1,inplace=True)
test_normalized = scaler_X.fit_transform(test_data)
X_test_tensor = torch.tensor(test_normalized, dtype = torch.float32)
model.eval()
y_pred = model(X_test_tensor)
'test_data'도 'train_data'와 같은 방법으로 특정 데이터를 제거해준다.
또한, 같은 scaler로 데이터 정규화를 진행해준다.
학습된 모델에 Test한다.
https://www.kaggle.com/code/hyojesung/linear-regression-in-pytorch
Linear Regression in Pytorch
Explore and run machine learning code with Kaggle Notebooks | Using data from Binary Classification of Insurance Cross Selling
www.kaggle.com
결과
위의 코드를 이용하여 얻은 결과값.
sklearn을 이용해서 진행한 Linear Regression의 결과값.
향후 개선 가능한 부분들
1. epochs의 값을 적절하게 조절한다.
2. SGD optimizer를 다른 optimizer로 바꿔준다.
3. Object Type들을 학습에 사용한다.
4. 정규화가 필요하지 않은 데이터는 정규화를 진행하지 않는다.