diff --git a/frontend/pages/prediction_classification.py b/frontend/pages/prediction_classification.py index 8d368d4..dc70175 100644 --- a/frontend/pages/prediction_classification.py +++ b/frontend/pages/prediction_classification.py @@ -1,7 +1,8 @@ import streamlit as st -from sklearn.ensemble import RandomForestClassifier +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder -import pandas as pd st.header("Prediction: Classification") @@ -9,33 +10,54 @@ if "data" in st.session_state: data = st.session_state.data with st.form("classification_form"): - st.subheader("Random Forest Parameters") + st.subheader("Classification Parameters") + data_name = st.multiselect("Features", data.columns) + target_name = st.selectbox("Target", data.columns) + test_size = st.slider("Test Size", min_value=0.1, max_value=0.5, value=0.2, step=0.1) + st.form_submit_button('Train and Predict') + + if data_name and target_name: + X = data[data_name] + y = data[target_name] + + label_encoders = {} + for column in X.select_dtypes(include=['object']).columns: + le = LabelEncoder() + X[column] = le.fit_transform(X[column]) + label_encoders[column] = le - data_name = st.multiselect("Features", data.select_dtypes(include="object").columns, help="Sélectionnez les caractéristiques pour l'entraînement.") - target_name = st.selectbox("Target", data.columns, help="Sélectionnez la variable cible pour l'entraînement.") - - n_estimators = st.number_input("Number of estimators", step=1, min_value=1, value=100, help="Nombre d'arbres dans la forêt.") - max_depth = st.number_input("Max depth", step=1, min_value=1, value=10, help="Profondeur maximale des arbres.") - - submit_button = st.form_submit_button('Train and Predict') - - if submit_button and data_name and target_name: - le = LabelEncoder() - X = data[data_name].apply(le.fit_transform) - y = le.fit_transform(data[target_name]) - - model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, random_state=111) - model.fit(X, y) + if y.dtype == 'object': + le = LabelEncoder() + y = le.fit_transform(y) + label_encoders[target_name] = le - st.subheader("Enter values for prediction") + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=42) - pred_values = [st.selectbox(f"Value for {feature}", options=data[feature].unique(), key=f"value_{feature}") for feature in data_name] - pred_values_encoded = [le.transform([val])[0] for val in pred_values] + model = LogisticRegression() + model.fit(X_train, y_train) + y_pred = model.predict(X_test) + accuracy = accuracy_score(y_test, y_pred) - prediction = model.predict([pred_values_encoded]) + st.subheader("Model Accuracy") + st.write(f"Accuracy on test data: {accuracy:.2f}") - prediction_decoded = le.inverse_transform(prediction) + st.subheader("Enter values for prediction") + pred_values = [] + for feature in data_name: + if feature in label_encoders: + values = list(label_encoders[feature].classes_) + value = st.selectbox(f"Value for {feature}", values) + value_encoded = label_encoders[feature].transform([value])[0] + pred_values.append(value_encoded) + else: + value = st.number_input(f"Value for {feature}", value=0.0) + pred_values.append(value) + + prediction = model.predict([pred_values]) - st.write("Prediction:", prediction_decoded[0]) + if target_name in label_encoders: + prediction = label_encoders[target_name].inverse_transform(prediction) + + st.write("Prediction:", prediction[0]) else: st.error("File not loaded")