| |
|
|
| import streamlit as st |
| import pandas as pd |
| import joblib |
| from catboost import CatBoostClassifier |
|
|
| st.set_page_config( |
| page_title="Academic Success Classification", |
| page_icon="🎓", |
| layout="centered" |
| ) |
|
|
| st.title("🎓 Academic Success Classification / Akademik Başarı Sınıflandırma") |
|
|
| st.write(""" |
| Bu uygulama; öğrencinin demografik bilgileri, akademik performansı ve ekonomik göstergeleri kullanarak |
| **Mezun Olma (Graduate)**, **Eğitime Devam Etme (Enrolled)** veya |
| **Okulu Bırakma Riski (Dropout)** durumlarından hangisine daha yakın olduğunu |
| makine öğrenmesi modeli ile tahmin eder. |
| |
| This application uses a student's demographic information, academic performance, |
| and socioeconomic indicators to predict whether the student is most likely to |
| **Graduate**, **Remain Enrolled**, or **Drop Out**. |
| """) |
|
|
| model = CatBoostClassifier() |
| model.load_model("src/academic_success_model.cbm") |
|
|
| feature_columns = joblib.load("src/feature_columns.pkl") |
| reverse_target_map = joblib.load("src/reverse_target_map.pkl") |
|
|
| marital_status = st.number_input("Marital Status / Medeni Durum", min_value=1, max_value=6, value=1) |
| application_mode = st.number_input("Application Mode / Başvuru Şekli", min_value=1, max_value=60, value=1) |
| application_order = st.number_input("Application Order / Başvuru Sırası", min_value=0, max_value=10, value=1) |
| course = st.number_input("Course / Program", min_value=1, max_value=9999, value=9500) |
| daytime_evening_attendance = st.number_input("Daytime/Evening Attendance / Eğitim Zamanı", min_value=0, max_value=1, value=1) |
| previous_qualification = st.number_input("Previous Qualification / Önceki Eğitim", min_value=1, max_value=50, value=1) |
| previous_qualification_grade = st.number_input("Previous Qualification Grade / Önceki Eğitim Notu", min_value=0.0, max_value=200.0, value=130.0) |
| nationality = st.number_input("Nationality / Uyruk", min_value=1, max_value=200, value=1) |
| mothers_qualification = st.number_input("Mother's Qualification / Anne Eğitim Durumu", min_value=1, max_value=50, value=1) |
| fathers_qualification = st.number_input("Father's Qualification / Baba Eğitim Durumu", min_value=1, max_value=50, value=1) |
| mothers_occupation = st.number_input("Mother's Occupation / Anne Mesleği", min_value=0, max_value=200, value=1) |
| fathers_occupation = st.number_input("Father's Occupation / Baba Mesleği", min_value=0, max_value=200, value=1) |
|
|
| admission_grade = st.number_input("Admission Grade / Kabul Notu", min_value=0.0, max_value=200.0, value=130.0) |
| displaced = st.selectbox("Displaced / Yerinden Edilmiş", [0, 1]) |
| educational_special_needs = st.selectbox("Educational Special Needs / Özel Eğitim İhtiyacı", [0, 1]) |
| debtor = st.selectbox("Debtor / Borçlu", [0, 1]) |
| tuition_fees_up_to_date = st.selectbox("Tuition Fees Up to Date / Harç Ödemesi Güncel", [0, 1]) |
| gender = st.selectbox("Gender / Cinsiyet", [0, 1]) |
| scholarship_holder = st.selectbox("Scholarship Holder / Burslu", [0, 1]) |
| age_at_enrollment = st.number_input("Age at Enrollment / Kayıt Yaşı", min_value=15, max_value=80, value=20) |
| international = st.selectbox("International / Uluslararası Öğrenci", [0, 1]) |
|
|
| cu1_credited = st.number_input("1st Sem Credited Units", min_value=0, max_value=30, value=0) |
| cu1_enrolled = st.number_input("1st Sem Enrolled Units", min_value=0, max_value=30, value=6) |
| cu1_evaluations = st.number_input("1st Sem Evaluations", min_value=0, max_value=50, value=6) |
| cu1_approved = st.number_input("1st Sem Approved Units", min_value=0, max_value=30, value=5) |
| cu1_grade = st.number_input("1st Sem Grade", min_value=0.0, max_value=20.0, value=12.0) |
| cu1_without_evaluations = st.number_input("1st Sem Without Evaluations", min_value=0, max_value=30, value=0) |
|
|
| cu2_credited = st.number_input("2nd Sem Credited Units", min_value=0, max_value=30, value=0) |
| cu2_enrolled = st.number_input("2nd Sem Enrolled Units", min_value=0, max_value=30, value=6) |
| cu2_evaluations = st.number_input("2nd Sem Evaluations", min_value=0, max_value=50, value=6) |
| cu2_approved = st.number_input("2nd Sem Approved Units", min_value=0, max_value=30, value=5) |
| cu2_grade = st.number_input("2nd Sem Grade", min_value=0.0, max_value=20.0, value=12.0) |
| cu2_without_evaluations = st.number_input("2nd Sem Without Evaluations", min_value=0, max_value=30, value=0) |
|
|
| unemployment_rate = st.number_input("Unemployment Rate / İşsizlik Oranı", min_value=0.0, max_value=30.0, value=10.0) |
| inflation_rate = st.number_input("Inflation Rate / Enflasyon Oranı", min_value=-5.0, max_value=20.0, value=1.0) |
| gdp = st.number_input("GDP / GSYH", min_value=-10.0, max_value=10.0, value=1.0) |
|
|
| academic_success = cu1_grade + cu2_grade |
| total_approved = cu1_approved + cu2_approved |
| approval_rate = total_approved / (cu1_enrolled + cu2_enrolled + 1) |
| performance_change = cu2_grade - cu1_grade |
| evaluation_efficiency = total_approved / (cu1_evaluations + cu2_evaluations + 1) |
|
|
| input_df = pd.DataFrame({ |
| "Marital status": [marital_status], |
| "Application mode": [application_mode], |
| "Application order": [application_order], |
| "Course": [course], |
| "Daytime/evening attendance": [daytime_evening_attendance], |
| "Previous qualification": [previous_qualification], |
| "Previous qualification (grade)": [previous_qualification_grade], |
| "Nacionality": [nationality], |
| "Mother's qualification": [mothers_qualification], |
| "Father's qualification": [fathers_qualification], |
| "Mother's occupation": [mothers_occupation], |
| "Father's occupation": [fathers_occupation], |
| "Admission grade": [admission_grade], |
| "Displaced": [displaced], |
| "Educational special needs": [educational_special_needs], |
| "Debtor": [debtor], |
| "Tuition fees up to date": [tuition_fees_up_to_date], |
| "Gender": [gender], |
| "Scholarship holder": [scholarship_holder], |
| "Age at enrollment": [age_at_enrollment], |
| "International": [international], |
| "Curricular units 1st sem (credited)": [cu1_credited], |
| "Curricular units 1st sem (enrolled)": [cu1_enrolled], |
| "Curricular units 1st sem (evaluations)": [cu1_evaluations], |
| "Curricular units 1st sem (approved)": [cu1_approved], |
| "Curricular units 1st sem (grade)": [cu1_grade], |
| "Curricular units 1st sem (without evaluations)": [cu1_without_evaluations], |
| "Curricular units 2nd sem (credited)": [cu2_credited], |
| "Curricular units 2nd sem (enrolled)": [cu2_enrolled], |
| "Curricular units 2nd sem (evaluations)": [cu2_evaluations], |
| "Curricular units 2nd sem (approved)": [cu2_approved], |
| "Curricular units 2nd sem (grade)": [cu2_grade], |
| "Curricular units 2nd sem (without evaluations)": [cu2_without_evaluations], |
| "Unemployment rate": [unemployment_rate], |
| "Inflation rate": [inflation_rate], |
| "GDP": [gdp], |
| "academic_success": [academic_success], |
| "total_approved": [total_approved], |
| "approval_rate": [approval_rate], |
| "performance_change": [performance_change], |
| "evaluation_efficiency": [evaluation_efficiency] |
| }) |
|
|
| input_df = input_df[feature_columns] |
|
|
| if st.button("Classify Academic Outcome / Akademik Durumu Sınıflandır"): |
|
|
| prediction_code = int(model.predict(input_df)[0][0]) |
| prediction = reverse_target_map[prediction_code] |
|
|
| prediction_tr = { |
| "Graduate": "Mezun Olur", |
| "Enrolled": "Eğitimine Devam Eder", |
| "Dropout": "Okulu Bırakma Riski" |
| }[prediction] |
|
|
| if prediction == "Graduate": |
| st.success(f"🎓 Predicted Academic Outcome: {prediction}") |
| st.success(f"🎓 Tahmini Akademik Durum: {prediction_tr}") |
|
|
| elif prediction == "Enrolled": |
| st.info(f"📚 Predicted Academic Outcome: {prediction}") |
| st.info(f"📚 Tahmini Akademik Durum: {prediction_tr}") |
|
|
| else: |
| st.error(f"⚠️ Predicted Academic Outcome: {prediction}") |
| st.error(f"⚠️ Tahmini Akademik Durum: {prediction_tr}") |