namngo commited on
Commit
5baa641
·
verified ·
1 Parent(s): aa7e20f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -79
app.py CHANGED
@@ -2,8 +2,9 @@ import streamlit as st
2
  import numpy as np
3
  import joblib
4
 
5
- # ===== Load model =====
6
- model = joblib.load("TomekLinks_rf_model.pkl")
 
7
 
8
  # ===== Setup page =====
9
  st.set_page_config(page_title="Dự đoán tốt nghiệp đúng hạn", page_icon="🎓", layout="wide")
@@ -34,18 +35,23 @@ st.markdown("<h1 style='text-align: center; color: #003366;'>🎓 DỰ BÁO KH
34
  st.markdown("<h4 style='text-align: center; color: #666;'>Áp dụng cho sinh viên năm 3</h4>", unsafe_allow_html=True)
35
  st.write("---")
36
 
37
- # ===== BỘ DỤ MẪU =====
 
 
 
 
 
38
  sample_cntt_example = {
39
  "name": "Nguyễn Văn A",
40
  "student_id": "10117367",
41
  "major": "Công nghệ thông tin",
42
  "semester_data": [
43
- 0, 0, 0, 0, 17, 7, 7, 8.73, 0,
44
- 0, 0, 0, 0, 17, 7, 7, 8.19, 0,
45
- 0, 0, 0, 0, 17, 7, 7, 7.90, 0,
46
- 0, 0, 0, 0, 17, 7, 7, 8.19, 0,
47
- 0, 0, 0, 0, 19, 7, 6, 8.18, 0,
48
- 0, 0, 5, 2, 19, 7, 5, 7.10, 1
49
  ]
50
  }
51
 
@@ -54,94 +60,80 @@ sample_kinhte_example = {
54
  "student_id": "11418092",
55
  "major": "Kinh tế",
56
  "semester_data": [
57
- 0, 0, 0, 0, 17, 7, 7, 7.64, 1,
58
- 0, 0, 0, 0, 17, 7, 7, 7.19, 1,
59
- 0, 0, 0, 0, 17, 7, 7, 6.94, 1,
60
- 0, 0, 0, 0, 17, 7, 7, 7.19, 1,
61
- 0, 0, 0, 0, 19, 7, 5, 7.65, 1,
62
- 0, 0, 7, 3, 19, 7, 4, 7.49, 1
63
  ]
64
  }
65
 
66
- # ===== THÔNG TIN NHÂN =====
67
- with st.container():
68
- sample_option = st.selectbox(
69
- "📝 Chọn dụ:",
70
- ["Không dụ","Dùng ví dụ mẫu ngành Công nghệ thông tin", "Dùng ví dụ mẫu ngành Kinh tế"]
71
- )
72
-
73
- if sample_option == "Dùng dụ mẫu ngành Công nghệ thông tin":
74
- name = st.text_input("👤 Họ và tên", value=sample_cntt_example["name"])
75
- student_id = st.text_input("🎓 Mã sinh viên", value=sample_cntt_example["student_id"])
76
- major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"], index=0)
77
- elif sample_option == "Dùng dụ mẫu ngành Kinh tế":
78
- name = st.text_input("👤 Họ và tên", value=sample_kinhte_example["name"])
79
- student_id = st.text_input("🎓 Mã sinh viên", value=sample_kinhte_example["student_id"])
80
- major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"], index=1)
81
- else:
82
- name = st.text_input("👤 Họ và tên")
83
- student_id = st.text_input("🎓 Mã sinh viên")
84
- major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"])
85
 
86
  st.write("---")
87
 
88
- # ===== Input Semester Info =====
89
  def input_semester(semester_label, default_values=None):
90
  with st.expander(f"📖 {semester_label}", expanded=True):
91
  col1, col2 = st.columns(2)
92
-
93
  with col1:
94
- somon0thi = st.number_input("Số môn không thi", min_value=0, value=default_values[0] if default_values else 0, key=f"somon0thi_{semester_label}")
95
- sotc0thi = st.number_input("Số tín chỉ không thi", min_value=0, value=default_values[1] if default_values else 0, key=f"sotc0thi_{semester_label}")
96
- sotcno = st.number_input("Số tín chỉ nợ", min_value=0, value=default_values[2] if default_values else 0, key=f"sotcno_{semester_label}")
97
- mhno = st.number_input("Số môn không đạt", min_value=0, value=default_values[3] if default_values else 0, key=f"mhno_{semester_label}")
98
-
99
  with col2:
100
- TCHK = st.number_input("Tổng số tín chỉ", min_value=0, value=default_values[4] if default_values else 0, key=f"TCHK_{semester_label}")
101
- smhk = st.number_input("Tổng số môn học kỳ", min_value=0, value=default_values[5] if default_values else 0, key=f"smhk_{semester_label}")
102
- mhpass = st.number_input("Số môn đạt", min_value=0, value=default_values[6] if default_values else 0, key=f"mhpass_{semester_label}")
103
- TBCHK = st.number_input("GPA", min_value=0.0, max_value=10.0, value=default_values[7] if default_values else 0.0, step=0.01, key=f"TBCHK_{semester_label}")
104
-
105
- xep_loai_option = {
106
- 'Giỏi': 0,
107
- 'Khá': 1,
108
- 'TB Khá': 2,
109
- 'Kém': 3,
110
- 'Xuất sắc': 4,
111
- 'Trung Bình': 5,
112
- 'Yếu': 6
113
- }
114
- xep_loai_selected = st.selectbox("Xếp loại", list(xep_loai_option.keys()), index=default_values[8] if default_values else 0, key=f"xep_loai_{semester_label}")
115
- xep_loai_value = xep_loai_option[xep_loai_selected]
116
-
117
- return [somon0thi, sotc0thi, sotcno, mhno, TCHK, smhk, mhpass, TBCHK, xep_loai_value]
118
-
119
- # ===== Collect Data =====
120
  data = []
121
  semesters = ["HỌC KỲ I", "HỌC KỲ II", "HỌC KỲ III", "HỌC KỲ IV", "HỌC KỲ V", "HỌC KỲ VI"]
122
 
123
- for idx, sem in enumerate(semesters):
124
- if sample_option == "Dùng dụ mẫu ngành Công nghệ thông tin":
125
- data += input_semester(sem, sample_cntt_example["semester_data"][idx*9:(idx+1)*9])
126
- elif sample_option == "Dùng dụ mẫu ngành Kinh tế":
127
- data += input_semester(sem, sample_kinhte_example["semester_data"][idx*9:(idx+1)*9])
128
- else:
129
- data += input_semester(sem)
130
-
131
- # ===== Prepare Data for Prediction =====
132
- nganh = 0 if major == "Công nghệ thông tin" else 1
133
- final_features = np.array(data + [nganh]).reshape(1, -1)
134
-
135
- # ===== Predict Button =====
136
- st.write("")
 
 
 
 
137
  if st.button("🎯 DỰ BÁO"):
138
- prediction = model.predict(final_features)
 
 
 
139
 
140
  if prediction[0] == 1:
141
  st.success(f"🎉 Chúc mừng bạn {name} - {major}! Bạn có khả năng tốt nghiệp đúng hạn!")
142
  st.balloons()
143
  else:
144
  st.error(f"⚠️ Bạn {name} - {major} cần cố gắng hơn! Có nguy cơ trễ hạn.")
145
- st.snow()
146
-
147
-
 
2
  import numpy as np
3
  import joblib
4
 
5
+ # ===== Load models =====
6
+ model_full = joblib.load("TomekLinks_rf_model.pkl")
7
+ model_important = joblib.load("random_forest_model_importainfeature.pkl")
8
 
9
  # ===== Setup page =====
10
  st.set_page_config(page_title="Dự đoán tốt nghiệp đúng hạn", page_icon="🎓", layout="wide")
 
35
  st.markdown("<h4 style='text-align: center; color: #666;'>Áp dụng cho sinh viên năm 3</h4>", unsafe_allow_html=True)
36
  st.write("---")
37
 
38
+ # ===== SIDEBAR: chọn dụ và mô hình =====
39
+ model_type = st.sidebar.radio("🧠 Chọn mô hình dự báo:", ["Dùng toàn bộ dữ liệu", "Dùng mô hình đơn giản (các đặc trưng quan trọng)"])
40
+
41
+ sample_option = st.sidebar.selectbox("📝 Chọn ví dụ:", ["Không ví dụ", "Dùng ví dụ mẫu ngành Công nghệ thông tin", "Dùng ví dụ mẫu ngành Kinh tế"])
42
+
43
+ # ===== Ví dụ mẫu =====
44
  sample_cntt_example = {
45
  "name": "Nguyễn Văn A",
46
  "student_id": "10117367",
47
  "major": "Công nghệ thông tin",
48
  "semester_data": [
49
+ 0, 0, 0, 0, 17, 7, 7, 8.73, 0,
50
+ 0, 0, 0, 0, 17, 7, 7, 8.19, 0,
51
+ 0, 0, 0, 0, 17, 7, 7, 7.90, 0,
52
+ 0, 0, 0, 0, 17, 7, 7, 8.19, 0,
53
+ 0, 0, 0, 0, 19, 7, 6, 8.18, 0,
54
+ 0, 0, 5, 2, 19, 7, 5, 7.10, 1
55
  ]
56
  }
57
 
 
60
  "student_id": "11418092",
61
  "major": "Kinh tế",
62
  "semester_data": [
63
+ 0, 0, 0, 0, 17, 7, 7, 7.64, 1,
64
+ 0, 0, 0, 0, 17, 7, 7, 7.19, 1,
65
+ 0, 0, 0, 0, 17, 7, 7, 6.94, 1,
66
+ 0, 0, 0, 0, 17, 7, 7, 7.19, 1,
67
+ 0, 0, 0, 0, 19, 7, 5, 7.65, 1,
68
+ 0, 0, 7, 3, 19, 7, 4, 7.49, 1
69
  ]
70
  }
71
 
72
+ # ===== Thông tin nhân =====
73
+ if sample_option == "Dùng ví dụ mẫu ngành Công nghệ thông tin":
74
+ name = st.text_input("👤 Họ và tên", value=sample_cntt_example["name"])
75
+ student_id = st.text_input("🎓 sinh viên", value=sample_cntt_example["student_id"])
76
+ major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"], index=0)
77
+ elif sample_option == "Dùng ví dụ mẫu ngành Kinh tế":
78
+ name = st.text_input("👤 Họ và tên", value=sample_kinhte_example["name"])
79
+ student_id = st.text_input("🎓 sinh viên", value=sample_kinhte_example["student_id"])
80
+ major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"], index=1)
81
+ else:
82
+ name = st.text_input("👤 Họ tên")
83
+ student_id = st.text_input("🎓 sinh viên")
84
+ major = st.selectbox("📚 Ngành học", ["Công nghệ thông tin", "Kinh tế"])
 
 
 
 
 
 
85
 
86
  st.write("---")
87
 
88
+ # ===== Hàm nhập liệu =====
89
  def input_semester(semester_label, default_values=None):
90
  with st.expander(f"📖 {semester_label}", expanded=True):
91
  col1, col2 = st.columns(2)
 
92
  with col1:
93
+ somon0thi = st.number_input("Số môn không thi", 0, value=default_values[0] if default_values else 0, key=f"sm0_{semester_label}")
94
+ sotc0thi = st.number_input("Số tín chỉ không thi", 0, value=default_values[1] if default_values else 0, key=f"tc0_{semester_label}")
95
+ sotcno = st.number_input("Số tín chỉ nợ", 0, value=default_values[2] if default_values else 0, key=f"tcno_{semester_label}")
96
+ mhno = st.number_input("Số môn không đạt", 0, value=default_values[3] if default_values else 0, key=f"mhno_{semester_label}")
97
+ sotc_qua = st.number_input("Số tín chỉ qua môn", 0, value=default_values[4] - default_values[2] if default_values else 0, key=f"tcqua_{semester_label}")
98
  with col2:
99
+ TCHK = st.number_input("Tổng tín chỉ học kỳ", 0, value=default_values[4] if default_values else 0, key=f"tchk_{semester_label}")
100
+ smhk = st.number_input("Số môn học kỳ", 0, value=default_values[5] if default_values else 0, key=f"smhk_{semester_label}")
101
+ mhpass = st.number_input("Số môn đạt", 0, value=default_values[6] if default_values else 0, key=f"mhpass_{semester_label}")
102
+ TBCHK = st.number_input("GPA", 0.0, 10.0, value=default_values[7] if default_values else 0.0, step=0.01, key=f"gpa_{semester_label}")
103
+ xep_loai_selected = st.selectbox("Xếp loại", list(range(7)), index=default_values[8] if default_values else 0, key=f"xeploai_{semester_label}")
104
+ return [somon0thi, sotc0thi, sotcno, mhno, TCHK, smhk, mhpass, TBCHK, xep_loai_selected, sotc_qua]
105
+
106
+ # ===== Giao diện theo mô hình =====
 
 
 
 
 
 
 
 
 
 
 
 
107
  data = []
108
  semesters = ["HỌC KỲ I", "HỌC KỲ II", "HỌC KỲ III", "HỌC KỲ IV", "HỌC KỲ V", "HỌC KỲ VI"]
109
 
110
+ if model_type == "Dùng toàn bộ dữ liệu":
111
+ st.subheader("🔢 Nhập thông tin học kỳ chi tiết")
112
+ for idx, sem in enumerate(semesters):
113
+ example_data = sample_cntt_example if "CNTT" in sample_option else sample_kinhte_example if "Kinh tế" in sample_option else None
114
+ default_values = example_data["semester_data"][idx*9:(idx+1)*9] if example_data else None
115
+ data += input_semester(sem, default_values)
116
+ nganh = 0 if major == "Công nghệ thông tin" else 1
117
+ final_features = np.array(data + [nganh]).reshape(1, -1)
118
+ else:
119
+ st.subheader(" Nhập thông tin rút gọn")
120
+ for idx, sem in enumerate(semesters):
121
+ example_data = sample_cntt_example if "CNTT" in sample_option else sample_kinhte_example if "Kinh tế" in sample_option else None
122
+ raw = example_data["semester_data"][idx*9:(idx+1)*9] if example_data else None
123
+ default_values = [raw[4], raw[2], raw[7]] if raw else None
124
+ data += input_important_features(sem, default_values)
125
+ final_features = np.array(data).reshape(1, -1)
126
+
127
+ # ===== Predict =====
128
  if st.button("🎯 DỰ BÁO"):
129
+ if model_type == "Dùng toàn bộ dữ liệu":
130
+ prediction = model_full.predict(final_features)
131
+ else:
132
+ prediction = model_important.predict(final_features)
133
 
134
  if prediction[0] == 1:
135
  st.success(f"🎉 Chúc mừng bạn {name} - {major}! Bạn có khả năng tốt nghiệp đúng hạn!")
136
  st.balloons()
137
  else:
138
  st.error(f"⚠️ Bạn {name} - {major} cần cố gắng hơn! Có nguy cơ trễ hạn.")
139
+ st.snow()