인프런 커뮤니티 질문&답변

Gyeongdeok PARK님의 프로필 이미지
Gyeongdeok PARK

작성한 질문수

처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part4]

데이터로 딥러닝 적용해보기 (당뇨병 환자 데이터)

데이터 범위 질문

작성

·

380

·

수정됨

0

- 강의 영상에 대한 질문이 있으시면, 주말/휴일 제외, 2~3일 내에 답변드립니다
- 우선 질문전에 검색을 꼭 해보세요. 저희 목표는 스스로 이슈를 해결하는 역량을 기르는 것이고, 이는 즉 검색역량을 기르는 것입니다
- 강의 영상 외적인 질문은 인프런 커뮤니티 (https://www.inflearn.com/community/questions) 도 활용해보세요~

강사님 고생많으십니다. 강의 잘 듣고 있습니다.

한가지 의문점이 생겨서 질문드립니다.

 

당뇨병 환자 데이터 강의에서는 data의 범위를 설정하실때 제일 마지막 부분이 target이라서 빼신것이라고 이해했습니다.

dataframe으로 출력해서 descr과 함께 확인했는데. target은 따로 되어있는것이 아닌지... 제가 잘못 보고 있는 것인지 궁금합니다.

만약 제 말이 맞다고 가정하였을때 코드를 실행해보면 target의 사이즈는 422로 나옵니다 차원값이 없는데 이부분을 unsqueeze를 해서 차원을 추가해주면 될까요Screenshot 2023-04-07 at 3.15.42 AM.png

저렇게 했을때 loss값이 3000이 넘습니다.

optimizer를 adam이나 learning rate를 변경해줘봐도 의미는 없는것 같습니다. 단층이라서 그런것 같은데.

위에 데이터의 범위와 차원 추가하는 방법이 맞는 것인지 궁금합니다.

답변 1

0

안녕하세요. 답변도우미입니다.

말씀하신 부분을 한참 봤는데요. 일반적인 가이드가 있을 수 있고, 말씀하신 코드에 대한 의문이 조금 있기도 해요. 우선 다음과 같이 x, y 를 만들어서, 제공해드린 05_GRADIENT_DESCENT_AUTOGRAD 기반 코드로 optimizer 등을 설정하여 돌리면, loss 가 1 이하로 나오거든요. 그런데, 말씀하신 대로 하신 이유가 정확히 이해는 가지 않더라고요. 다음과 같이 진행을 해보시는 건 어떠실까요? 그리고 이 때의 x, y 는 다음과 같은 형태로 구성이 됩니다. 그래야 적절히 기존 코드상으로 결과가 정상 계산이 되거든요. 이부분을 작성하신 코드로 인한 x, y 의 shape 과 비교해보시면서 테스트를 해보시면 바로 확인이 가능할 것 같아요.

shape of x is : torch.Size([442, 9]) shape of y is : torch.Size([442, 1])

x = torch.from_numpy(np.array(diabetes_data.data[:, :-1], dtype=np.float32))

y = torch.from_numpy(np.array(diabetes_data.data[:, [-1]], dtype=np.float32))

#shape

print('shape of x is : ',x.shape)

print('shape of y is : ',y.shape)

 

추가로 일반적인 가이드로는 당뇨병 환자 데이터셋에서 target(타겟)은 종속 변수로, 이 예제에서는 당뇨병 진행 정도를 나타냅니다. 데이터프레임 내에 target이 함께 포함되어 있는지 확인하기 위해 데이터셋 구조와 데이터프레임의 처음 몇 행을 출력해보세요. 예를 들면 다음과 같이 출력할 수 있습니다.

print(dataset.data.shape)

print(dataset.target.shape)

print(dataset.feature_names)

print(df.head())

타겟의 크기가 (422,)로 나온 것은, 이 데이터셋에서 샘플이 총 422개 있으며 각 샘플에 대한 단일 값이 있음을 나타냅니다. 이 경우 unsqueeze를 사용하여 차원을 추가할 수 있습니다. unsqueeze를 사용하여 새로운 차원을 추가하려면 다음과 같이 코드를 작성하세요.

import torch

target_tensor = torch.tensor(dataset.target)

target_tensor = target_tensor.unsqueeze(1) # 1차원 벡터를 2차원으로 변경 (422,) -> (422, 1)

다만, loss 값이 3000이 넘는 것은 학습이 제대로 이루어지지 않고 있다는 것을 나타냅니다. optimizer를 변경하거나 learning rate를 조절하는 것도 도움이 될 수 있지만, 문제의 원인이 데이터 전처리나 모델 구조에 있을 수도 있습니다. 확실하지는 않지만, 왠지 데이터 전처리와 모델 구조가 맞지 않아서 그런 결과가 나올 것 같아요. 또 입력 차원과 출력 차원이 올바른지, 활성화 함수와 손실 함수가 적절한지 등을 확인해 보시기 바랍니다.

또한, 데이터셋을 표준화하거나 정규화하여 값의 범위를 조정하면 학습 성능이 향상될 수 있습니다. 이를 위해 StandardScaler 또는 MinMaxScaler와 같은 사이킷런의 전처리 도구를 사용할 수 있습니다.

감사합니다.

Gyeongdeok PARK님의 프로필 이미지
Gyeongdeok PARK

작성한 질문수

질문하기