본문 바로가기
AI/딥러닝

[Ch.01] 03 - Pytorch 를 활용한 간단한 회귀분석

by AI-BT 2023. 1. 2.
728x90
반응형

1. 회귀분석 

 

회귀는 개별적인 레이블 대신에 연속적인 값을 예측하는 문제 입니다.

예를 들어 기상 데이터가 주어졌을 때 내일 기온을 예측하거나, 소프트웨어 명세가 주어졌을 때 소프트웨어 프로젝트가 완료될 시간을 예측하는 것입니다.

우리는 scikit-learn 을 활용해 보스턴 집값을 에측하는 학습 코드가 이번 내용 입니다.

(* scikit-learn - 머신러닝용 파이썬 라이브러리 및 다양한 데이터셋을 제공)


2. 데이터 살펴보기

보스턴 집값 데이터셋을 코드로 먼저 살펴보겠습니다.

from sklearn.datasets import load_boston

dataset = load_boston()
print(dataset.keys())

# 출력
# dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename', 'data_module'])

# 설명
# data : 특징값
# target : 정답
# feature_names : 각 특징의 이름
# DESCR : description 의 약자로 데이터셋에 대한 전반적인 정보
# filename : 데이타셋의 csv 파일이 존재하는 위치

다운 받은 데이터셋의 대한 keys 값과 각각의 특징들이 들어 있습니다.

아래 코드는 key

import pandas as pd
from sklearn.datasets import load_boston
dataset = load_boston()
dataFrame = pd.DataFrame(dataset['data'])
dataFrame.columns = dataset['feature_names']
dataFrame['target'] = dataset['target']

print(dataFrame.head())

# 결과
      CRIM    ZN  INDUS  CHAS    NOX     RM   AGE     DIS  RAD    TAX  \
0  0.00632  18.0   2.31   0.0  0.538  6.575  65.2  4.0900  1.0  296.0   
1  0.02731   0.0   7.07   0.0  0.469  6.421  78.9  4.9671  2.0  242.0   
2  0.02729   0.0   7.07   0.0  0.469  7.185  61.1  4.9671  2.0  242.0   
3  0.03237   0.0   2.18   0.0  0.458  6.998  45.8  6.0622  3.0  222.0   
4  0.06905   0.0   2.18   0.0  0.458  7.147  54.2  6.0622  3.0  222.0

   PTRATIO       B  LSTAT  target  
0     15.3  396.90   4.98    24.0  
1     17.8  396.90   9.14    21.6  
2     17.8  392.83   4.03    34.7  
3     18.7  394.63   2.94    33.4  
4     18.7  396.90   5.33    36.2

 

 [01]  CRIM 자치시(town) 별 1인당 범죄율
 [02]  ZN 25,000 평방피트를 초과하는 거주지역의 비율
 [03]  INDUS 비소매상업지역이 점유하고 있는 토지의 비율
 [04]  CHAS 찰스강에 대한 더미변수(강의 경계에 위치한 경우는 1, 아니면 0)
 [05]  NOX 10ppm 당 농축 일산화질소
 [06]  RM 주택 1가구당 평균 방의 개수
 [07]  AGE 1940년 이전에 건축된 소유주택의 비율
 [08]  DIS 5개의 보스턴 직업센터까지의 접근성 지수
 [09]  RAD 방사형 도로까지의 접근성 지수
 [10]  TAX 10,000 달러 당 재산세율
 [11]  PTRATIO 자치시(town)별 학생/교사 비율
 [12]  B 1000(Bk-0.63)^2, 여기서 Bk는 자치시별 흑인의 비율을 말함.
 [13]  LSTAT 모집단의 하위계층의 비율(%)
 [14]  target 본인 소유의 주택가격(중앙값) (단위: $1,000)

 

집값에 영향을 미치는 13개의 요소와 

마지막 14번째 행은 우리가 원하는 집값이 있습니다.


3. 학습 

위의 데이터로 학습을 진행 하겠습니다.

 

# 모델 정의 및 학습하기

# 선형회귀 : 데이터를 y 와 x 의 관계를 나타내는 직선으로 나타내는 방법
# MSE(평균 제곱 오차) :오차에 제곱을 취하고 평균을 낸 값 --> 작은 오차와 큰 오차를 강하게 대비시킬 수 있어서 유용

import torch
import torch.nn as nn

from torch.optim.adam import Adam

# 1 - 모델 정의
model = nn.Sequential(
    nn.Linear(13, 100), # MLP 모델의 의미하며 13 입력차원, 100 출력 차원
    nn.ReLU(),
    nn.Linear(100, 1)
)

# 2 - 입력값, 정답 
X = dataFrame.iloc[:, :13].values # 정답을 제외한 특징을 x 에 입력
Y = dataFrame["target"].values # 데이터프레임의 tartget 값을 추출

batch_size = 100
lr = 0.001

# 3 - 가중치를 수정하는 최적화 함수 정의
# 최적화 기법은 역전파된 오차를 이용해 가중치를 수정하는 기법
optim = Adam(model.parameters(), lr = lr)

# 4 - 학습
for epoch in range(200):
    for i in range(len(X)//batch_size):
        start = i * batch_size
        end = start + batch_size

        x = torch.FloatTensor(X[start:end]) # 파이토치 텐서로 변환
        y = torch.FloatTensor(Y[start:end])

        optim.zero_grad() # 5 - 가중치의 기울기를 0으로 초기화
        preds = model(x) # 6 -모델의 예측값 계산
        loss = nn.MSELoss()(preds, y) # 7 - MSE 손실 계산
        loss.backward() # 8 - 오차 역전파
        optim.step() # 9 - 최적화 진행

    if epoch % 20 == 0:
        print(f"epoch{epoch} loss:{loss.item()}")

결과

epoch0 loss:122.77743530273438
epoch20 loss:40.59861373901367
epoch40 loss:39.282562255859375
epoch60 loss:38.735111236572266
epoch80 loss:38.41518783569336
epoch100 loss:38.178035736083984
epoch120 loss:37.87348937988281
epoch140 loss:37.68062973022461
epoch160 loss:37.54378890991211
epoch180 loss:37.318416595458984

 

코드에 주석표시 되어있으니, 참고 해주세요!!


4. 모델 성능 평가

# 모델 성능 평가
prediction = model(torch.FloatTensor(X[0, :13]))
real = Y[0]
print(f"예측 값:{prediction.item()} 정답:{real}")

결과

prediction:25.72    real:24.0

 

예측값이 실제값과 크게 차이는 나지 않지만, 정확도는 다소 떨어 집니다.

정확도를 올리고 싶으면 모든 특징의 범위를 동일하게 하거나 추가 데이터 전처리가 필요 합니다.

 

간단하게 회귀문제를 Pytorch 프레임워크를 활용하여 풀었습니다.

다음 포스팅은 대표적인 다중분류인 손글씨에 대해서 포스팅 하겠습니다.

 

 

 

728x90
반응형

댓글