강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của gnb12022890
gnb12022890

câu hỏi đã được viết

Bí mật của giao dịch thuật toán, cách AI dự đoán giá cổ phiếu

Mô hình Transformer hoàn tất và đánh giá mã

섹션4의 10강 질문이 있습니다.

Viết

·

43

1

train_size = int(len(data) * 0.8) 
train_data = data.iloc[:train_size]       test_data = data.iloc[train_size:]       

훈련과 테스트 8:2로 잘 나누고

for i in range(lookback, len(data_scaled) - forecast_horizon):

이렇게 돌리면 그냥 전체 데이터를 학습한거 아닌가요?

결국 안나누고 학습한 것 같은데, 그럼 이 프로젝트는 그냥 데이터를 모두 학습한거죠?

LR 버전으로 리팩토링해서 돌려보고 있는데 과적합뜨는 것 보니까 그냥 완전 똑같이 나오더라구요.

python딥러닝재테크lstmtransformer

Câu trả lời 2

0

cheatkeylab님의 프로필 이미지
cheatkeylab
Người chia sẻ kiến thức

안녕하세요, @gnb1202님.

문제를 정확하게 잘 짚어주셨습니다.

현재 코드대로면 테스트 데이터까지 학습에 포함되어 있어서 lookahead bias가 발생합니다.

for i in range(lookback, len(data_scaled) - forecast_horizon):

위 for loop에 data_scaled전체 데이터(train + test)를 scaling한 것이기 때문.

우선 아래 두 군데를 변경해서 테스트해보시길 바랍니다.

저도 곧 업데이트 본 반영하도록 하겠습니다.

 

  1. 스케일러 부분

print("Scaling data...")
train_size = int(len(data) * 0.8)
train_data = data.iloc[:train_size]
test_data = data.iloc[train_size:]

# 스케일러는 train에만 fit !!!
stock_scaler = MinMaxScaler()
econ_scaler = MinMaxScaler()

# train 데이터로만 fit
stock_scaler.fit(train_data[target_columns])  
econ_scaler.fit(train_data[economic_features])

# 전체 데이터는 transform만
data_scaled = data.copy()
data_scaled[target_columns]    = stock_scaler.transform(data[target_columns])     # ← fit_transform → transform으로 변경
data_scaled[economic_features] = econ_scaler.transform(data[economic_features])    # ← fit_transform → transform으로 변경
  1. 학습 데이터 생성 부분

# 학습 데이터 생성 (데이터 누수 차단)
lookback = 90
forecast_horizon = 14

# train 구간 끝에서 forecast_horizon 만큼 빼야 y가 test 구간으로 안 넘어감
last_train_index = train_size - forecast_horizon  

X_stock_train = []
X_econ_train = []
y_train = []

for i in range(lookback, last_train_index):
    X_stock_train.append(data_scaled[target_columns].iloc[i-lookback:i].values)
    X_econ_train.append(data_scaled[economic_features].iloc[i-lookback:i].values)
    y_train.append(data_scaled[target_columns].iloc[i + forecast_horizon - 1].values)  # i+13은 아직 train 안에 있음

X_stock_train = np.array(X_stock_train = np.array(X_stock_train)
X_econ_train = np.array(X_econ_train)
y_train = np.array(y_train)

작업 하시다가 잘 안되는 부분 있으시다면 다시 말씀 주세요~

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
gnb1202님, 데이터셋을 훈련과 테스트로 8:2로 나누신 방식은 정확히 사용하신 것 같습니다.
두 개의 데이터프레임, train_datatest_data를 만드셨는데요,

train_size = int(len(data) * 0.8)
train_data = data.iloc[:train_size]
test_data = data.iloc[train_size:]

나누신 이후에, 전체 데이터를 학습 데이터와 비슷하게 학습하고 싶지 않다면, for 루프의 데이터 사용 범위를 조정하셔야 합니다.

for 루프에서 lookbackforecast_horizon을 사용한 코드는 특정 범위를 제외하고 데이터를 사용하는 것으로 보입니다. 하지만, 이 부분이 전체 데이터에서 사용되었므로 훈련 데이터 범위 내에서만 실행되도록 코드를 조정하셔야 합니다. 그렇지 않으면 전체 데이터를 학습하게 될 가능성이 있습니다.

과적합에 대한 문제는 학습 데이터와 테스트 데이터 간의 경계를 명확히 하고, lookbackforecast_horizon 변수를 조정하여 해결할 수 있습니다. 모델의 과적합을 방지하려면 모델의 복잡성을 낮추거나 정규화 등의 기법을 사용하는 것도 고려해보세요.

이미지를 참고하시려면 문의 게시판에서 직접 질문을 올리신 후, 공유 공유자님께 추가적인 설명을 받아보는 것도 좋은 방법입니다. 수강 전 문의 게시판에서 정보를 확인해 문의를 남기시면 보다 정확한 피드백을 받으실 수 있습니다.

Hình ảnh hồ sơ của gnb12022890
gnb12022890

câu hỏi đã được viết

Đặt câu hỏi