mirror of
https://github.com/newnius/YAO-optimizer.git
synced 2025-06-07 07:01:56 +00:00
update
This commit is contained in:
parent
edf61d117d
commit
4bd70489c5
@ -3,7 +3,6 @@
|
|||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="0aedafd8-e57e-462a-beda-65af0b91f3df" name="Default Changelist" comment="">
|
<list default="true" id="0aedafd8-e57e-462a-beda-65af0b91f3df" name="Default Changelist" comment="">
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/train.py" beforeDir="false" afterPath="$PROJECT_DIR$/train.py" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<ignored path="$PROJECT_DIR$/out/" />
|
<ignored path="$PROJECT_DIR$/out/" />
|
||||||
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
||||||
@ -48,7 +47,7 @@
|
|||||||
<counts>
|
<counts>
|
||||||
<entry key="Dockerfile" value="81" />
|
<entry key="Dockerfile" value="81" />
|
||||||
<entry key="md" value="104" />
|
<entry key="md" value="104" />
|
||||||
<entry key="py" value="2552" />
|
<entry key="py" value="2553" />
|
||||||
<entry key="sh" value="5" />
|
<entry key="sh" value="5" />
|
||||||
</counts>
|
</counts>
|
||||||
</usages-collector>
|
</usages-collector>
|
||||||
@ -57,7 +56,7 @@
|
|||||||
<entry key="Bash" value="5" />
|
<entry key="Bash" value="5" />
|
||||||
<entry key="Dockerfile" value="81" />
|
<entry key="Dockerfile" value="81" />
|
||||||
<entry key="Markdown" value="104" />
|
<entry key="Markdown" value="104" />
|
||||||
<entry key="Python" value="2552" />
|
<entry key="Python" value="2553" />
|
||||||
</counts>
|
</counts>
|
||||||
</usages-collector>
|
</usages-collector>
|
||||||
</session>
|
</session>
|
||||||
@ -92,8 +91,8 @@
|
|||||||
<file pinned="false" current-in-tab="true">
|
<file pinned="false" current-in-tab="true">
|
||||||
<entry file="file://$PROJECT_DIR$/train.py">
|
<entry file="file://$PROJECT_DIR$/train.py">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="164">
|
<state relative-caret-position="167">
|
||||||
<caret line="112" column="20" lean-forward="true" selection-start-line="112" selection-start-column="20" selection-end-line="112" selection-end-column="20" />
|
<caret line="106" column="40" lean-forward="true" selection-start-line="106" selection-start-column="40" selection-end-line="106" selection-end-column="40" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#0#28#0" expanded="true" />
|
<element signature="e#0#28#0" expanded="true" />
|
||||||
</folding>
|
</folding>
|
||||||
@ -224,7 +223,7 @@
|
|||||||
<component name="PropertiesComponent">
|
<component name="PropertiesComponent">
|
||||||
<property name="WebServerToolWindowFactoryState" value="false" />
|
<property name="WebServerToolWindowFactoryState" value="false" />
|
||||||
<property name="aspect.path.notification.shown" value="true" />
|
<property name="aspect.path.notification.shown" value="true" />
|
||||||
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1588384213991" />
|
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1588384735776" />
|
||||||
<property name="go.gopath.indexing.explicitly.defined" value="true" />
|
<property name="go.gopath.indexing.explicitly.defined" value="true" />
|
||||||
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
|
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
|
||||||
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
|
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
|
||||||
@ -265,16 +264,15 @@
|
|||||||
<option name="presentableId" value="Default" />
|
<option name="presentableId" value="Default" />
|
||||||
<updated>1588152877746</updated>
|
<updated>1588152877746</updated>
|
||||||
<workItem from="1588152880522" duration="16973000" />
|
<workItem from="1588152880522" duration="16973000" />
|
||||||
<workItem from="1588319878551" duration="20056000" />
|
<workItem from="1588319878551" duration="20451000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
<component name="TimeTrackingManager">
|
<component name="TimeTrackingManager">
|
||||||
<option name="totallyTimeSpent" value="37029000" />
|
<option name="totallyTimeSpent" value="37424000" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ToolWindowManager">
|
<component name="ToolWindowManager">
|
||||||
<frame x="0" y="0" width="1280" height="800" extended-state="0" />
|
<frame x="0" y="0" width="1280" height="800" extended-state="0" />
|
||||||
<editor active="true" />
|
|
||||||
<layout>
|
<layout>
|
||||||
<window_info id="Designer" order="0" />
|
<window_info id="Designer" order="0" />
|
||||||
<window_info id="UI Designer" order="1" />
|
<window_info id="UI Designer" order="1" />
|
||||||
@ -396,8 +394,8 @@
|
|||||||
</entry>
|
</entry>
|
||||||
<entry file="file://$PROJECT_DIR$/train.py">
|
<entry file="file://$PROJECT_DIR$/train.py">
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<provider selected="true" editor-type-id="text-editor">
|
||||||
<state relative-caret-position="164">
|
<state relative-caret-position="167">
|
||||||
<caret line="112" column="20" lean-forward="true" selection-start-line="112" selection-start-column="20" selection-end-line="112" selection-end-column="20" />
|
<caret line="106" column="40" lean-forward="true" selection-start-line="106" selection-start-column="40" selection-end-line="106" selection-end-column="40" />
|
||||||
<folding>
|
<folding>
|
||||||
<element signature="e#0#28#0" expanded="true" />
|
<element signature="e#0#28#0" expanded="true" />
|
||||||
</folding>
|
</folding>
|
||||||
|
109
train.py
109
train.py
@ -2,7 +2,6 @@ from pandas import DataFrame
|
|||||||
from pandas import Series
|
from pandas import Series
|
||||||
from pandas import concat
|
from pandas import concat
|
||||||
from pandas import read_csv
|
from pandas import read_csv
|
||||||
from pandas import datetime
|
|
||||||
from sklearn.metrics import mean_squared_error
|
from sklearn.metrics import mean_squared_error
|
||||||
from sklearn.preprocessing import MinMaxScaler
|
from sklearn.preprocessing import MinMaxScaler
|
||||||
from keras.models import Sequential
|
from keras.models import Sequential
|
||||||
@ -12,18 +11,13 @@ from math import sqrt
|
|||||||
import numpy
|
import numpy
|
||||||
|
|
||||||
|
|
||||||
# date-time parsing function for loading the dataset
|
|
||||||
def parser(x):
|
|
||||||
return datetime.strptime('190' + x, '%Y-%m')
|
|
||||||
|
|
||||||
|
|
||||||
# frame a sequence as a supervised learning problem
|
# frame a sequence as a supervised learning problem
|
||||||
def timeseries_to_supervised(data, lag=1):
|
def timeseries_to_supervised(data, lag=1):
|
||||||
df = DataFrame(data)
|
df = DataFrame(data)
|
||||||
columns = [df.shift(i) for i in range(1, lag + 1)]
|
columns = [df.shift(i) for i in range(1, lag + 1)]
|
||||||
columns.append(df)
|
columns.append(df)
|
||||||
df = concat(columns, axis=1)
|
df = concat(columns, axis=1)
|
||||||
df.fillna(0, inplace=True)
|
df = df.drop(0)
|
||||||
return df
|
return df
|
||||||
|
|
||||||
|
|
||||||
@ -56,8 +50,8 @@ def scale(train, test):
|
|||||||
|
|
||||||
|
|
||||||
# inverse scaling for a forecasted value
|
# inverse scaling for a forecasted value
|
||||||
def invert_scale(scaler, X, value):
|
def invert_scale(scaler, X, yhat):
|
||||||
new_row = [x for x in X] + [value]
|
new_row = [x for x in X] + [yhat]
|
||||||
array = numpy.array(new_row)
|
array = numpy.array(new_row)
|
||||||
array = array.reshape(1, len(array))
|
array = array.reshape(1, len(array))
|
||||||
inverted = scaler.inverse_transform(array)
|
inverted = scaler.inverse_transform(array)
|
||||||
@ -73,7 +67,6 @@ def fit_lstm(train, batch_size, nb_epoch, neurons):
|
|||||||
model.add(Dense(1))
|
model.add(Dense(1))
|
||||||
model.compile(loss='mean_squared_error', optimizer='adam')
|
model.compile(loss='mean_squared_error', optimizer='adam')
|
||||||
for i in range(nb_epoch):
|
for i in range(nb_epoch):
|
||||||
print("Epoch {}/{}".format(i, nb_epoch))
|
|
||||||
model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
|
model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
|
||||||
model.reset_states()
|
model.reset_states()
|
||||||
return model
|
return model
|
||||||
@ -86,44 +79,62 @@ def forecast_lstm(model, batch_size, X):
|
|||||||
return yhat[0, 0]
|
return yhat[0, 0]
|
||||||
|
|
||||||
|
|
||||||
|
# run a repeated experiment
|
||||||
|
def experiment(repeats, series, seed):
|
||||||
|
# transform data to be stationary
|
||||||
|
raw_values = series.values
|
||||||
|
diff_values = difference(raw_values, 1)
|
||||||
|
# transform data to be supervised learning
|
||||||
|
supervised = timeseries_to_supervised(diff_values, 1)
|
||||||
|
supervised_values = supervised.values
|
||||||
|
# split data into train and test-sets
|
||||||
|
train, test = supervised_values[0:-12], supervised_values[-12:]
|
||||||
|
# transform the scale of the data
|
||||||
|
scaler, train_scaled, test_scaled = scale(train, test)
|
||||||
|
# run experiment
|
||||||
|
error_scores = list()
|
||||||
|
for r in range(repeats):
|
||||||
|
# fit the model
|
||||||
|
batch_size = 4
|
||||||
|
train_trimmed = train_scaled[2:, :]
|
||||||
|
lstm_model = fit_lstm(train_trimmed, batch_size, 3000, 4)
|
||||||
|
# forecast the entire training dataset to build up state for forecasting
|
||||||
|
if seed:
|
||||||
|
train_reshaped = train_trimmed[:, 0].reshape(len(train_trimmed), 1, 1)
|
||||||
|
lstm_model.predict(train_reshaped, batch_size=batch_size)
|
||||||
|
# forecast test dataset
|
||||||
|
test_reshaped = test_scaled[:, 0:-1]
|
||||||
|
test_reshaped = test_reshaped.reshape(len(test_reshaped), 1, 1)
|
||||||
|
output = lstm_model.predict(test_reshaped, batch_size=batch_size)
|
||||||
|
predictions = list()
|
||||||
|
for i in range(len(output)):
|
||||||
|
yhat = output[i, 0]
|
||||||
|
X = test_scaled[i, 0:-1]
|
||||||
|
# invert scaling
|
||||||
|
yhat = invert_scale(scaler, X, yhat)
|
||||||
|
# invert differencing
|
||||||
|
yhat = inverse_difference(raw_values, yhat, len(test_scaled) + 1 - i)
|
||||||
|
# store forecast
|
||||||
|
predictions.append(yhat)
|
||||||
|
# report performance
|
||||||
|
rmse = sqrt(mean_squared_error(raw_values[-12:], predictions))
|
||||||
|
print('%d) Test RMSE: %.3f' % (r + 1, rmse))
|
||||||
|
error_scores.append(rmse)
|
||||||
|
return error_scores
|
||||||
|
|
||||||
|
|
||||||
# load dataset
|
# load dataset
|
||||||
series = read_csv('data.csv', header=0, index_col=0, squeeze=True)
|
series = read_csv('data.csv', header=0, index_col=0, squeeze=True)
|
||||||
|
# experiment
|
||||||
# transform data to be stationary
|
repeats = 30
|
||||||
raw_values = series.values
|
results = DataFrame()
|
||||||
diff_values = difference(raw_values, 1)
|
# with seeding
|
||||||
|
with_seed = experiment(repeats, series, True)
|
||||||
# transform data to be supervised learning
|
results['with-seed'] = with_seed
|
||||||
supervised = timeseries_to_supervised(diff_values, 1)
|
# without seeding
|
||||||
supervised_values = supervised.values
|
without_seed = experiment(repeats, series, False)
|
||||||
|
results['without-seed'] = without_seed
|
||||||
# split data into train and test-sets
|
# summarize results
|
||||||
train, test = supervised_values[0:-12], supervised_values[-12:]
|
print(results.describe())
|
||||||
|
# save boxplot
|
||||||
# transform the scale of the data
|
results.boxplot()
|
||||||
scaler, train_scaled, test_scaled = scale(train, test)
|
|
||||||
|
|
||||||
# fit the model
|
|
||||||
lstm_model = fit_lstm(train_scaled, 1, 30, 4)
|
|
||||||
# forecast the entire training dataset to build up state for forecasting
|
|
||||||
train_reshaped = train_scaled[:, 0].reshape(len(train_scaled), 1, 1)
|
|
||||||
lstm_model.predict(train_reshaped, batch_size=1)
|
|
||||||
|
|
||||||
# walk-forward validation on the test data
|
|
||||||
predictions = list()
|
|
||||||
for j in range(len(test_scaled)):
|
|
||||||
# make one-step forecast
|
|
||||||
X, y = test_scaled[j, 0:-1], test_scaled[j, -1]
|
|
||||||
yhat = forecast_lstm(lstm_model, 1, X)
|
|
||||||
# invert scaling
|
|
||||||
yhat = invert_scale(scaler, X, yhat)
|
|
||||||
# invert differencing
|
|
||||||
yhat = inverse_difference(raw_values, yhat, len(test_scaled) + 1 - j)
|
|
||||||
# store forecast
|
|
||||||
predictions.append(yhat)
|
|
||||||
expected = raw_values[len(train) + j + 1]
|
|
||||||
print('Month=%d, Predicted=%f, Expected=%f' % (j + 1, yhat, expected))
|
|
||||||
|
|
||||||
# report performance
|
|
||||||
rmse = sqrt(mean_squared_error(raw_values[-12:], predictions))
|
|
||||||
print('Test RMSE: %.3f' % rmse)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user