Spaces:
Sleeping
Sleeping
File size: 4,524 Bytes
fb0ec99 841b1aa fb0ec99 841b1aa b49e22e fb0ec99 841b1aa fb0ec99 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import streamlit as st
import joblib
import numpy as np
import pandas as pd
import plotly.express as px
# Load the models
scaler = joblib.load('scaler.joblib')
model = joblib.load('best_rf.joblib')
sensory_feature_column = ['sweet',
'sour',
'bitter',
'aromatic_impact',
'fruity_impact',
'art_sweetener_chewing',
'chews',
'art_sweetener_after',
'stickiness_with_fingers',
'springiness_with_fingers',
'abrasive',
'hardness_with_molars',
'uniformity_of_bite',
'gritty',
'springiness_during_chew',
'cohesiveness_of_mass',
'moistness_of_mass',
'toothsticking',
'toothpacking',
'adhesiveness_to_molars',
'oily_mouthcoating']
def scale_output(prediction_matrix):
# Calculate the sum for each row
row_sums = np.sum(prediction_matrix, axis=1)
# Calculate the surplus or lack from 1 for each row
delta = 1 - row_sums
# Adjust each row proportionally
adjusted_matrix = prediction_matrix + delta[:, np.newaxis] * (prediction_matrix / row_sums[:, np.newaxis])
print(f'scaled probability: {adjusted_matrix.sum(axis=1)}')
return adjusted_matrix
# Streamlit App
def main():
st.title("Consumer liking score distribution prediction")
st.markdown("Please adjust the values of 21 sensory attributes (assumed to have the range from 1 - 10), and see the liking score distribution below")
with st.expander("Feature importance heatmap of sensory attributes on liking score"):
st.image("mmr-corr.png")
col1, col2, col3 = st.columns(3)
with col1:
sweet = st.slider('sweet', 0.00, 10.00, 0.01)
aromatic_impact = st.slider('aromatic impact', 0.00, 10.00, 0.01)
chew = st.slider('chew', 0.00, 10.00, 0.01)
springiness_with_fingers = st.slider('springiness_with_fingers', 0.00, 10.00, 0.01)
uniformity_of_bite = st.slider('uniformity_of_bite', 0.00, 10.00, 0.01)
cohesiveness_of_mass = st.slider('cohesiveness_of_mass', 0.00, 10.00, 0.01)
toothpacking = st.slider('toothpacking', 0.00, 10.00, 0.01)
with col2:
sour = st.slider('sour', 0.00, 10.00, 0.01)
fruity_impact = st.slider('fruity impact',0.00, 10.00, 0.01)
art_sweetener_after = st.slider('art_sweetener_after', 0.00, 10.00, 0.01)
abrasiveness = st.slider('abrasiveness', 0.00, 10.00, 0.01)
gritty = st.slider('gritty', 0.00, 10.00, 0.01)
moisture_of_mass = st.slider('moisture_of_mass', 0.00, 10.00, 0.01)
adhesiveness_to_molars = st.slider('adhesiveness_to_molars', 0.00, 10.00, 0.01)
with col3:
bitter = st.slider('bitter', 0.00, 10.00, 0.01)
art_sweetener_chewing = st.slider('art_sweetener_chewing',0.00, 10.00, 0.01)
stickiness_with_fingers = st.slider('stickiness_with_fingers', 0.00, 10.00, 0.01)
hardness_with_molars = st.slider('hardness_with_molars', 0.00, 10.00, 0.01)
springiness_during_chew = st.slider('springiness_during_chew', 0.00, 10.00, 0.01)
toothsticking = st.slider('toothsticking', 0.00, 10.00, 0.01)
oily_mouthcoating = st.slider('oily_mouthcoating', 0.00, 10.00, 0.01)
data_input = [sweet, sour, bitter, aromatic_impact, fruity_impact, art_sweetener_chewing,chew,
art_sweetener_after, stickiness_with_fingers, springiness_with_fingers , abrasiveness, hardness_with_molars , uniformity_of_bite, gritty,
springiness_during_chew, cohesiveness_of_mass, moisture_of_mass , toothsticking , toothpacking, adhesiveness_to_molars, oily_mouthcoating]
test_df = pd.DataFrame(np.array(data_input).reshape(1, 21))
test_df.columns = sensory_feature_column
scaled_data_input = scaler.transform(test_df)
handout_prediction = scale_output(model.predict(scaled_data_input))
handout_pred_df = pd.DataFrame(handout_prediction)
handout_pred_df.columns = [str(i) for i in range(1,10)]
handout_pred_df['prod'] = 'prediction'
handout_pred_df = handout_pred_df.melt('prod')
# st.write(f"prediction: {handout_prediction }")
st.write(f"sum of probability: {np.round(handout_prediction.sum(), 2)}")
fig = px.histogram(data_frame=handout_pred_df, x= 'variable',y='value', nbins= 9,
text_auto=True, title="Probability prediction of liking score from sensory attributes",
labels={"value": "probability",
"variable": "liking score"})
st.plotly_chart(fig, theme='streamlit')
if __name__ == "__main__":
main()
|