공유주신 'LSTM을 활용한 주가예측' 너무 좋은 자료인거 같아 감사드립니다. 자료따라 실습을 해보고 예측과 관련하여 질문드립니다. df의 'Close'(종가)가 y_train, y_test으로 분할되고, y_train을 학습에 사용할 train_data로 만들고, y_test를 검증과 예측에 사용될 test_data로 만드는 것 같습니다. 모델을 학습후 예측에서 model.predict(test_data)로 진행되는데요. 질문1) test_data가 이미 'Close'(종가) 데이터를 담고 있는데 model.predict()에 사용되는 의미를 잘 모르겠습니다. 질문2) model.predict, 예측을 미래의 기간(데이터가 없는)으로 적용하는 방법은 어떻게 할 수가 있는지 궁금합니다.
질문 1에 대한 답변부터 드립니다. test 데이터로 예측 후 예측 데이터(y hat) 과 실제 데이터 (y) 간의 비교를 위해서입니다. predict은 여기서 예측 값을 얻을 때 사용합니다. 데이터가 없으면 하나씩 예측해서 1일씩 뒤로 밀면서 계속 예측해 나가는 방법이 있습니다 하지만 예측값이 그 다음의 예측시 입력으로 들어가기 때문에 결과는 좋지 못할 가능성이 있습니다. 이를 보완하기 위해서는 다양한 시계열 예측 방법이 같이 고려 될 수 있습니다. 가령 arima sarima sarimax 등의 방법이 있을 수 있습니다.
안녕하세요. 제가 찾는 강의를 발견했네요. 오늘 가입하고 질문드려요^^ 영상 초반에 지난번 강의에서 공유해주셨다고 하는 "LSTM주가예측모델" 코랩 링크를 어디서 찾을수 있을까요? 그리고 그 강의(LSTM주가예측모델)는 어디에 있는지 아무리 찾아도 모르겠네요. 링크 좀 부탁드립니다.
shuffle에 대해 질문 또 드려요 제가 아직 개념에 대해 이해가 잘 안서요. ds.shuffle(1000)는 전체 데이터에서 1000개를 우선 사용하고 다 사용하면 1001부터 또 사용하겠다는 뜻인가요? 그리고 1000개를 사용하는것에 있어서 1000개 중 window_size세트를 하나씩 랜덤으로 추출한다는 뜻인가요 아니면 차례대로(인덱스대로) 추출한다는 뜻인가요? 만약 랜덤으로 추출되는 것이라면 시계열 데이터의 특성상 선후 상관관계가 깨지는것이 아닌지도 궁금합니다.
메일로 빠른 답변주셔서 감사합니다.^^ 질문이 또 생기는데요. 제가 이해한 바로는 Buffer_size는 batch_size의 pool이라 할 수 있고 batch_size내에서 window_size가 Shuffle(랜덤 추출)이 되지 않고, Buffer_size내에서의 batch_size는 Shuffle로 추출되는 것으로 이해하였습니다. 그렇다면 Buffer_size가 1000이고 batch_size100이라면 랜덤 추출 되었을때 10개의 batch_size가 랜덤으로 추출되어 처리되었을때 각 batch간의 상관관계는 깨졌다고 볼수 있을거 같은데요.? 짧은 구간window_size간의 상관관계는 유지되나 긴 구간batch_size 간에는 상관관계가 깨진 것이 아닌지 궁금합니다. ( 그리고 공유주신 코랩에 대한 강의 동영상 링크도 공유부탁드립니다. ) @@teddynote
선생님 강의 감사드립니다. 올려주신 코드랑 따라 해 보면서 똑같이 나와서 신기 했습니다. 질문이 있습니다. actual 과 predic 그래프를 그리는것으로 마무리 되었는데 예를 들어서 prediction 을 앞으로 15일 예측한 그래프나 수치를 알고 싶으면 어떤작업을 더 하면 될까요?
좋은 강의 잘 보고 공부하고 있는 중입니다. 감사드립니다. 질문이 있는데요, 아래 유민주 님께서 질문해 주신 내용에 대한 답변을 토대로 코드를 실행해 보면 역시 pred 값을 원래의 데이터에 맞게 변형이 잘 안되네요. x_inverse = scaler.inverse_transform(pred) 와 같이 pred 값을 inverse_transform() 메소드에 대입을 하면 ValueError: non-broadcastable output operand with shape (646,1) doesn't match the broadcast shape (646,5) 라는 에러가 나는데 해결할 수 있는 방법이 없을까요? 여기저기 뒤저봐도 잘 알수가 없어서 질문 드렸습니다. 부탁드리겠습니다. 데이터는 "tecl" 이라는 종목입니다. 죄송합니다. stackoverflow 에 비슷한 질문에 대한 답이 있어서 참고했더니 원래 데이터 모양에 맞게 변형이 되는 것을 확인했습니다. 그런데 다른 의문이 하나 더드는게 에러를 고칠려고 코드를 실행하면 매번 결과가 다르게 나오는군요. 그게 맞나요? 그렇다면 결과치에 대한 신뢰가 많이 줄어드는게 사실이겠지요?
@@teddynote random_state 는 train_test_split() 의 파라미터였군요. 확인해 보니 random_state=0 으로 설정이 되어 있더군요. 하긴 제가 잘 모르는 상태에서 그냥 테디님의 코드를 복사해서 붙였으니 아마 당연한 설정이었겠죠(테디님 코드를 다시 확인 해봐도 그렇게 코딩이 되어 있군요). 좀 조사해 보니 임의의 정수를 입력하면 데이터가 고정이 되어서 결과값도 같게 나온다고 인터넷에 나와 있기는 한데, 몇가지 수를 넣어서 실행을 해 봐도 별차이가 없이 매번 결과값은 다르게 출력이 되는군요. 제가 놓치고 있는 게 뭘까요? 참고로 제가 사용한 코드는 테디님께서 작성하신 글 "LSTM과 FinanceDataReader API를 활용한 삼성전자 주가 예측" Dec 25, 2020 이라는 글을 주식코드만 tecl 로 바꾸고 그대로 복사해서 사용을 했었습니다. 덕분에 여러가지 공부는 많이 되고 있습니다. 하지만 또 해야할 공부도 참 많구나라고 느끼고 있습니다. 감사드리구요, 앞으로도 잘 부탁드리겠습니다.
감사합니다~ 혹시... 피쳐를 1개더 추가한 csv로 파일 불러와서 input_shape=[WINDOW_SIZE, 5])로 했는데요... 전혀 모델이 동작을 안하는데 어디 고칠 부분이 있을까요?... 분명 트레인 테스트 데이터는 잘 나눴는데... loss: nan - mse: nan - val_loss: nan - val_mse: nan 나오네요... (이후로도 model.load_weights(filename) 등등 동작을 못하네요...) 어려운 내용인데 쉽게 설명해주시니 감사드려요~
feature 개수가 잘 맞지 않았다면 일단 돌아가는 것 조차 않았을 껍니다. 일단 돌아가긴 하는데 loss가 잘못되었다면 loss 계산되는 부분이 잘못 되었을 것 같고요. 혹은 모델이 너무 복잡도가 높거나하면 nan 으로 나오는 경우도 있습니다. 데이터셋을 모르기 때문에 더 구체적인 피드백이 어렵네요 ㅜ
좋은 강의 감사합니다. 다름이 아니라 피쳐가 여러개인 상황에서 과거 30일 데이터로 미래 10개의 데이터를 예측하려고 합니다. 강의를 듣고 댓글들에 남겨주신 코드들을 보며 다음과 같은 코드를 짜봤는데 맞는지 잘 모르겠고, 데이터셋 shape를 확인했을 때 y의 feature 수가 1개가 아닌 10개로 나와버리네요ㅠㅠ 개념이 확실히 적립이 안되어서 그런 것 같은데 코드에서 바꿔야 할 부분이 무엇인지 어디서 잘못됐는지 알려주시면 감사하겠습니다!! 아 그리고 stride가 아닌 shift는 어떤 기능을 하는지도 알고 싶습니다. def windowed_dataset(x, y, batch_size, past=30, future=10, shift=1): ds_x = tf.data.Dataset.from_tensor_slices(x) ds_x = ds_x.window(past, shift = shift, drop_remainder = True) ds_x = ds_x.flat_map(lambda x: x.batch(past)) ds_y = tf.data.Dataset.from_tensor_slices(y[past:]) ds_y = ds_y.window(future, shift = shift, drop_remainder = True) ds_y = ds_y.flat_map(lambda y: y.batch(future)) ds = tf.data.Dataset.zip((ds_x, ds_y)) return ds.batch(batch_size).prefetch(1)
만약 "과거 30일 데이터로 미래 10개의 데이터를 예측" 데이터셋으로 구성을 하시려면 x, y의 별도 구분없이 하나의 시계열 데이터를 가지고 나누어 주시면 간단합니다. 예제를 드리면 다음과 같습니다. def windowed_dataset(time_data, batch_size, shuffle_buffer=1000, past=30, future=10): series = tf.expand_dims(time_data, axis=-1) ds = tf.data.Dataset.from_tensor_slices(series) ds = ds.window(past + future, shift=1, drop_remainder=True) ds = ds.flat_map(lambda w: w.batch(past + future)) ds = ds.shuffle(shuffle_buffer) ds = ds.map(lambda w: (w[:past], w[past:])) return ds.batch(batch_size).prefetch(1) time_data에 단일 데이터 넣어 주시면 됩니다~
@@김남욱-z7g www.tensorflow.org/api_docs/python/tf/data/Dataset#window 문서에 보시면 예제와 함께 나와있어서 한 번 참고해 보시면 좋을 것 같아요. shift는 종방향, stride는 횡방향 으로 슬라이드하면서 생성해 주는 역할을 합니다.
안녕하세요 파이썬 완전 초보입니다. LSTM 주가 예측 소스예제라고 해서 정리해주신 웹에서 학습중에 영상도 있어 들어와서 강의 보았습니다. 예측 소스들 여러곳을 검색했는데 제일 알기 쉽고 해당 소스 기준으로 이해가 잘 되었습니다. 너무 감사드립니다. 몇가지 궁금한건 밑에 코멘트들 나온것 중에도 있는데요 미래 예측값도 표시를 하고 싶습니다. ex(코멘트달아주신 [20: 20+365]) 결과적으로 저는 화면에 y축은 역정규화(?)인가 해서 원래값 x축은 2020년까지가 본데이터니까 예를들면 2019 2020 2021(예측년도) 이런식으로 표시가 되게 결과값을 뿌리고 싶습니다. 완전 초보다 보니 아무리 검색해도 도저히 구현이 안되는것 같습니다. 강의 해주신 LSTM과 FinanceDataReader API를 활용한.... 여기에 있는 예측 소스 기준으로 간단하다면 정말 죄송하지만 추가 구현 소스라던지 아니면 처리할수 있는 접근 방법등이라도 설명 해주시면 너무 감사할것 같습니다.
안녕하세요! 강의 잘 보았습니다. 질문이 하나 있는데, feature 개수가 여러개일 경우 예측을 하는 부분을 알려주실 때, 학습시키는 데이터의 feature에는 학습시키는 기간의 Y값도 학습으로 들어가면 안되나요? 예를들어, 7일,8일,9일,10일 뒤의 4개 Close 값(Y값)을 예측하기 위해서 0일~6일의 데이터를 학습시키잖아요? 그렇다면 0일~6일 데이터의 feature에는 Open, High, Low, Volume 변수 뿐만 아니라 Close(Y값)을 넣어도 괜찮지 않나요?(Data Leakage 문제도 아니지 않나요?) 회귀문제에서 Y값을 예측할 때는 Y값의 자기상관변수가 가장 크게 작용하는 걸로 알고있어서 이런 질문을 해봅니다!
@@teddynote 답변 감사합니다! 혹시 영상 마지막에 언급해주신 반영할 feature가 여러개일 경우에 ds_x, ds_y도 위에서 언급해주신 함수를 같이 이용하면 될까요? 아니면 함수내에서 ds_x, ds_y에 대한 처리를 별도로 해서 zip으로 묶어줘야할까요? 바쁘신 가운데 확인해주셔서 감사합니다!
안녕하세요. 좋은 영상 업로드 해주셔서 감사합니다. Multivariate multistep 구현 할때 스케일을 어떤식으로 해야 맞는지 질문 드립니다. 지금 2010년부터 2021년 데이터를 월별로 금액합과 관련 피쳐가 70개 정도 있습니다. 해당 데이터 input이 12개월 output이 12 / 6 / 3 개월 을 예측 하는 모델을 만들려고 합니다. 실제 모델을 사용 할때와 비슷한 환경을 위해서 Timeseriessplit으로 nest cross validation 하려고 합니다. 그렇게 할시 매번 다른 트레인에 대한 스케일링 핏을 하여 모델을 돌려야 될거 같은데 어떻게 하면 될까요???
1. 본 영상에 따라 구현하시면 TimeSeriesSplit이 적용됩니다. scikit-learn의 TimeSeriesSplit과 동일한 구현이라고 보셔도 좋을 것 같습니다. 2. 스케일링을 전체 데이터셋에 대하여 먼저 진행하신 후 -> TimeSeriesSplit -> Cross-Validation의 순서대로 진행하시면 어떨까요? 이렇게 하면 처음 한 번만 스케일링을 진행하면 될 것 같습니다.
영상이랑 코드 잘 봤습니다. 질문하나만 남겨도 될까요? 영상 마지막에 종가를 제외한 데이터를 넣고 종가를 예측하려 할때, make_window에서는 x, y를 각각 입력해주었는데, 코드에서는 series로 묶어서 되어있습니다. train_data와 test_data를 구성하려 할때, 위에서 split한 x_train, y_train 과 x_test, y_test를 넣어줘야하는거 아닌가요?
선생님 계신 방향으로 108배 하겠습니다
ㅎㅎㅎㅎㅎ 세고 있습니다
몇일 밤새면서 고생하고 또 고생중이거 답을 못찾고 있었는데 이렇게 쉽게 설명도 해주시고... 암흑속에서 한줄기의 빛이 내려왔습니다...
감사합니다.🙏🙏🙏
인트로 영상이 생겼네요? 👍🏻👍🏻
테디노트 항상 감사하고 응원합니다 :)
감사합니다 🙏
공유주신 'LSTM을 활용한 주가예측' 너무 좋은 자료인거 같아 감사드립니다. 자료따라 실습을 해보고 예측과 관련하여 질문드립니다.
df의 'Close'(종가)가 y_train, y_test으로 분할되고, y_train을 학습에 사용할 train_data로 만들고, y_test를 검증과 예측에 사용될 test_data로 만드는 것 같습니다.
모델을 학습후 예측에서 model.predict(test_data)로 진행되는데요.
질문1) test_data가 이미 'Close'(종가) 데이터를 담고 있는데 model.predict()에 사용되는 의미를 잘 모르겠습니다.
질문2) model.predict, 예측을 미래의 기간(데이터가 없는)으로 적용하는 방법은 어떻게 할 수가 있는지 궁금합니다.
질문 1에 대한 답변부터 드립니다. test 데이터로 예측 후 예측 데이터(y hat) 과 실제 데이터 (y) 간의 비교를 위해서입니다. predict은 여기서 예측 값을 얻을 때 사용합니다.
데이터가 없으면 하나씩 예측해서 1일씩 뒤로 밀면서 계속 예측해 나가는 방법이 있습니다 하지만 예측값이 그 다음의 예측시 입력으로 들어가기 때문에 결과는 좋지 못할 가능성이 있습니다. 이를 보완하기 위해서는 다양한 시계열 예측 방법이 같이 고려 될 수 있습니다. 가령 arima sarima sarimax 등의 방법이 있을 수 있습니다.
우와!! ㅋㅋ 인트로 영상 센스넘치네요!! 잘 보고 배우겠습니다
감사합니다 :)
테디님 잘보고 갑니다. ㅎㅎ
감사합니다^^
안녕하세요. 제가 찾는 강의를 발견했네요. 오늘 가입하고 질문드려요^^
영상 초반에 지난번 강의에서 공유해주셨다고 하는 "LSTM주가예측모델" 코랩 링크를 어디서 찾을수 있을까요?
그리고 그 강의(LSTM주가예측모델)는 어디에 있는지 아무리 찾아도 모르겠네요. 링크 좀 부탁드립니다.
shuffle에 대해 질문 또 드려요 제가 아직 개념에 대해 이해가 잘 안서요.
ds.shuffle(1000)는 전체 데이터에서 1000개를 우선 사용하고 다 사용하면 1001부터 또 사용하겠다는 뜻인가요?
그리고 1000개를 사용하는것에 있어서 1000개 중 window_size세트를 하나씩 랜덤으로 추출한다는 뜻인가요
아니면 차례대로(인덱스대로) 추출한다는 뜻인가요? 만약 랜덤으로 추출되는 것이라면 시계열 데이터의 특성상 선후 상관관계가 깨지는것이 아닌지도 궁금합니다.
멤버십 가입을 오픈한지 이틀밖에 안돼서 회원 전용 동영상을 업로드를 다 못했어요 ㅠㅠ
그래서 메일 주시면 메일로 보실 수 있는 링크 안내 드릴테니 메일 하나만 보내주시겠어요~^^
번거롭게 해드려 죄송합니다😭
teddylee777@gmail.com
메일드렸습니다.~@@teddynote
메일로 빠른 답변주셔서 감사합니다.^^ 질문이 또 생기는데요.
제가 이해한 바로는 Buffer_size는 batch_size의 pool이라 할 수 있고
batch_size내에서 window_size가 Shuffle(랜덤 추출)이 되지 않고,
Buffer_size내에서의 batch_size는 Shuffle로 추출되는 것으로 이해하였습니다.
그렇다면 Buffer_size가 1000이고 batch_size100이라면 랜덤 추출 되었을때
10개의 batch_size가 랜덤으로 추출되어 처리되었을때 각 batch간의 상관관계는 깨졌다고 볼수 있을거 같은데요.?
짧은 구간window_size간의 상관관계는 유지되나 긴 구간batch_size 간에는 상관관계가 깨진 것이 아닌지 궁금합니다.
( 그리고 공유주신 코랩에 대한 강의 동영상 링크도 공유부탁드립니다. ) @@teddynote
선생님 강의 감사드립니다. 올려주신 코드랑 따라 해 보면서 똑같이 나와서 신기 했습니다.
질문이 있습니다. actual 과 predic 그래프를 그리는것으로 마무리 되었는데 예를 들어서 prediction 을 앞으로 15일 예측한 그래프나 수치를 알고 싶으면
어떤작업을 더 하면 될까요?
ds.map(lambda w:lambda w: (w[:-학습날짜슬라이싱], w[-예측날짜슬라이싱:]))
부분을 변경해 주시면 됩니다.
아래 예시를 적어 놓았습니다^^
===
def windowed_dataset(series, window_size, batch_size, shuffle, shuffle_buffer):
series = tf.expand_dims(series, axis=-1)
ds = tf.data.Dataset.from_tensor_slices(series)
ds = ds.window(window_size + 1, shift=1, drop_remainder=True)
ds = ds.flat_map(lambda w: w.batch(window_size + 1))
if shuffle:
ds = ds.shuffle(shuffle_buffer)
ds = ds.map(lambda w: (w[:-15], w[-15:]))
return ds.batch(batch_size).prefetch(1)
@@teddynote 친절한설명 너무감사드립니다 선생님
좋은 강의 잘 보고 공부하고 있는 중입니다. 감사드립니다.
질문이 있는데요, 아래 유민주 님께서 질문해 주신 내용에 대한 답변을 토대로 코드를 실행해 보면 역시 pred 값을 원래의 데이터에 맞게 변형이 잘 안되네요.
x_inverse = scaler.inverse_transform(pred) 와 같이 pred 값을 inverse_transform() 메소드에 대입을 하면
ValueError: non-broadcastable output operand with shape (646,1) doesn't match the broadcast shape (646,5)
라는 에러가 나는데 해결할 수 있는 방법이 없을까요?
여기저기 뒤저봐도 잘 알수가 없어서 질문 드렸습니다. 부탁드리겠습니다. 데이터는 "tecl" 이라는 종목입니다.
죄송합니다. stackoverflow 에 비슷한 질문에 대한 답이 있어서 참고했더니 원래 데이터 모양에 맞게 변형이 되는 것을 확인했습니다. 그런데 다른 의문이 하나 더드는게 에러를 고칠려고 코드를 실행하면 매번 결과가 다르게 나오는군요. 그게 맞나요?
그렇다면 결과치에 대한 신뢰가 많이 줄어드는게 사실이겠지요?
매번 결과가 바뀌는 것은 안에 random_state라는 시드값이 고정되어 있지 않아서 그렇습니다. 알고리즘을 어떤 알고리즘 사용하셨는지 정확하게는 모르겠지만 random_state=0으로 고정해 주시고 돌리시면 같은 값이 나올껍니다~
@@teddynote 그렇군요.
한번 해보겠습니다. 감사합니다.^^
@@teddynote random_state 는 train_test_split() 의 파라미터였군요. 확인해 보니 random_state=0 으로 설정이 되어 있더군요. 하긴 제가 잘 모르는 상태에서 그냥 테디님의 코드를 복사해서 붙였으니 아마 당연한 설정이었겠죠(테디님 코드를 다시 확인 해봐도 그렇게 코딩이 되어 있군요). 좀 조사해 보니 임의의 정수를 입력하면 데이터가 고정이 되어서 결과값도 같게 나온다고 인터넷에 나와 있기는 한데, 몇가지 수를 넣어서 실행을 해 봐도 별차이가 없이 매번 결과값은 다르게 출력이 되는군요. 제가 놓치고 있는 게 뭘까요?
참고로 제가 사용한 코드는 테디님께서 작성하신 글 "LSTM과 FinanceDataReader API를 활용한 삼성전자 주가 예측" Dec 25, 2020 이라는 글을 주식코드만 tecl 로 바꾸고 그대로 복사해서 사용을 했었습니다.
덕분에 여러가지 공부는 많이 되고 있습니다. 하지만 또 해야할 공부도 참 많구나라고 느끼고 있습니다.
감사드리구요, 앞으로도 잘 부탁드리겠습니다.
선생님 안녕하세요 혹시 데이터셋은 윈도우데이터셋만 있나요? 데이터셋은 처음부터공부하려면 어떻게 해야 하는지 말씀 부탁 드립니다
데이터셋은 시계열쪽에서는 윈도우 데이터셋 이미지쪽에서 사용하는 데이터셋(제네레이터) 자연어처리를 위한 데이터셋 구성 등등이 있습니다😀
감사합니다~ 혹시... 피쳐를 1개더 추가한 csv로 파일 불러와서 input_shape=[WINDOW_SIZE, 5])로 했는데요... 전혀 모델이 동작을 안하는데 어디 고칠 부분이 있을까요?... 분명 트레인 테스트 데이터는 잘 나눴는데... loss: nan - mse: nan - val_loss: nan - val_mse: nan 나오네요... (이후로도 model.load_weights(filename) 등등 동작을 못하네요...)
어려운 내용인데 쉽게 설명해주시니 감사드려요~
feature 개수가 잘 맞지 않았다면 일단 돌아가는 것 조차 않았을 껍니다. 일단 돌아가긴 하는데 loss가 잘못되었다면 loss 계산되는 부분이 잘못 되었을 것 같고요. 혹은 모델이 너무 복잡도가 높거나하면 nan 으로 나오는 경우도 있습니다. 데이터셋을 모르기 때문에 더 구체적인 피드백이 어렵네요 ㅜ
@@teddynote 감사합니다 ^^
좋은 강의 감사합니다. 다름이 아니라 피쳐가 여러개인 상황에서 과거 30일 데이터로 미래 10개의 데이터를 예측하려고 합니다. 강의를 듣고 댓글들에 남겨주신 코드들을 보며 다음과 같은 코드를 짜봤는데 맞는지 잘 모르겠고, 데이터셋 shape를 확인했을 때 y의 feature 수가 1개가 아닌 10개로 나와버리네요ㅠㅠ 개념이 확실히 적립이 안되어서 그런 것 같은데 코드에서 바꿔야 할 부분이 무엇인지 어디서 잘못됐는지 알려주시면 감사하겠습니다!! 아 그리고 stride가 아닌 shift는 어떤 기능을 하는지도 알고 싶습니다.
def windowed_dataset(x, y, batch_size, past=30, future=10, shift=1):
ds_x = tf.data.Dataset.from_tensor_slices(x)
ds_x = ds_x.window(past, shift = shift, drop_remainder = True)
ds_x = ds_x.flat_map(lambda x: x.batch(past))
ds_y = tf.data.Dataset.from_tensor_slices(y[past:])
ds_y = ds_y.window(future, shift = shift, drop_remainder = True)
ds_y = ds_y.flat_map(lambda y: y.batch(future))
ds = tf.data.Dataset.zip((ds_x, ds_y))
return ds.batch(batch_size).prefetch(1)
만약 "과거 30일 데이터로 미래 10개의 데이터를 예측" 데이터셋으로 구성을 하시려면
x, y의 별도 구분없이 하나의 시계열 데이터를 가지고 나누어 주시면 간단합니다.
예제를 드리면 다음과 같습니다.
def windowed_dataset(time_data, batch_size, shuffle_buffer=1000, past=30, future=10):
series = tf.expand_dims(time_data, axis=-1)
ds = tf.data.Dataset.from_tensor_slices(series)
ds = ds.window(past + future, shift=1, drop_remainder=True)
ds = ds.flat_map(lambda w: w.batch(past + future))
ds = ds.shuffle(shuffle_buffer)
ds = ds.map(lambda w: (w[:past], w[past:]))
return ds.batch(batch_size).prefetch(1)
time_data에 단일 데이터 넣어 주시면 됩니다~
@@teddynote 감사합니다!! X데이터의 피쳐가 여러개일 때도 x,y 별도 구분없이 진행해도 될까요?? 진행해본 결과 데이터셋이 4차원으로 나오고 x, y가 구분이 안된 것 같아서 뭔가 빠진게 있는건지 어렵네요ㅠㅠ
@@김남욱-z7g feature가 여러개 일때는 이전에 공유해 주신 코드 처럼 x, y를 구분해서 생성해 주시는 편이 더 편하실 꺼에요~ x는 x대로 잘라 주시고 y는 y대로 잘라주신 다음에 나중에 x, y를 zip으로 묶어 주시는 편이 더 좋아 보입니다~
@@teddynote 친절한 답변 정말 감사드립니다ㅎㅎ 마지막으로 shift는 stride와 다른 것인지, 어떠한 역할을 하는지 알 수 있을까요?? shift에 대한 설명은 영상에 없는 것 같아 궁금합니다!!
@@김남욱-z7g www.tensorflow.org/api_docs/python/tf/data/Dataset#window
문서에 보시면 예제와 함께 나와있어서 한 번 참고해 보시면 좋을 것 같아요.
shift는 종방향, stride는 횡방향 으로 슬라이드하면서 생성해 주는 역할을 합니다.
와 행님 텐서플로 쓰면서도 api 유용한 기능들 몰라서 lstm도 윈도우 코드짜서 나누고했는데 저런 좋은 api들이 있었다니 ㅠㅠ
이제 아셨다면 적극 활용하셔서 시간 쎄잎 하시죠~!!😆
좋은영상 감사합니다! 그런데 generator 이용해서 Dataset 만드는 것도 가능할까요?
generator를 사용해서도 구성 가능합니다.
generator 생성을 위한 함수 정의를 먼저 해주시면
나중에 학습할 때 from_generator로 함수를 호출해 주시면 됩니다~
안녕하세요 파이썬 완전 초보입니다.
LSTM 주가 예측 소스예제라고 해서 정리해주신 웹에서 학습중에 영상도 있어 들어와서 강의 보았습니다.
예측 소스들 여러곳을 검색했는데 제일 알기 쉽고 해당 소스 기준으로 이해가 잘 되었습니다.
너무 감사드립니다.
몇가지 궁금한건 밑에 코멘트들 나온것 중에도 있는데요
미래 예측값도 표시를 하고 싶습니다. ex(코멘트달아주신 [20: 20+365])
결과적으로 저는 화면에
y축은 역정규화(?)인가 해서 원래값
x축은 2020년까지가 본데이터니까
예를들면 2019 2020 2021(예측년도)
이런식으로 표시가 되게 결과값을 뿌리고 싶습니다.
완전 초보다 보니 아무리 검색해도 도저히 구현이 안되는것 같습니다.
강의 해주신 LSTM과 FinanceDataReader API를 활용한.... 여기에 있는 예측 소스 기준으로 간단하다면 정말 죄송하지만 추가 구현 소스라던지
아니면 처리할수 있는 접근 방법등이라도 설명 해주시면 너무 감사할것 같습니다.
작성하신 colab이나 주피터노트북 파일을 메일로 보내주시면 회신 드릴께요 😄
@@teddynote 안녕하세요 어제 소스정리해서 메일로 보내드렸습니다 감사합니다!!
안녕하세요, 좋은 강의 감사합니다. 모델 생성할 때 conv1d 에 있는 filter와 kernel_size는 어떤 역할 하는지 혹시 설명해주실 수 있을까요? 감사합니다.
conv2d와 마찬가지로 1차원 데이터에 대한 컨볼루션 연산을 하게 됩니다. kernel_size는 필터의 사이즈를 의미합니다.
안녕하세요! 강의 잘 보았습니다. 질문이 하나 있는데, feature 개수가 여러개일 경우 예측을 하는 부분을 알려주실 때, 학습시키는 데이터의 feature에는 학습시키는 기간의 Y값도 학습으로 들어가면 안되나요?
예를들어, 7일,8일,9일,10일 뒤의 4개 Close 값(Y값)을 예측하기 위해서 0일~6일의 데이터를 학습시키잖아요? 그렇다면 0일~6일 데이터의 feature에는 Open, High, Low, Volume 변수 뿐만 아니라 Close(Y값)을 넣어도 괜찮지 않나요?(Data Leakage 문제도 아니지 않나요?) 회귀문제에서 Y값을 예측할 때는 Y값의 자기상관변수가 가장 크게 작용하는 걸로 알고있어서 이런 질문을 해봅니다!
네 가능합니다. 0~6일의 Y값을 입력으로 넣고 데이터 셋 구성을 하실 수도 있고요. Y값만 넣는 것도 가능합니다~
안녕하세요 선생님 강의 잘듣고있습니다!
혹시 정규화된 값을 원래 값으로 만들고 싶을때 scaler.inverse_transform 하면 오류가 나서 질문드립니다 pred와 y_test 정규화된 값을 원래되돌리는 코드 는 어떻게 될까요?
from sklearn.preprocessing import MinMaxScaler
print(f'오리지널] min: {x.min()}, max: {x.max()}')
scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)
print(f'스케일 변환] min: {x_scaled.min()}, max: {x_scaled.max()}')
x_inverse = scaler.inverse_transform(x_scaled)
print(f'inverse] min: {x_inverse.min()}, max: {x_inverse.max()}')
안녕하세요 테디님 좋은 강의 공유해주셔서 감사합니다!
문의사항으로 feature의 갯수가 여러 개인 경우에
과거 30일간의 데이터로 미래 14일간을 예측하는 many to many는
어떻게 구현하는지 문의드릴 수 있을까요? 감사합니다!
다음과 같이 구현해 보실 수 있을 것 같습니다.
def windowed_dataset(series, batch_size, past=30, future=14, shift=1):
ds = tf.data.Dataset.from_tensor_slices(series)
ds = ds.window(size=(past + future), shift = shift, drop_remainder = True)
ds = ds.flat_map(lambda w: w.batch(past + future))
ds = ds.shuffle(1000)
ds = ds.map(
lambda w: (w[:n_past], w[n_past:])
)
return ds.batch(batch_size).prefetch(1)
@@teddynote 답변 감사합니다! 혹시 영상 마지막에 언급해주신 반영할 feature가 여러개일 경우에 ds_x, ds_y도 위에서 언급해주신 함수를 같이 이용하면 될까요? 아니면 함수내에서 ds_x, ds_y에 대한 처리를 별도로 해서 zip으로 묶어줘야할까요? 바쁘신 가운데 확인해주셔서 감사합니다!
@@캥거루개발자 x, y로 구분해서 적용해보고 싶으시면 zip으로 묶어 주는 로직을 함수 내에 추가해 주시면 됩니다~
안녕하세요. 좋은 영상 업로드 해주셔서 감사합니다.
Multivariate multistep 구현 할때
스케일을 어떤식으로 해야 맞는지 질문 드립니다.
지금 2010년부터 2021년 데이터를 월별로 금액합과 관련 피쳐가 70개 정도 있습니다.
해당 데이터 input이 12개월 output이 12 / 6 / 3 개월 을 예측 하는 모델을 만들려고 합니다.
실제 모델을 사용 할때와 비슷한 환경을 위해서
Timeseriessplit으로 nest cross validation 하려고 합니다. 그렇게 할시 매번 다른 트레인에 대한 스케일링 핏을 하여 모델을 돌려야 될거 같은데 어떻게 하면 될까요???
1. 본 영상에 따라 구현하시면 TimeSeriesSplit이 적용됩니다. scikit-learn의 TimeSeriesSplit과 동일한 구현이라고 보셔도 좋을 것 같습니다.
2. 스케일링을 전체 데이터셋에 대하여 먼저 진행하신 후 -> TimeSeriesSplit -> Cross-Validation의 순서대로 진행하시면 어떨까요?
이렇게 하면 처음 한 번만 스케일링을 진행하면 될 것 같습니다.
강의 잘 봤습니다! 혹시 만든 모델에다 현재 데이터를 넣어서 예측하는 방법은 찾아봐도 없네요 ㅜㅜ 혹시 어떤식으로 코딩해야될까요?
예측용 데이터셋도 학습용 혹은 검증용 셋에서 만드는 DataSet 파이프라인 구축방법과 동일하게 생성하시면 됩니다. 다만, y label만 return 값에서 제거하시면 됩니다. 그리고 model.predict() 안에 예측용 데이터셋을 넣어서 예측해 주시면 됩니다.
테디딤 고대에서 수업들었던 학생입니다^^ 오늘강의감사합니다.
안녕하세요~? ㅎㅎ 감사합니다~!
영상이랑 코드 잘 봤습니다. 질문하나만 남겨도 될까요? 영상 마지막에 종가를 제외한 데이터를 넣고 종가를 예측하려 할때, make_window에서는 x, y를 각각 입력해주었는데, 코드에서는 series로 묶어서 되어있습니다.
train_data와 test_data를 구성하려 할때, 위에서 split한 x_train, y_train 과 x_test, y_test를 넣어줘야하는거 아닌가요?
시계열 데이터에서는 시계열 데이터 자체를 쪼개서 앞구간 뒷구간으로 나누어 구성했기 때문입니다.
안녕하세요 테디님
한줄기의 빛이.... 에러로 가득 차버렸습니다. 정규화 작업후에 트레인셋 테스트셋 나눠서 학습알 시켜고 그래프를 그려보는데 쉽지가 않네요 ㅠㅠ
어떤 에러 이신가요 🥹
강의 감사합니다! 혹시 딥러닝 학습시 범주형변수를 넣고 싶은데 보통 처리를 어떻게하나요? 숫자형으로 바꾼뒤 정규화해도 되는건가요?
범주형 변수는 인코딩을 반드시 해주셔야 하고 범주형 변수이기때문에 정규화는 일반적으로 안합니다.
@@teddynote 답변감사드립니다!