Zeitreihenanalyse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RRButon
User
Beiträge: 8
Registriert: Mittwoch 6. Oktober 2021, 15:17

Hallo zusammen.

Ich versuche mich am Machine Learning. Dort habe ich mir eine Zeitreihe ausgesucht, welche freie Parkplätze in der Stadt angibt. Nach langem ausprobieren habe ich bei Tensorflow ein Skript gefunden, welches unterschiedliche Modelle ausführt, welches mir helfen soll, dass Beste zu finden. Mit den vorgegebenen Daten (Temperaturen) funktioniert dies wunderbar. Ich kann auch die Daten ersetzen und der grösste Teil ausführen. Bei der Vorlage wird die Temperatur vorhergesagt und ich will frei Parkplätze vorhersagen. Somit sollte ich aus meiner Sicht den Code übernehmen können. Leider funktioniert dies nicht und bei einer Methode verabschiedet sich immer der Kernel. Ich habe nicht herausgefunden, warum.

Nachfolgend der Code:


Aufteilen der Test/Trainingsdaten (Zeitreihe):

Code: Alles auswählen

column_indices = {name: i for i, name in enumerate(df.columns)}

n = len(df)
train_df = df[0:int(n*0.7)]
val_df = df[int(n*0.7):int(n*0.9)]
test_df = df[int(n*0.9):]

num_features = df.shape[1]
Normalisieren der Daten:

Code: Alles auswählen

train_mean = train_df.mean()
train_std = train_df.std()

train_df = (train_df - train_mean) / train_std
val_df = (val_df - train_mean) / train_std
test_df = (test_df - train_mean) / train_std
Erstellen der Klasse WindwoGenerator:

Code: Alles auswählen

class WindowGenerator():
  def __init__(self, input_width, label_width, shift,
               train_df=train_df, val_df=val_df, test_df=test_df,
               label_columns=None):
    # Store the raw data.
    self.train_df = train_df
    self.val_df = val_df
    self.test_df = test_df

    # Work out the label column indices.
    self.label_columns = label_columns
    if label_columns is not None:
      self.label_columns_indices = {name: i for i, name in
                                    enumerate(label_columns)}
    self.column_indices = {name: i for i, name in
                           enumerate(train_df.columns)}

    # Work out the window parameters.
    self.input_width = input_width
    self.label_width = label_width
    self.shift = shift

    self.total_window_size = input_width + shift

    self.input_slice = slice(0, input_width)
    self.input_indices = np.arange(self.total_window_size)[self.input_slice]

    self.label_start = self.total_window_size - self.label_width
    self.labels_slice = slice(self.label_start, None)
    self.label_indices = np.arange(self.total_window_size)[self.labels_slice]

  def __repr__(self):
    return '\n'.join([
        f'Total window size: {self.total_window_size}',
        f'Input indices: {self.input_indices}',
        f'Label indices: {self.label_indices}',
        f'Label column name(s): {self.label_columns}'])
WindowGenerator testen:

Code: Alles auswählen

w2 = WindowGenerator(input_width=6, label_width=1, shift=1,
                     label_columns=["pp_free"])
w2
Output:
Total window size: 7
Input indices: [0 1 2 3 4 5]
Label indices: [6]
Label column name(s): ['pp_free']

Dieser soll auch sein und ist korrekt.

Erstellen der Methode split_window welche die Daten immer korrekt splitten sollte:

Code: Alles auswählen

def split_window(self, features):
  inputs = features[:, self.input_slice, :]
  labels = features[:, self.labels_slice, :]
  if self.label_columns is not None:
    labels = tf.stack(
        [labels[:, :, self.column_indices[name]] for name in self.label_columns],
        axis=-1)

  # Slicing doesn't preserve static shape information, so set the shapes
  # manually. This way the `tf.data.Datasets` are easier to inspect.
  inputs.set_shape([None, self.input_width, None])
  labels.set_shape([None, self.label_width, None])

  return inputs, labels

WindowGenerator.split_window = split_window
Testen der Methode mit der Klasse WindowGenerator:

Code: Alles auswählen

# Stack three slices, the length of the total window.
example_window = tf.stack([np.array(train_df[:w2.total_window_size]),
                           np.array(train_df[100:100+w2.total_window_size]),
                           np.array(train_df[200:200+w2.total_window_size])])

example_inputs, example_labels = w2.split_window(example_window)

print('All shapes are: (batch, time, features)')
print(f'Window shape: {example_window.shape}')
print(f'Inputs shape: {example_inputs.shape}')
print(f'Labels shape: {example_labels.shape}')
Output:
Canceled future for execute_request message before replies were done
The Kernel crashed while executing code in the the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details.

Der Output sollte aber sein:
All shapes are: (batch, time, features)
Window shape: (3, 7, 19)
Inputs shape: (3, 6, 19)
Labels shape: (3, 1, 1)

Mir ist dies ein Rätsel, warum es nicht funktionieren sollte. Ich hoffe, hier kann mir jemand helfen.

Link zum Jupyter Notebook von Tensorflow: https://www.tensorflow.org/tutorials/st ... ime_series

Vielen Dank und Grüsse
RRButon
User
Beiträge: 8
Registriert: Mittwoch 6. Oktober 2021, 15:17

Hallo nochmals

Weiss hier wirklich niemand eine Lösung?
juwido
User
Beiträge: 20
Registriert: Donnerstag 15. Dezember 2022, 13:41

Die Fehlermeldung ist zumindest nicht von Python. Eventuell lässt sich die Problemstelle ja weiter eingrenzen und dann umgehen...?
Gruß juwido
Antworten