EAV123's picture
Update app.py
1e2e075 verified
import streamlit as st
from tensorflow.keras.models import load_model
import pickle
import numpy as np
import os
import google.generativeai as genai
# Configure the generative AI with the API key
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
# Load the saved models
with open('rf_model.pkl', 'rb') as file:
rf_model = pickle.load(file)
deep_model = load_model('deep_model.h5')
# Define the function to make predictions using the RandomForestRegressor model
def make_rf_prediction(model, input_data):
prediction = model.predict(input_data)
return prediction
# Define the function to make predictions using the deep learning model
def make_deep_prediction(model, input_data):
prediction = model.predict(input_data).flatten()
return prediction
# Define the function to calculate GPA
def calculate_gpa(total_score):
if total_score >= 70:
return 'A (5 points)', total_score
elif total_score >= 60:
return 'B (4 points)', total_score
elif total_score >= 50:
return 'C (3 points)', total_score
elif total_score >= 45:
return 'D (2 points)', total_score
else:
return 'F (0 points)', total_score
# Function to generate grade-based recommendations using Gemini API
def generate_grade_recommendations(grade):
if grade >= 70:
grade_desc = "good grade"
else:
grade_desc = "bad grade"
input_prompt = f"The student has a {grade_desc}. What recommendations do you have for them?"
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content(input_prompt, generation_config=genai.types.GenerationConfig(max_output_tokens=400))
return response.text
# Create the Streamlit app
def main():
# Set page title and configure layout
st.set_page_config(page_title="Exam Score Prediction", layout="wide")
# Add a title and description
st.title("Exam Score Prediction")
st.markdown(
"This app predicts exam scores based on input features such as level, course units, attendance, mid-semester score, and assignments."
)
# Create input fields
col1, col2 = st.columns(2)
with col1:
level = st.number_input("Level", min_value=200, max_value=400, step=1)
course_units = st.number_input("Course Units", min_value=1, max_value=4, step=1)
with col2:
attendance = st.slider("Attendance", min_value=1, max_value=10, step=1)
mid_semester = st.slider("Mid Semester Score", min_value=1, max_value=20, step=1)
assignments = st.slider("Assignments", min_value=1, max_value=10, step=1)
# Make prediction
if st.button("Predict Exam Score"):
# Create input data
input_data = np.array([[level, course_units, attendance, mid_semester, assignments]])
# Make predictions using both models
rf_prediction = make_rf_prediction(rf_model, input_data)
deep_prediction = make_deep_prediction(deep_model, input_data)
# Combine predictions
combined_prediction = (rf_prediction + deep_prediction) / 2
# Calculate total score
total_score = attendance + mid_semester + assignments + combined_prediction[0]
# Ensure total score does not exceed 100
total_score = min(total_score, 100)
st.write(f"Predicted Exam Score: {combined_prediction[0]:.2f}")
st.write(f"Total Score: {total_score:.2f}")
# Calculate GPA
gpa, numeric_score = calculate_gpa(total_score)
st.write(f"Predicted GPA: {gpa}")
# Generate recommendations based on GPA
recommendations = generate_grade_recommendations(numeric_score)
st.subheader("Recommendations Based on Grade:")
st.write(recommendations)
if __name__ == '__main__':
main()