QoreSDK를 사용한 회귀 작업
소개
안녕하세요, @saitoxu입니다.
이 글에서는 QoreSDK 을 사용한 간단한 회귀 작업 방법을 설명합니다.
그건 그렇고, 시계열 분석 주위에 지식이 많지 않으므로 뭔가 잘못 될 수 있다면 (부드럽게) 의견으로 말씀해주십시오.
QoreSDK를 사용한 회귀 작업
이번에는 정현파(sine)의 예측을 해보겠습니다.
다음과 같이 sin 함수로부터 생성되는 시계열 데이터의 일부를 학습시켜, 미래의 시각의 sine의 값을 예측시키는 태스크입니다.
데이터 준비
먼저 sine 웨이브 데이터를 준비합니다.
# sine波の長さ
t_length = 1000
# 分割するときのサイズ
t_width = 400
train_x = np.arange(t_length)
# 平均がsin(x), 分散0.1の正規分布に従う配列を生成
train_y = np.random.normal(np.sin(2 * np.pi * train_x / 100), 0.1)
x = []
y = []
for i in range(len(train_x) - t_width):
x.append(train_y[i:i + t_width])
y.append(train_y[i + t_width])
x = np.array(x)
y = np.array(y)
# 学習データとテストデータに分割
X_train = x[0:((t_length - t_width) // 2)]
X_test = x[((t_length - t_width) // 2):]
y_train = y[0:((t_length - t_width) // 2)]
y_test = y[((t_length - t_width) // 2):]
print(X_train.shape) # (300, 400)
print(X_test.shape) # (300, 400)
여기서는 다음을 수행합니다.
이번에는 정현파(sine)의 예측을 해보겠습니다.
다음과 같이 sin 함수로부터 생성되는 시계열 데이터의 일부를 학습시켜, 미래의 시각의 sine의 값을 예측시키는 태스크입니다.
데이터 준비
먼저 sine 웨이브 데이터를 준비합니다.
# sine波の長さ
t_length = 1000
# 分割するときのサイズ
t_width = 400
train_x = np.arange(t_length)
# 平均がsin(x), 分散0.1の正規分布に従う配列を生成
train_y = np.random.normal(np.sin(2 * np.pi * train_x / 100), 0.1)
x = []
y = []
for i in range(len(train_x) - t_width):
x.append(train_y[i:i + t_width])
y.append(train_y[i + t_width])
x = np.array(x)
y = np.array(y)
# 学習データとテストデータに分割
X_train = x[0:((t_length - t_width) // 2)]
X_test = x[((t_length - t_width) // 2):]
y_train = y[0:((t_length - t_width) // 2)]
y_test = y[((t_length - t_width) // 2):]
print(X_train.shape) # (300, 400)
print(X_test.shape) # (300, 400)
여기서는 다음을 수행합니다.
t_length
의 sin 파를 생성 t_width
의 부분파로 분할 t_length - t_width
개별 파도가 가능하기 때문에 학습 데이터와 테스트 데이터로 분할 plt.plot(X_train[0])
등으로 하면, 다음과 같은 시계열 데이터가 생성되고 있는 것을 알 수 있습니다.또한
y_train
에는 X_train
의 마지막 시간 $t$ 의 다음 시간 $t+1$ 의 값이 들어 있습니다.전처리
전처리, 라고 해도 특별한 것은 없습니다만, QoreSDK의 학습 함수의 입력이
(サンプル数, 時系列長, 変量数)
이므로 그렇게 데이터를 변환합니다.# 2次元配列だったのを3次元配列にしてるだけ
X_train = X_train.reshape([(t_length - t_width) // 2, t_width, 1])
X_test = X_test.reshape([(t_length - t_width) // 2, t_width, 1])
부정맥 검출 샘플 그럼 qore_sdk.featurizer 모듈 과 qore_sdk.utils 모듈 변환하고 있습니다.
학습
회귀 작업이므로 후술 의
regression_train
함수를 사용합니다.client = WebQoreClient('username', 'password', endpoint='endpoint')
res = client.regression_train(X_train, y_train)
print(res) # {'res': 'ok', 'train_time': 6.9450061321258545}
username
, password
, endpoint
는 자신의 것으로 변경하십시오.대체로 10초도 있으면 완료합니다.
예측과 평가
학습한 모델을 사용하여 테스트 데이터를 예측해 봅니다.
res = client.regression_predict(X_test)
예측값과 정답 데이터를 플롯해 보면 다음과 같이 됩니다.
plt.plot(res['Y'], figure=plt.figure(figsize=(12.8, 4.8))) # 予測値(青)
plt.plot(y_test) # 正解(オレンジ)
qore_sdk.client 모듈
대체로 올바르게 예측할 수 있는 것을 알았습니다.
덧붙여서 다음의 함수를 준비해, 테스트 데이터 이후의 값도 예측해 보겠습니다.
# n個先の時刻の予測を行う
def predict(n):
# X_test[-1]が最後の時刻のデータ
data = X_test[-1].reshape(t_width)
for _ in range(n):
res = client.regression_predict([data[len(data) - t_width:]])
data = np.append(data, res['Y'][0])
return data[len(data) - n:]
실제로 사용해 봅시다.
100개 앞의 시간까지 예측하여 결과를 플롯해 봅니다.
result = predict(100)
plt.plot(result)
일단 sine 같은 모양이 되었습니다.
그건 그렇고, 이것은 Qore의 API 서버에 부담을 줄 것이므로 $ n $은 작은 값으로 시도해야합니다.
Featurizer를 사용했지만 작동하지 않았습니다.
다음과 같이 Qore의 Featurizer를 사용하여 데이터를 입력용 배열로 변환했는데, 이번 작업에서는 잘 학습되지 않았습니다.
width = 144
stepsize = 36
n_filters = 40
# ここで(サンプル数, 時系列長, 小時系列長)の配列を作成
X_train = sliding_window(X_train, width, stepsize)
X_test = sliding_window(X_test, width, stepsize)
print('X_train.shape:', X_train.shape)
print('X_test.shape:', X_test.shape)
# (サンプル数, 時系列長, 変量数)の配列に変換(Qoreへの入力となる)
featurizer = Featurizer(n_filters)
X_train = featurizer.featurize(X_train, axis=2)
X_test = featurizer.featurize(X_test, axis=2)
print(X_train.shape)
print(X_test.shape)
자세한 것은 모릅니다만, Featurizer는 안에서는 주파수 분해를 하고 있는 것 같기 때문에, 이번 태스크와 같은 sine파는 분할의 할 수 없기 때문에 잘 학습되지 않았을까라고 생각했습니다.
결론
QoreSDK를 사용하여 회귀 작업을 수행해 보았습니다.
향후, Qore를 사용해 주가 예측 등의 회귀 문제를 해 보고 싶다고 하는 분의 참고가 되면 다행입니다.
이번에 사용한 노트북은 아래의 리포지토리에 두고 있으므로, 맞추어 부디.
참고
Reference
이 문제에 관하여(QoreSDK를 사용한 회귀 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/saitoxu/items/93cf462b4256cb4cea4d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)