Dự đoán điểm số sinh viên là một ứng dụng thực tiễn giúp nhà trường đánh giá năng lực học tập, phát hiện sinh viên yếu cần hỗ trợ sớm. Mô hình học máy Linear Regression (hồi quy tuyến tính) có thể được dùng để dự đoán điểm trung bình hoặc điểm một môn cụ thể dựa trên các yếu tố như giới tính, tình trạng ôn tập, điểm các môn học khác,…
Trong bài viết này, bạn sẽ được hướng dẫn xây dựng một mô hình dự đoán điểm sinh viên bằng Python sử dụng thư viện scikit-learn. Toàn bộ quy trình từ chuẩn bị dữ liệu, huấn luyện, đánh giá đến dự đoán sẽ được trình bày chi tiết kèm mã nguồn theo từng file.
Tải dữ liệu và chuẩn bị dự án
Dữ liệu sử dụng trong bài là bộ “Students Performance in Exams” từ Kaggle.
Link tải:
https://www.kaggle.com/datasets/spscientist/students-performance-in-exams
Hướng dẫn sử dụng:
-
Đăng nhập vào Kaggle để tải file
StudentsPerformance.csv -
Tạo thư mục
data/trong dự án và đặt file CSV vào đó -
Cấu trúc thư mục ban đầu nên như sau:
student_score_project/ ├── data/ │ └── StudentsPerformance.csv ├── train.py ├── evaluate.py ├── predict.py
Đọc và tiền xử lý dữ liệu
Trước khi huấn luyện mô hình, bạn cần đọc dữ liệu từ file CSV và chuyển các dữ liệu dạng text (categorical) về dạng số để mô hình hiểu được.
File: train.py
import pandas as pd
# Đọc dữ liệu từ CSV
df = pd.read_csv('data/StudentsPerformance.csv')
# Chuyển đổi giới tính và tình trạng ôn tập sang số
df['gender'] = df['gender'].map({'female': 0, 'male': 1})
df['test preparation course'] = df['test preparation course'].map({'none': 0, 'completed': 1})
# Tính điểm trung bình từ 3 môn
df['average_score'] = df[['math score', 'reading score', 'writing score']].mean(axis=1)
# Chọn đặc trưng (X) và nhãn (y)
X = df[['gender', 'test preparation course', 'math score', 'reading score']]
y = df['average_score']
Trong bước này, bạn tạo biến X chứa các yếu tố ảnh hưởng đến điểm số, và y là điểm trung bình sẽ được dự đoán.
Huấn luyện mô hình Linear Regression
Sau khi đã có dữ liệu dạng số, bạn chia tập dữ liệu thành hai phần: training và testing. Sau đó, bạn sử dụng thuật toán Linear Regression để huấn luyện mô hình trên tập training.
File: train.py (đặt code dưới đây vào cuối file)
from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression import joblib # Chia tập train/test (80/20) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Tạo mô hình Linear Regression model = LinearRegression() # Huấn luyện mô hình model.fit(X_train, y_train) # Lưu mô hình để sử dụng sau joblib.dump(model, 'model_regression.pkl')
Sau khi chạy đoạn mã trên, mô hình sẽ được lưu lại trong file model_regression.pkl và có thể sử dụng lại ở các bước sau mà không cần huấn luyện lại.
Đánh giá mô hình sau huấn luyện
Bạn cần kiểm tra độ chính xác của mô hình bằng cách đo lường sai số và độ phù hợp của nó trên tập dữ liệu kiểm tra. Trong Linear Regression, các chỉ số thường dùng là Mean Squared Error (MSE) và R-squared (R2).
File: evaluate.py
import joblib
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import pandas as pd
# Đọc lại dữ liệu
df = pd.read_csv('data/StudentsPerformance.csv')
df['gender'] = df['gender'].map({'female': 0, 'male': 1})
df['test preparation course'] = df['test preparation course'].map({'none': 0, 'completed': 1})
df['average_score'] = df[['math score', 'reading score', 'writing score']].mean(axis=1)
X = df[['gender', 'test preparation course', 'math score', 'reading score']]
y = df['average_score']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Tải mô hình
model = joblib.load('model_regression.pkl')
# Dự đoán
y_pred = model.predict(X_test)
# Tính sai số và R2
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R2 Score: {r2:.2f}')
MSE càng thấp thì sai số càng nhỏ, R2 càng gần 1 thì mô hình càng chính xác.
Dự đoán điểm số cho sinh viên mới
Sau khi huấn luyện, bạn có thể dự đoán điểm trung bình cho một sinh viên mới với thông tin đầu vào.
File: predict.py
import joblib
import numpy as np
# Tải mô hình
model = joblib.load('model_regression.pkl')
# Nhập thông tin sinh viên mới: [gender, test_prep, math, reading]
# Ví dụ: male (1), đã ôn tập (1), điểm toán 75, đọc 80
new_data = np.array([[1, 1, 75, 80]])
# Dự đoán
predicted_score = model.predict(new_data)
print(f'Điểm trung bình dự đoán: {predicted_score[0]:.2f}')
Bạn có thể nhập nhiều dòng dữ liệu vào new_data để dự đoán cho nhiều sinh viên cùng lúc.
Phân tích trọng số các đặc trưng
Linear Regression cung cấp hệ số (trọng số) cho từng đặc trưng đầu vào, cho biết mức độ ảnh hưởng của từng yếu tố đến kết quả dự đoán.
File: train.py (đặt code dưới đây vào cuối file)
# In trọng số từng đặc trưng
print("Trọng số các yếu tố:")
for feature, coef in zip(X.columns, model.coef_):
print(f"{feature}: {coef:.2f}")
Bạn cũng có thể trực quan hóa bằng biểu đồ:

