Ich habe einige Eingabedaten in einer CSV generiert, wo "awesomeness" "age * 10" ist. Es sieht wie folgt aus:Wie trainierst du ein lineares Modell im Tensorflow?
age, awesomeness
67, 670
38, 380
32, 320
69, 690
40, 400
Es sollte trivial sein, ein tensorflow Modell zu schreiben, die ‚awesomeness‘ von ‚Alter‘ vorhersagen kann, aber ich kann es nicht funktionieren.
Wenn ich mit dem Training laufen, der Ausgang ich erhalte, ist:
accuracy: 0.0 <----------------------------------- What!??
accuracy/baseline_label_mean: 443.8
accuracy/threshold_0.500000_mean: 0.0
auc: 0.0
global_step: 6000
labels/actual_label_mean: 443.8
labels/prediction_mean: 1.0
loss: -2.88475e+09
precision/positive_threshold_0.500000_mean: 1.0
recall/positive_threshold_0.500000_mean: 1.0
Bitte beachten Sie, dass dies offensichtlich ein völlig erfundenes Beispiel, aber das ist, weil ich das gleiche Ergebnis mit einem komplexeren aussagekräftigen Modell immer mit ein viel größerer Datensatz; 0% Genauigkeit
Dies ist mein Versuch, den minimal möglichen reproduzierbaren Testfall, den ich machen kann, der das gleiche Verhalten zeigt, zu versuchen.
Hier ist, was ich tue, auf der Grundlage der Volkszählung Beispiel für die DNNClassifier von tflearn:
COLUMNS = ["age", "awesomeness"]
CONTINUOUS_COLUMNS = ["age"]
OUTPUT_COLUMN = "awesomeness"
def build_estimator(model_dir):
"""Build an estimator."""
age = tf.contrib.layers.real_valued_column("age")
deep_columns = [age]
m = tf.contrib.learn.DNNClassifier(model_dir=model_dir,
feature_columns=deep_columns,
hidden_units=[50, 10])
return m
def input_fn(df):
"""Input builder function."""
feature_cols = {k: tf.constant(df[k].values, shape=[df[k].size, 1]) for k in CONTINUOUS_COLUMNS}
output = tf.constant(df[OUTPUT_COLUMN].values, shape=[df[OUTPUT_COLUMN].size, 1])
return feature_cols, output
def train_and_eval(model_dir, train_steps):
"""Train and evaluate the model."""
train_file_name, test_file_name = training_data()
df_train = pd.read_csv(...) # ommitted for clarity
df_test = pd.read_csv(...)
m = build_estimator(model_dir)
m.fit(input_fn=lambda: input_fn(df_train), steps=train_steps)
results = m.evaluate(input_fn=lambda: input_fn(df_test), steps=1)
for key in sorted(results):
print("%s: %s" % (key, results[key]))
def training_data():
"""Return path to the training and test data"""
training_datafile = path.join(path.dirname(__file__), 'data', 'data.training')
test_datafile = path.join(path.dirname(__file__), 'data', 'data.test')
return training_datafile, test_datafile
model_folder = 'scripts/model' # Where to store the model
train_steps = 2000 # How many iterations to run while training
train_and_eval(model_folder, train_steps)
Ein paar Anmerkungen:
Das ursprüngliche Beispiel Tutorial dies basiert auf ist hier https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/learn/wide_n_deep_tutorial.py
Hinweis Ich verwende den DNNClassifier, nicht den LinearClassifier, wie ich speziell mit kontinuierlicher Inpu beschäftigen möchte t Variablen.
Viele Beispiele verwenden nur 'vorgefertigte' Datensätze, von denen bekannt ist, dass sie mit Beispielen arbeiten; Mein Datensatz wurde manuell erstellt und ist absolut nicht zufällig.
Ich habe verifiziert, dass der CSV-Lader die Daten korrekt als int64 Werte lädt.
Trainings- und Testdaten werden identisch generiert, haben jedoch unterschiedliche Werte. aber unter Verwendung von data.training als die Testdaten immer noch gibt eine Genauigkeit von 0% zurück, so dass es keine Frage ist, dass etwas nicht funktioniert, das ist nicht nur übermäßig anpassen.
Hm ... könnten Sie vielleicht klären, wie diese auf komplexere Modelle verallgemeinert? Dies scheint spezifisch für die Anpassung eines linearen Moduls zu sein, wo ich * bereits weiß * y = k * x; Ich weiß, das ist es, was ich gefragt habe, so fair, aber es scheint, als ob es den Punkt versäumt, über den Datensatz zu trainieren, wenn man schon wissen muss, was es ist ....? – Doug
So funktioniert maschinelles Lernen (es gibt einige Zweige der Statistik, die sich mit nicht-parametrischen Modellen befassen, aber das ist ein ganz anderes Biest). Der einzige Unterschied dieses Modells zu realen Anwendungen besteht darin, dass letzteres normalerweise viel kompliziertere und expressivere Modelle beinhaltet. Aber du hast gesagt, du wolltest ein lineares Modell, also hast du das bekommen;) – dseuss