테스트 데이터 표준화 및 변환, 이진 분류, 배치(Batch), 가능도, 이진 교차 엔트로피
테스트 데이터
# 테스트 데이터를 입력받아 예측된 연봉을 반환하는 함수의 코드 표현
def predict_test_data(test_data)
# 테스트 데이터 표준화
# scaler_x.transform(argument) -> argument를 표준화하는 역할
test_scaled = scaler_x.transform(test_data.reshape(-1, 1))
# reshape(-1, 1) -> 열을 1, 행이 나머지
#표준화한 테스트 데이터를 PyTorch Tensor로 변환
test_tensor = torch.tensor(test_scaled, dtype=torch.float32).view(-1, 1).to(device)
model.eval() #모델을 평가 모드로 전환
with torch.no_grad(): #그래디언트 계산을 비활성화 -> 메모리 사용을 줄이고 예측 속도를 높이는 역할
predictions_scaled = model(test_tensor) #모델을 사용해 표준화된 예측 수행
#예측된 결과의 표준화를 해제하는 코드 표현
predictions = scaler_t.inverse_transform(predictions_scaled.cpu().numpy())
#scaler_t.inverse_transform() -> 예측된 값을 원래의 scale로 되돌리는 코드
#predictions_scaled.cpu().numpy() -> GPU에서 연산한 값이라면 다시 CPU로 이동
return predictions
no_grad()
의 역할은?
학습을 시킨다는 것 → 최적의 매개변수(w, b)를 찾는 것
이진 분류 모델
특징 변수와 목표 변수 사이의 관계를 학습
단, 목표 변수가 두 가지 범주를 가진다!
(ex) 이메일 스팸 분류 → 스팸 메일 / 스팸이 아닌 메일
#트레이닝 데이터를 불러오는 코드 표현
df = pd.read_csv(“Iris.csv”, sep = “,”, header = 0)[[“PetalLengthCm”, “Species”]]
#Iris_data 데이터 프레임에서 Species 열의 값이 Iris-setosa
#또는 Iris-versicolor인 행을 필터링하여, filtered_data라는 새로운 데이터 프레임을 생성하는 코드 표현
filtered_data = df[df[‘Species’].isin([‘Iris_setosa’, ‘Iris-versicolor’])]
#Iris_data 데이터 프레임에서 ‘Species’을 선택하는 코드 표현
df[‘Species’].isin([‘Iris_setosa’, ‘Iris-versicolor’])
#Species 열의 각 값이 Iris-setosa 또는 Iris-versicolor와 일치하면 True, 그렇지 않으면 ‘False’를가지는 Boolean Series 코드 표현
데이터 분할
#트레이닝 데이터와 테스트 데이터를 분할하기 위해
#sklearn.model_selection 모듈에서 train_test_split 함수를 임포트
from sklearn.model_selection import train_test_split
#특징 변수 x와 목표 변수 t를 섞어서 학습용 데이터와 테스트용 데이터 분할하는 코드
train_test_split(x, t, test_size = 0.2, random_state = 42)
#test_size = 0.2 -> 8:2로 나눈다는 의미
#ramdom_state(난수 시드) = 42는 관습적인 수 -> 어떤 정수를 사용해도 사실 무방하다
데이터 표준화 모델
from sklearn.preprocessing import StandardScaler
#StandardScaler 객체를 생성해서 scaler에 할당하여 표준화하는 코드 표현
scaler = StandardScaler()
# 트레이닝 데이터의 특징 변수 x를 fit 단계에서 통계량(statistic)을 계산하고 transform 단계에서
# 데이터를 표준화하는 코드 표현
x_train = scaler.fit_transform(x_train)
#테스트 데이터의 특징 변수를 표준화하는 코드 표현
x_test = scaler.transform(x_test)
데이터를 Tensor로 변환할 때 주의점
x_train = torch.tensor(x_train, dtype = torch.float32)
t_train = torch.tensor(t_train, dtype = torch.float32).unsqueeze(1)
t_train(목표 변수)을 unsqueeze 함수를 사용해서 2차원으로 변환하는 이유?
- 배치 처리를 위해서는 목표 변수의 형태가 [N, 1]이 되어야 함
- 특징 변수(x)는 [데이터 수, 특징 수]이기 때문에 이미 2차원이며, 일관된 데이터 형태를
위해 목표 변수 또한 2차원 Tensor로 변환 - 손실 함수 또한 2차원 Tensor 형태를 기대하므로 호환성을 위해 2차원 Tensor로 변환
Batch(배치)란?
미니 배치 경사하강법
PyTorch 프레임워크에서 Dataset과 DataLoader 클래스를 가지고 오는 코드 표현
from torch.utils.data import DataLoader, TensorDataset
Batch Size는 보통 2의 n승으로 지정하는데, 본인의 GPU의 VRAM 용량에 따라 Out of memory가 발생하지 않도록 정해줘야 한다.
또한, 가능하면 학습데이터 갯수에 나누어 떨어지도록 지정하는 것이 좋은데, 마지막 남은 배치가 다른 사이즈이면 해당 배치의 데이터가 학습에 더 큰 비중을 갖게 되기 때문이다.
예를 들어, 530 개의 데이터를 100개의 배치로 나누면, 각 배치 속 데이터는 1/100 만큼의 영향력을 갖게 된다. 그러나 마지막 배치(30개)의 데이터는 1/30의 영향력을 갖게 되어 과평가되는 경향이 있다. 그렇기 때문에 보통 마지막 배치의 사이즈가 다를 경우 이는 버리는 방법을 사용한다.
이진 분류 알고리즘
로지스틱 회귀 알고리즘
- 시그모이드 함수
$$
y = Sigmoid(z) = \frac{1}{1 + exp(-z)}
$$
이진 교차 엔트로피
- 시그모이드 함수에 의해 계산된 0과 1 사이의 값을 가지는 y
- 정답(실제 레이블) $t_{i}$ = 0 or 1 과의 오차를 바탕으로 표현된 함수식
$$
E(w,b)=-\Sigma_{i=1}^{n}[{t_{i}logy_{i} + (1-t_{i})log(1-y_{i})}]
$$
n = 데이터 샘플의 수
$y_{i}$ = 모델의 객체 값인 0과 1 사이의 확률 값
log = 자연 로그
조건부 확률
- 사건 A가 발생한 상황 하에서 다른 사건 B가 발생할 확률을 의미
최대 가능도 추정 (MLE)
- 특정 데이터셋이 있을 때 이 데이터셋을 가장 잘 설명할 수 있는 파라미터 → 모수 찾기
- 모수 = 모집단으로부터 얻을 수 있는 통계치, 모집단을 대표하는 값
- 이 모수를 찾기 위해 가능도(likelihood) 함수를 최대화 하는 과정
- 실제로 계산된 구체적인 모수 값 = 최대 가능도 추정치(Maximum Likelihood Estimate)
가능도
주어진 데이터가 특정 모수 값 하에서 관찰될 확률
$$
L(\Theta;x_{0}=1)=P(x_{0} = 1|\Theta)
$$
$x_{0}$가 1인 데이터가 주어졌을 때 𝜃의 가능도 = 𝜃가 주어졌을 때 $x_{0}$가 1일 확률
- 가능도 함수가 최대값이 되어야 하는 이유는 최대 가능도 추정의 목표가 주어진 데이터에 가장 적합한 모수를 찾는 것이기 때문
- 가능도 함수의 최대값을 찾는 방법 = 미분계수가 0이 되는 지점을 찾는 것.
즉, 찾고자 하는 𝜃에 대하여 로그를 취한 로그 가능도 함수를 편미분하고 그 값이 0이 되도록 하는
𝜃를 찾는 과정을 통해 가능도 함수를 최대화 시켜줄 수 있는 𝜃를 찾을 수 있음
이진 분류 테스트
#t_test 텐서를 넘파이 배열로 변환하는 코드 표현
actual_labels = t_test.numpy() **#시각화 및 비교를 하기 위함**
#predicted_labels 텐서를 넘파이 배열로 변환하는 코드 표현
predicted_labels = predicted_labels.numpy()
#predicted_labels을 1차원 배열로 출력하는 코드 표현
print(“Predictions:”, predicted_labels.flatten())
#actual_labels을 1차원 배열로 출력하는 코드 표현
print(“Actual Labels:”, actual_labels.flatten())
'Study - AI > Torch & Tensor' 카테고리의 다른 글
Tensor 연산 방식 (0) | 2025.01.03 |
---|---|
Tensor 생성 및 변환 (0) | 2025.01.02 |
PyTorch & Tensor (0) | 2025.01.02 |