From 70641ebca48a0a4c681b4288380ba62104140f79 Mon Sep 17 00:00:00 2001 From: "hugo.pradier2" Date: Wed, 19 Jun 2024 08:18:14 +0200 Subject: [PATCH 1/4] debut prediction --- .gitignore | 1 + frontend/pages/prediction.py | 56 ++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 frontend/pages/prediction.py diff --git a/.gitignore b/.gitignore index bee8a64..9f7550b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ __pycache__ +.venv diff --git a/frontend/pages/prediction.py b/frontend/pages/prediction.py new file mode 100644 index 0000000..25c074e --- /dev/null +++ b/frontend/pages/prediction.py @@ -0,0 +1,56 @@ +import streamlit as st +from sklearn.ensemble import RandomForestClassifier +from sklearn.ensemble import RandomForestRegressor +from sklearn.linear_model import LogisticRegression +from sklearn.linear_model import LinearRegression +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score +from sklearn import datasets +from sklearn.impute import SimpleImputer # Add this line +import pandas as pd +import numpy as np +st.header("Prediction") + +if "data" in st.session_state: + data = st.session_state.data + + with st.form("my_form"): + header = st.columns([2,1,2]) + header[0].subheader("Model") + header[1].subheader("Data Name") + + row1 = st.columns([2,1,2]) + model = row1[0].selectbox("", ["Random Forest Classifier", "Random Forest Regressor", "Logistic Regression", "Linear Regression"]) + data_name = row1[1].selectbox("", data.columns) + + st.form_submit_button('launch') + + if model == "Random Forest Classifier": + model = RandomForestClassifier() + elif model == "Random Forest Regressor": + model = RandomForestRegressor() + elif model == "Logistic Regression": + model = LogisticRegression() + elif model == "Linear Regression": + model = LinearRegression() + + x = data.drop(data_name, axis=1) + y = data[data_name] + + # Convert categorical data to numerical values + x = pd.get_dummies(x) + + # Handle missing values + imputer = SimpleImputer() + x = imputer.fit_transform(x) + x = pd.get_dummies(x) + + x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) + model.fit(x_train, y_train) + y_pred = model.predict(x_test) + if model == "Random Forest Classifier": + st.write("Accuracy: ", accuracy_score(y_test, y_pred)) + elif model == "Random Forest Regressor" or model == "Logistic Regression" or model == "Linear Regression": + st.write("Mean Squared Error: ", np.mean((y_pred - y_test) ** 2)) +else: + st.error("file not loaded") -- 2.36.3 From a914c3f8f9620addac469f35620ed4e33d863225 Mon Sep 17 00:00:00 2001 From: "hugo.pradier2" Date: Wed, 19 Jun 2024 09:50:28 +0200 Subject: [PATCH 2/4] prediction de regression terminee --- frontend/pages/prediction.py | 56 --------------------- frontend/pages/prediction_classification.py | 41 +++++++++++++++ frontend/pages/prediction_regression.py | 28 +++++++++++ 3 files changed, 69 insertions(+), 56 deletions(-) delete mode 100644 frontend/pages/prediction.py create mode 100644 frontend/pages/prediction_classification.py create mode 100644 frontend/pages/prediction_regression.py diff --git a/frontend/pages/prediction.py b/frontend/pages/prediction.py deleted file mode 100644 index 25c074e..0000000 --- a/frontend/pages/prediction.py +++ /dev/null @@ -1,56 +0,0 @@ -import streamlit as st -from sklearn.ensemble import RandomForestClassifier -from sklearn.ensemble import RandomForestRegressor -from sklearn.linear_model import LogisticRegression -from sklearn.linear_model import LinearRegression -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score -from sklearn import datasets -from sklearn.impute import SimpleImputer # Add this line -import pandas as pd -import numpy as np -st.header("Prediction") - -if "data" in st.session_state: - data = st.session_state.data - - with st.form("my_form"): - header = st.columns([2,1,2]) - header[0].subheader("Model") - header[1].subheader("Data Name") - - row1 = st.columns([2,1,2]) - model = row1[0].selectbox("", ["Random Forest Classifier", "Random Forest Regressor", "Logistic Regression", "Linear Regression"]) - data_name = row1[1].selectbox("", data.columns) - - st.form_submit_button('launch') - - if model == "Random Forest Classifier": - model = RandomForestClassifier() - elif model == "Random Forest Regressor": - model = RandomForestRegressor() - elif model == "Logistic Regression": - model = LogisticRegression() - elif model == "Linear Regression": - model = LinearRegression() - - x = data.drop(data_name, axis=1) - y = data[data_name] - - # Convert categorical data to numerical values - x = pd.get_dummies(x) - - # Handle missing values - imputer = SimpleImputer() - x = imputer.fit_transform(x) - x = pd.get_dummies(x) - - x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) - model.fit(x_train, y_train) - y_pred = model.predict(x_test) - if model == "Random Forest Classifier": - st.write("Accuracy: ", accuracy_score(y_test, y_pred)) - elif model == "Random Forest Regressor" or model == "Logistic Regression" or model == "Linear Regression": - st.write("Mean Squared Error: ", np.mean((y_pred - y_test) ** 2)) -else: - st.error("file not loaded") diff --git a/frontend/pages/prediction_classification.py b/frontend/pages/prediction_classification.py new file mode 100644 index 0000000..8d368d4 --- /dev/null +++ b/frontend/pages/prediction_classification.py @@ -0,0 +1,41 @@ +import streamlit as st +from sklearn.ensemble import RandomForestClassifier +from sklearn.preprocessing import LabelEncoder +import pandas as pd + +st.header("Prediction: Classification") + +if "data" in st.session_state: + data = st.session_state.data + + with st.form("classification_form"): + st.subheader("Random Forest Parameters") + + 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) + + st.subheader("Enter values for prediction") + + 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] + + prediction = model.predict([pred_values_encoded]) + + prediction_decoded = le.inverse_transform(prediction) + + st.write("Prediction:", prediction_decoded[0]) +else: + st.error("File not loaded") diff --git a/frontend/pages/prediction_regression.py b/frontend/pages/prediction_regression.py new file mode 100644 index 0000000..c6a6a38 --- /dev/null +++ b/frontend/pages/prediction_regression.py @@ -0,0 +1,28 @@ +import streamlit as st +from sklearn.linear_model import LinearRegression + +st.header("Prediction: Regression") + +if "data" in st.session_state: + data = st.session_state.data + + with st.form("regression_form"): + st.subheader("Linear Regression Parameters") + data_name = st.multiselect("Features", data.select_dtypes(include="number").columns) + target_name = st.selectbox("Target", data.select_dtypes(include="number").columns) + st.form_submit_button('Train and Predict') + + if data_name and target_name: + X = data[data_name] + y = data[target_name] + + model = LinearRegression() + model.fit(X, y) + + st.subheader("Enter values for prediction") + pred_values = [st.number_input(f"Value for {feature}", value=0.0) for feature in data_name] + prediction = model.predict([pred_values]) + + st.write("Prediction:", prediction[0]) +else: + st.error("File not loaded") -- 2.36.3 From 2d1c867bed07d10adda8fd5cc00aad0db39c87c2 Mon Sep 17 00:00:00 2001 From: "hugo.pradier2" Date: Fri, 21 Jun 2024 14:15:23 +0200 Subject: [PATCH 3/4] ajout prediction classification --- frontend/pages/prediction_classification.py | 70 ++++++++++++++------- 1 file changed, 46 insertions(+), 24 deletions(-) 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") -- 2.36.3 From 089cc660426b17c04e561f333f07934244b71a7a Mon Sep 17 00:00:00 2001 From: "hugo.pradier2" Date: Fri, 21 Jun 2024 14:51:06 +0200 Subject: [PATCH 4/4] correctifs --- frontend/pages/prediction_classification.py | 3 ++- frontend/pages/prediction_regression.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/pages/prediction_classification.py b/frontend/pages/prediction_classification.py index dc70175..5aaf52f 100644 --- a/frontend/pages/prediction_classification.py +++ b/frontend/pages/prediction_classification.py @@ -3,6 +3,7 @@ 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") @@ -53,7 +54,7 @@ if "data" in st.session_state: value = st.number_input(f"Value for {feature}", value=0.0) pred_values.append(value) - prediction = model.predict([pred_values]) + prediction = model.predict(pd.DataFrame([pred_values], columns=data_name)) if target_name in label_encoders: prediction = label_encoders[target_name].inverse_transform(prediction) diff --git a/frontend/pages/prediction_regression.py b/frontend/pages/prediction_regression.py index c6a6a38..377274e 100644 --- a/frontend/pages/prediction_regression.py +++ b/frontend/pages/prediction_regression.py @@ -1,5 +1,6 @@ import streamlit as st from sklearn.linear_model import LinearRegression +import pandas as pd st.header("Prediction: Regression") @@ -21,7 +22,7 @@ if "data" in st.session_state: st.subheader("Enter values for prediction") pred_values = [st.number_input(f"Value for {feature}", value=0.0) for feature in data_name] - prediction = model.predict([pred_values]) + prediction = model.predict(pd.DataFrame([pred_values], columns=data_name)) st.write("Prediction:", prediction[0]) else: -- 2.36.3