Streamlit为什么不显示我的模型预测?

huangapple go评论78阅读模式
英文:

Why Streamlit does not show me my model prediction?

问题

我正在构建一个Streamlit应用程序,以进行欺诈预测。思路是当用户输入所需信息时,应用程序会显示交易是否是欺诈。然而,每次尝试时,它都不显示任何预测,而是返回到主页。下面是我的代码:

if col2.button('Manual Data Entry'):
    # Within the context of the form
    with st.form('Manual Data Entry'):
        # Transaction day selection
        day = st.slider('Transaction Day', 1, 31)

        # Input box for hours
        hour = st.slider('Transaction Hour', 1, 24)

        # Input box for amount
        amount = st.number_input('Transaction Amount', min_value=1)

        # Input box for cash withdrawal
        type_CASH_OUT = st.radio("Is it a cash withdrawal?", ('Yes', 'No'))

        # Input box for transfers
        type_TRANSFER = st.radio("Is it a transfer?", ('Yes', 'No'))

        # Input box for who initiates the transaction
        nameorig_C = st.radio("Who initiates the transaction?", ('Customer', 'Merchant'))

        # Input box for beneficiary
        namedest_C = st.radio("Is the beneficiary another customer?", ('Yes', 'No'))

        # Input box for beneficiary
        namedest_M = st.radio("Is the beneficiary a merchant?", ('Yes', 'No'))

        submitted = st.form_submit_button("Submit")

    if submitted:
        X_test = pd.DataFrame({
            'day': [day],
            'hour': [hour],
            'amount': [amount],
            'type_CASH_OUT': [type_CASH_OUT],
            'type_TRANSFER': [type_TRANSFER],
            'nameorig_C': [nameorig_C],
            'namedest_C': [namedest_C],
            'namedest_M': [namedest_M]
        })

        # Print test data
        st.write("Test Data:")
        st.write(X_test)

        # 2. Perform data transformations
        # Load PCA and scaler
        pca_path = 'C:/Users/lydia/OneDrive/Escritorio/Proyecto final_fraude/src/modelos/pca.pkl'
        scaler_path = 'C:/Users/lydia/OneDrive/Escritorio/Proyecto final_fraude/src/modelos/scaler.pkl'

        # Scale
        scaler = pickle.load(open(scaler_path, 'rb'))
        scaled_X_test = scaler.transform(X_test)

        # PCA
        pca = pickle.load(open(pca_path, 'rb'))
        X_test_pca = pd.DataFrame(pca.transform(scaled_X_test), columns=['PC1', 'PC2', 'PC3', 'PC4', 'PC5'])

        # Print transformed data
        st.write("Transformed Data (X_test_pca):")
        st.write(X_test_pca)

        # 3. Load the model and other related objects
        my_model = pickle.load(open('C:/Users/lydia/OneDrive/Escritorio/Proyecto final_fraude/src/modelos/my_model.pkl', 'rb'))

        # 4. Make predictions using the model and transformed data
        y_pred = my_model.predict(X_test_pca)

        # Print the prediction
        st.write("Prediction (y_pred):")
        st.write(y_pred)

        # Get the prediction label
        prediction_label = "It's a fraudulent transaction" if y_pred[0] == 1 else "It's a safe transaction"

        # Show the prediction result to the user
        st.write("Prediction Result:", prediction_label)

我尝试了不同的方法,在"if submitted:"之后注释整个代码,以检查是否可以打印"谢谢"之类的内容,但没有成功。

英文:

I'm building a Streamlit app in order to make fraud predictions. The idea is that when the user inputs the requested information, the app shows the if the transaction is a fraud or not.However, every time I try it, it does not show me any predictions, but it returns to the main page instead. Below you can see my code :

`if col2.button('Entrada manual de datos'):
# Dentro del contexto del formulario
with st.form('Entrada manual de datos'):
# Selección del día de la transacción
day = st.slider('Día de la transacción', 1, 31)

    # Caja de entrada para números
hour = st.slider('Hora de la transacción', 1, 24)
# Caja de entrada para cantidad
amount = st.number_input('Cantidad de la transacción', min_value=1)
# Caja de entrada para retirada de fondos
type_CASH_OUT = st.radio("¿Es una retirada de fondos?", ('Sí', 'No'))
# Caja de entrada para transferencias
type_TRANSFER = st.radio("¿Es una transferencia?", ('Sí', 'No'))
# Caja de entrada para quien inicia la transacción
nameorig_C = st.radio("¿Quién origina la transacción?", ('Cliente', 'Comercio'))
# Caja de entrada para beneficiario
namedest_C = st.radio("¿El beneficiario de la transacción es otro cliente?", ('Sí', 'No'))
# Caja de entrada para beneficiario
namedest_M = st.radio("¿El beneficiario de la transacción es un comercio?", ('Sí', 'No'))
submitted = st.form_submit_button("Submit")
if submitted:
X_test = pd.DataFrame({
'day': [day],
'hour': [hour],
'amount': [amount],
'type_CASH_OUT': [type_CASH_OUT],
'type_TRANSFER': [type_TRANSFER],
'nameorig_C': [nameorig_C],
'namedest_C': [namedest_C],
'namedest_M': [namedest_M]
})
# Imprimir los datos de prueba
st.write("Datos de prueba:")
st.write(X_test)
# 2. Realizar transformaciones de los datos
# Cargamos el PCA y el scaler
ruta_pca = 'C:/Users/lydia/OneDrive/Escritorio/Proyecto final_fraude/src/modelos/pca.pkl'
ruta_scaler = 'C:/Users/lydia/OneDrive/Escritorio/Proyecto final_fraude/src/modelos/scaler.pkl'
# Escalamos
scaler = pickle.load(open(ruta_scaler, 'rb'))
scaled_X_test = scaler.transform(X_test)
# PCA
pca = pickle.load(open(ruta_pca, 'rb'))
X_test_pca = pd.DataFrame(pca.transform(scaled_X_test), columns=['PC1', 'PC2', 'PC3', 'PC4', 'PC5'])
# Imprimir los datos transformados
st.write("Datos transformados (X_test_pca):")
st.write(X_test_pca)
# 3. Cargar el modelo y otros objetos relacionados
my_model = pickle.load(open('C:/Users/lydia/OneDrive/Escritorio/Proyecto final_fraude/src/modelos/my_model.pkl', 'rb'))
# 4. Realizar predicción utilizando el modelo y los datos transformados
y_pred = my_model.predict(X_test_pca)
# Imprimir la predicción
st.write("Predicción (y_pred):")
st.write(y_pred)
# Obtener la etiqueta de predicción
prediction_label = "Es una transacción fraudulenta" if y_pred[0] == 1 else "Es una transacción segura"
# Mostrar el resultado de la predicción al usuario
st.write("Resultado de la predicción:", prediction_label)`

I've tried different to comment the whole code after " if submitted:" to check if it could print like "thank you", but it couldn't.

答案1

得分: 1

根据我对你的代码的猜测,submitted 对象在一个代码块中被定义(因为代码行有缩进),是吗?
如果是这样的话,你需要使用 session_state

尝试替换:

    submitted = st.form_submit_button("Submit")
if submitted:

为:

    st.session_state["submitted"] = st.form_submit_button("Submit")
if st.session_state["submitted"]:
英文:

From what I can guess in your code, submitted object is defined in a block (as lines are indented), right ?
If that's the case, you need to use session_state.

Try to replace:

    submitted = st.form_submit_button("Submit")
if submitted:

by:

    st.session_state["submitted"] = st.form_submit_button("Submit")
if st.session_state["submitted"]:

huangapple
  • 本文由 发表于 2023年7月20日 21:43:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/76730526.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定