From 57c2901a44e9e7b020962e18099613daffd3de4a Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Thu, 11 Aug 2016 15:34:09 -0700 Subject: [PATCH 1/8] tried logging model progress using dict --- main.py | 2 +- wine_quality/training.py | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 3abc6c7..72b47c8 100644 --- a/main.py +++ b/main.py @@ -66,7 +66,7 @@ def upload(): print(form.__dict__) # Save to Redis here form.training_data.data.save('wine_quality/data/' + filename) - dataframe = pd.read_csv('wine_quality/data/' + filename, sep=';') + dataframe = pd.read_csv('wine_quality/data/' + filename, sep=',') train_model(dataframe, learning_rate, batch_size) else: filename = None diff --git a/wine_quality/training.py b/wine_quality/training.py index 3c46a49..0ea7140 100644 --- a/wine_quality/training.py +++ b/wine_quality/training.py @@ -73,6 +73,7 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) + log_dict = {} # Dictionary to store logging of model progress for i in range(100): average_cost = 0 number_of_batches = int(len(X_train) / batch_size) @@ -80,8 +81,23 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) # Compute average loss average_cost += sess.run(cost, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) / number_of_batches - print(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})) + # print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost)) + log_cost = "Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost) + # print(log_cost) + log_dict['line_{0}'.format(i)] = log_cost - path = saver.save(sess, os.path.join(os.path.dirname(__file__), "data/softmax_regression.ckpt")) - print("Saved:", path) + # print("Finished optimization!") + log_dict['line_{0}'.format(len(log_dict) + 1)] = "Finished optimization!" + + log_accuracy = "Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})) + # print(log_accuracy) + log_dict['line_{0}'.format(len(log_dict)+1)] = log_accuracy + + path = saver.save(sess, os.path.join(os.path.dirname(__file__), "data/softmax_regression.ckpt")) + # print("Saved:", path) + log_dict['line_{0}'.format(len(log_dict)+1)] = "Saved: "+path + + print(log_dict) + + return log_dict From 90b10273e8caa65febfc1b32dcaba8ea413e915c Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Thu, 11 Aug 2016 16:11:29 -0700 Subject: [PATCH 2/8] model progress logged to list --- main.py | 2 +- wine_quality/training.py | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/main.py b/main.py index 72b47c8..fb4d2a0 100644 --- a/main.py +++ b/main.py @@ -23,7 +23,7 @@ with tf.variable_scope("softmax_regression"): y1, variables = model.softmax_regression(x) saver = tf.train.Saver(variables) -saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") +# saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") def simple(x1): return sess.run(y1, feed_dict={x: x1}) diff --git a/wine_quality/training.py b/wine_quality/training.py index 0ea7140..86ebf18 100644 --- a/wine_quality/training.py +++ b/wine_quality/training.py @@ -73,7 +73,7 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) - log_dict = {} # Dictionary to store logging of model progress + log_list = [] # List to store logging of model progress for i in range(100): average_cost = 0 number_of_batches = int(len(X_train) / batch_size) @@ -81,23 +81,25 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) # Compute average loss average_cost += sess.run(cost, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) / number_of_batches - # print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost)) - log_cost = "Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost) + print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost)) + log_cost = "Epoch: {:d}, cost= {:.9f}".format(i + 1, average_cost) # print(log_cost) - log_dict['line_{0}'.format(i)] = log_cost + log_list.append(log_cost) - # print("Finished optimization!") - log_dict['line_{0}'.format(len(log_dict) + 1)] = "Finished optimization!" + print("Finished optimization!") + log_list.append("Finished optimization!") + print("Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test}))) log_accuracy = "Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})) # print(log_accuracy) - log_dict['line_{0}'.format(len(log_dict)+1)] = log_accuracy + log_list.append(log_accuracy) path = saver.save(sess, os.path.join(os.path.dirname(__file__), "data/softmax_regression.ckpt")) - # print("Saved:", path) - log_dict['line_{0}'.format(len(log_dict)+1)] = "Saved: "+path + print("Saved:", path) + log_list.append("Saved: "+path) - print(log_dict) + print("") + print(log_list) - return log_dict + # return log_list From f03b6d6a2780f75818224c52a4b484fee5f40525 Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Fri, 12 Aug 2016 11:08:19 -0700 Subject: [PATCH 3/8] model progress logged to train page --- main.py | 3 ++- templates/test_data_upload.html | 10 ++++++++++ wine_quality/training.py | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index fb4d2a0..9f52317 100644 --- a/main.py +++ b/main.py @@ -67,7 +67,8 @@ def upload(): # Save to Redis here form.training_data.data.save('wine_quality/data/' + filename) dataframe = pd.read_csv('wine_quality/data/' + filename, sep=',') - train_model(dataframe, learning_rate, batch_size) + model_log = train_model(dataframe, learning_rate, batch_size) + return render_template('test_data_upload.html', form=form, filename=filename, model_log=model_log) else: filename = None return render_template('test_data_upload.html', form=form, filename=filename) diff --git a/templates/test_data_upload.html b/templates/test_data_upload.html index c183e62..636c3b7 100644 --- a/templates/test_data_upload.html +++ b/templates/test_data_upload.html @@ -15,5 +15,15 @@

Input

+

+ {% if model_log %} +

Model Log

+

+ {% for log_entry in model_log %} + {{ log_entry }}
+ {% endfor %} +

+ {% endif %} +
diff --git a/wine_quality/training.py b/wine_quality/training.py index 86ebf18..7e27f43 100644 --- a/wine_quality/training.py +++ b/wine_quality/training.py @@ -101,5 +101,5 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): print("") print(log_list) - # return log_list + return log_list From 76d845d38657cc0775532569f67e5006322fe7f2 Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Mon, 15 Aug 2016 20:06:13 -0700 Subject: [PATCH 4/8] added bootstrap --- main.py | 28 ++++++++++--- templates/test_data_upload.html | 62 +++++++++++++++++----------- templates/test_parameters.html | 63 ++++++++++++++++++----------- wine_quality/training.py | 72 ++++++++++++++++----------------- 4 files changed, 136 insertions(+), 89 deletions(-) diff --git a/main.py b/main.py index 9f52317..20a8e3d 100644 --- a/main.py +++ b/main.py @@ -23,9 +23,9 @@ with tf.variable_scope("softmax_regression"): y1, variables = model.softmax_regression(x) saver = tf.train.Saver(variables) -# saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") +saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") def simple(x1): - return sess.run(y1, feed_dict={x: x1}) + return sess.run(y1, feed_dict={x: x1}).flatten().tolist() csrf = CsrfProtect() @@ -48,11 +48,29 @@ def hello_world(): def test_parameters(): form = TestParameterForm(request.form) if request.method == 'POST' and form.validate(): + volatile_acidity = float(form.volatile_acidity.data) + citric_acid = float(form.citric_acid.data) + residual_sugar = float(form.residual_sugar.data) + chlorides = float(form.chlorides.data) + free_sulfur_dioxide = float(form.free_sulfur_dioxide.data) + total_sulfur_dioxide = float(form.total_sulfur_dioxide.data) + density = float(form.density.data) + ph = float(form.ph.data) + sulphates = float(form.sulphates.data) + alcohol = float(form.alcohol.data) + input_list = [volatile_acidity, citric_acid, residual_sugar, chlorides, free_sulfur_dioxide, + total_sulfur_dioxide, density, ph, sulphates, alcohol] print(form.__dict__) # simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) - results = simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) - return render_template('test_parameters.html', form=form, result=results[0]) - return render_template('test_parameters.html', form=form) + results = simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) # Bad wine + # results = simple([[0.35, 0.46, 3.6, 0.078, 15, 37, 0.99730, 3.35, 0.86, 12.8]]) # Good wine + print(results) + # results = simple([input_list]) + # return render_template('test_parameters.html', form=form, result=results) + else: + results = None + + return render_template('test_parameters.html', form=form, result=results) @app.route('/train/', methods=('GET', 'POST')) diff --git a/templates/test_data_upload.html b/templates/test_data_upload.html index 636c3b7..7206364 100644 --- a/templates/test_data_upload.html +++ b/templates/test_data_upload.html @@ -1,29 +1,43 @@ - + + + + Model Training + + + + + + -
-

Input

-{% from "_formhelpers.html" import render_field %} -
- {{ form.csrf_token }} -
- {{ render_field(form.training_data ) }} - {{ render_field(form.learning_rate ) }} - {{ render_field(form.batch_size ) }} - {{ render_field(form.model_name ) }} -
-

-

-
-
- {% if model_log %} -

Model Log

-

- {% for log_entry in model_log %} - {{ log_entry }}
- {% endfor %} -

- {% endif %} +
+
+
+

Input

+ {% from "_formhelpers.html" import render_field %} +
+ {{ form.csrf_token }} +
+ {{ render_field(form.training_data ) }} + {{ render_field(form.learning_rate ) }} + {{ render_field(form.batch_size ) }} + {{ render_field(form.model_name ) }} +
+

+

+
+ +
+ {% if model_log %} +

Model Log

+

+ {% for log_entry in model_log %} + {{ log_entry }}
+ {% endfor %} +

+ {% endif %} +
+
diff --git a/templates/test_parameters.html b/templates/test_parameters.html index 448658d..00de2cb 100644 --- a/templates/test_parameters.html +++ b/templates/test_parameters.html @@ -1,29 +1,44 @@ - + + Fit Model + + + + + + -
-

Input

-{% from "_formhelpers.html" import render_field %} -
- {{ form.csrf_token }} -
- {{ render_field(form.alcohol ) }} - {{ render_field(form.volatile_acidity ) }} - {{ render_field(form.citric_acid ) }} - {{ render_field(form.residual_sugar ) }} - {{ render_field(form.chlorides ) }} - {{ render_field(form.free_sulfur_dioxide ) }} - {{ render_field(form.total_sulfur_dioxide) }} - {{ render_field(form.density ) }} - {{ render_field(form.ph ) }} - {{ render_field(form.sulphates ) }} -
-

-

-
-
-

Result

-

{{result}}

+
+
+
+

Input

+ {% from "_formhelpers.html" import render_field %} +
+ {{ form.csrf_token }} +
+ {{ render_field(form.volatile_acidity ) }} + {{ render_field(form.citric_acid ) }} + {{ render_field(form.residual_sugar ) }} + {{ render_field(form.chlorides ) }} + {{ render_field(form.free_sulfur_dioxide ) }} + {{ render_field(form.total_sulfur_dioxide) }} + {{ render_field(form.density ) }} + {{ render_field(form.ph ) }} + {{ render_field(form.sulphates ) }} + {{ render_field(form.alcohol ) }} +
+

+

+
+ +
+ {% if result %} +

Result

+

Probability wine is bad: {{ result[0] }}

+

Probability wine is good: {{ result[1] }}

+ {% endif %} +
+
diff --git a/wine_quality/training.py b/wine_quality/training.py index 7e27f43..71b7ade 100644 --- a/wine_quality/training.py +++ b/wine_quality/training.py @@ -42,17 +42,15 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): bins = [3, 5, 8] red_wine_newcats['category'] = pd.cut(red_wine_newcats.quality, bins, labels=['Bad', 'Good'], include_lowest=True) - y_red_wine = red_wine_newcats[['category']].get_values() # Removing fixed_acidity and quality X_red_wine = red_wine_newcats.iloc[:,1:-2].get_values() y_red_wine_raveled = y_red_wine.ravel() - y_red_wine_integers = [y.replace('Bad', '1') for y in y_red_wine_raveled] - y_red_wine_integers = [y.replace('Good', '0') for y in y_red_wine_integers] + y_red_wine_integers = [y.replace('Bad', '0') for y in y_red_wine_raveled] + y_red_wine_integers = [y.replace('Good', '1') for y in y_red_wine_integers] y_red_wine_integers = [np.int(y) for y in y_red_wine_integers] - y_one_hot = _dense_to_one_hot(y_red_wine_integers, num_classes=2) X_train, X_test, y_train, y_test = train_test_split(X_red_wine, y_one_hot, test_size=0.2, random_state=42) @@ -70,36 +68,38 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) saver = tf.train.Saver(variables) - sess = tf.Session() init = tf.initialize_all_variables() - sess.run(init) - log_list = [] # List to store logging of model progress - for i in range(100): - average_cost = 0 - number_of_batches = int(len(X_train) / batch_size) - for start, end in zip(range(0, len(X_train), batch_size), range(batch_size, len(X_train), batch_size)): - sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) - # Compute average loss - average_cost += sess.run(cost, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) / number_of_batches - print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost)) - log_cost = "Epoch: {:d}, cost= {:.9f}".format(i + 1, average_cost) - # print(log_cost) - log_list.append(log_cost) - - print("Finished optimization!") - log_list.append("Finished optimization!") - - print("Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test}))) - log_accuracy = "Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})) - # print(log_accuracy) - log_list.append(log_accuracy) - - path = saver.save(sess, os.path.join(os.path.dirname(__file__), "data/softmax_regression.ckpt")) - print("Saved:", path) - log_list.append("Saved: "+path) - - print("") - print(log_list) - - return log_list - + with tf.Session() as sess: + + sess.run(init) + log_list = [] # List to store logging of model progress + for i in range(100): + average_cost = 0 + number_of_batches = int(len(X_train) / batch_size) + for start, end in zip(range(0, len(X_train), batch_size), range(batch_size, len(X_train), batch_size)): + sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) + # Compute average loss + average_cost += sess.run(cost, + feed_dict={X: X_train[start:end], y_: y_train[start:end]}) / number_of_batches + if i % 10 == 0: + print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost)) + log_cost = "Epoch {:d}: cost = {:.9f}".format(i + 1, average_cost) + # print(log_cost) + log_list.append(log_cost) + + print("Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test}))) + log_accuracy = "Accuracy: {0}".format(sess.run(accuracy, feed_dict={X: X_test, y_: y_test})) + # print(log_accuracy) + log_list.append(log_accuracy) + + path = saver.save(sess, os.path.join(os.path.dirname(__file__), "data/softmax_regression.ckpt")) + print("Saved:", path) + # log_list.append("Saved: "+path) + + print("") + print(log_list) + + return log_list + +# df = pd.read_csv('data/winequality-red.csv', sep=',') +# train_model(df) \ No newline at end of file From c3b4e2fd0eba6e5bc4d698050fada8246f5a9798 Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Wed, 17 Aug 2016 16:00:06 -0700 Subject: [PATCH 5/8] improved page style --- main.py | 5 +++-- templates/test_data_upload.html | 24 +++++++++++++++++++++++- templates/test_parameters.html | 19 +++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 20a8e3d..2bff745 100644 --- a/main.py +++ b/main.py @@ -23,7 +23,7 @@ with tf.variable_scope("softmax_regression"): y1, variables = model.softmax_regression(x) saver = tf.train.Saver(variables) -saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") +# saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") def simple(x1): return sess.run(y1, feed_dict={x: x1}).flatten().tolist() @@ -86,7 +86,8 @@ def upload(): form.training_data.data.save('wine_quality/data/' + filename) dataframe = pd.read_csv('wine_quality/data/' + filename, sep=',') model_log = train_model(dataframe, learning_rate, batch_size) - return render_template('test_data_upload.html', form=form, filename=filename, model_log=model_log) + return render_template('test_data_upload.html', form=form, filename=filename, model_log=model_log, + learning_rate=learning_rate, batch_size=batch_size) else: filename = None return render_template('test_data_upload.html', form=form, filename=filename) diff --git a/templates/test_data_upload.html b/templates/test_data_upload.html index 7206364..b24f084 100644 --- a/templates/test_data_upload.html +++ b/templates/test_data_upload.html @@ -10,7 +10,25 @@ + +
+
+

Model Training

+

Load a csv with your wine data set. Then choose a learning rate, batch size and output model name. Press submit + to train the model.

+
+

Input

@@ -29,7 +47,11 @@

Input

{% if model_log %} -

Model Log

+

Model

+

Training Parameters

+

Learning rate = {{ learning_rate }}

+

Batch size = {{ batch_size}}

+

Model Training Log

{% for log_entry in model_log %} {{ log_entry }}
diff --git a/templates/test_parameters.html b/templates/test_parameters.html index 00de2cb..f705d35 100644 --- a/templates/test_parameters.html +++ b/templates/test_parameters.html @@ -9,7 +9,26 @@ +

+
+ +
+

Wine Quality Tester

+

Enter the chemical properties for your wine below. Press submit to discover whether your wine is of good or + bad quality

+
+

Input

From 12f9adba8a1c01dc18e11fab116bab14108e8cd9 Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Fri, 19 Aug 2016 15:04:05 -0700 Subject: [PATCH 6/8] changed jumbotron text color to white --- main.py | 2 +- templates/test_data_upload.html | 2 +- templates/test_parameters.html | 2 +- wine_quality/training.py | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 2bff745..235fa1d 100644 --- a/main.py +++ b/main.py @@ -23,7 +23,7 @@ with tf.variable_scope("softmax_regression"): y1, variables = model.softmax_regression(x) saver = tf.train.Saver(variables) -# saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") +saver.restore(sess, "wine_quality/data/softmax_regression.ckpt") def simple(x1): return sess.run(y1, feed_dict={x: x1}).flatten().tolist() diff --git a/templates/test_data_upload.html b/templates/test_data_upload.html index b24f084..81097fb 100644 --- a/templates/test_data_upload.html +++ b/templates/test_data_upload.html @@ -23,7 +23,7 @@
-
+

Model Training

Load a csv with your wine data set. Then choose a learning rate, batch size and output model name. Press submit to train the model.

diff --git a/templates/test_parameters.html b/templates/test_parameters.html index f705d35..2a023ac 100644 --- a/templates/test_parameters.html +++ b/templates/test_parameters.html @@ -23,7 +23,7 @@
-
+

Wine Quality Tester

Enter the chemical properties for your wine below. Press submit to discover whether your wine is of good or bad quality

diff --git a/wine_quality/training.py b/wine_quality/training.py index 71b7ade..77ac2fd 100644 --- a/wine_quality/training.py +++ b/wine_quality/training.py @@ -80,7 +80,8 @@ def train_model(training_df, learning_rate=0.001, batch_size=126): sess.run(optimizer, feed_dict={X: X_train[start:end], y_: y_train[start:end]}) # Compute average loss average_cost += sess.run(cost, - feed_dict={X: X_train[start:end], y_: y_train[start:end]}) / number_of_batches + feed_dict={X: X_train[start:end], + y_: y_train[start:end]}) / number_of_batches if i % 10 == 0: print("Epoch:", '%04d' % (i + 1), "cost=", "{:.9f}".format(average_cost)) log_cost = "Epoch {:d}: cost = {:.9f}".format(i + 1, average_cost) From 7d0a0f595f90b9993b90fd2861412a37d4cdcb3f Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Fri, 19 Aug 2016 17:46:13 -0700 Subject: [PATCH 7/8] removed default values of input_list --- main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 235fa1d..852af6c 100644 --- a/main.py +++ b/main.py @@ -61,12 +61,13 @@ def test_parameters(): input_list = [volatile_acidity, citric_acid, residual_sugar, chlorides, free_sulfur_dioxide, total_sulfur_dioxide, density, ph, sulphates, alcohol] print(form.__dict__) + # VALUES TO USE: [0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4] # simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) - results = simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) # Bad wine + # results = simple([[0.7, 0, 1.9, 0.076, 11, 34, 0.99780, 3.51, 0.56, 9.4]]) # Bad wine # results = simple([[0.35, 0.46, 3.6, 0.078, 15, 37, 0.99730, 3.35, 0.86, 12.8]]) # Good wine - print(results) - # results = simple([input_list]) + results = simple([input_list]) # return render_template('test_parameters.html', form=form, result=results) + print(results) else: results = None From 19ee5bb4c162646b47c21cd46e6e91e170d90bb7 Mon Sep 17 00:00:00 2001 From: dmclark53 Date: Sat, 20 Aug 2016 23:59:53 -0700 Subject: [PATCH 8/8] fixed error in printing result on test page --- templates/test_parameters.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/test_parameters.html b/templates/test_parameters.html index 2a023ac..ba983ae 100644 --- a/templates/test_parameters.html +++ b/templates/test_parameters.html @@ -54,8 +54,7 @@

Input

{% if result %}

Result

-

Probability wine is bad: {{ result[0] }}

-

Probability wine is good: {{ result[1] }}

+

Prediction accuracy: {{ result[0] }}

{% endif %}