Spaces:
Sleeping
Sleeping
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() | |