DEV Community

Ayas Hussein
Ayas Hussein

Posted on • Edited on

Building a Machine Learning Regression Model to Predict Student Grades with Python

In this tutorial, we’ll explore how to predict students' grades using Python. We’ll build a regression model, visualize data, and interpret the model's performance.

Step 1: Import Necessary Libraries
Before we begin, install the required libraries if you haven't done so yet. We'll use pandas for data handling, matplotlib and seaborn for visualizations, and sklearn for modeling.

# Importing libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

Enter fullscreen mode Exit fullscreen mode

Step 2: Load and Explore the Dataset
For this example, let's use a fictional dataset called student_grades.csv. This dataset might include features like attendance, hours studied, assignments completed, and previous grades.

Image description

# Load the dataset
data = pd.read_csv('student_grades.csv')

# Display the first few rows
data.head()

Enter fullscreen mode Exit fullscreen mode

To understand the dataset better, check for missing values and look at basic statistics.

# Check for missing values
print(data.isnull().sum())

# Get summary statistics
print(data.describe())

Enter fullscreen mode Exit fullscreen mode

Step 3: Visualize the Data
Before we proceed, let’s create some plots to see how the features relate to the final grade.

# Pairplot to visualize relationships between variables
sns.pairplot(data)
plt.show()

Enter fullscreen mode Exit fullscreen mode

This helps us identify any linear relationships between predictors (like hours studied) and the target variable (final grade).

Step 4: Prepare the Data
Separate the features (X) and the target (y), and split the data into training and testing sets.

# Define features and target variable
X = data[['Attendance (%)', 'Hours Studied', 'Assignments Completed', 'Previous Grade']]
y = data['Final Grade']

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Enter fullscreen mode Exit fullscreen mode

Step 5: Train the Model
We’ll start with a simple linear regression model, which is suitable for understanding linear relationships.

# Initialize and train the model
model = LinearRegression()
model.fit(X_train, y_train)

# Display coefficients
coefficients = pd.DataFrame(model.coef_, X.columns, columns=['Coefficient'])
print(coefficients)

Enter fullscreen mode Exit fullscreen mode

Table: Coefficients for each feature

This table shows how much each feature influences the final grade.

Step 6: Make Predictions
With the model trained, we can now make predictions on the test set and evaluate the model's performance.

# Make predictions
y_pred = model.predict(X_test)

# Evaluate the model
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print(f'MAE: {mae}')
print(f'MSE: {mse}')
print(f'RMSE: {rmse}')
print(f'R^2 Score: {r2}')

Enter fullscreen mode Exit fullscreen mode

Explanation of Metrics:

Mean Absolute Error (MAE): Average of absolute errors, which indicates how close predictions are to actual values.
Mean Squared Error (MSE) and Root Mean Squared Error (RMSE): Penalize larger errors more heavily.
R^2 Score: Indicates the proportion of variance explained by the model (higher is better).

Step 7: Visualize Predictions vs. Actual Grades
A scatter plot can help visualize how well the model's predictions align with the actual grades.

# Plot predicted vs actual values
plt.scatter(y_test, y_pred, alpha=0.7)
plt.xlabel('Actual Grades')
plt.ylabel('Predicted Grades')
plt.title('Predicted vs Actual Grades')
plt.show()

Enter fullscreen mode Exit fullscreen mode

The closer the points are to the 45-degree line, the better the model’s predictions.

Step 8: Analyze Residuals
Residuals are the differences between actual and predicted values. Plotting them can help detect patterns indicating underfitting or overfitting.

# Plot residuals
residuals = y_test - y_pred
plt.scatter(y_pred, residuals)
plt.axhline(0, color='red', linestyle='--')
plt.xlabel('Predicted Grades')
plt.ylabel('Residuals')
plt.title('Residuals Plot')
plt.show()

Enter fullscreen mode Exit fullscreen mode

If the residuals are randomly distributed, the model is likely appropriate for the data.

Conclusion
We successfully built a regression model to predict student grades based on features like attendance, study hours, and prior grades. This example provides a foundation for predicting student outcomes, but the model can be improved by experimenting with additional features or more complex algorithms.

Next Steps:

Experiment with different models and compare results.
Tune model hyperparameters for improved accuracy.
Explore feature engineering techniques to enhance model performance.

Top comments (0)