Servei de classificacio binaria per predir si un estudiant sera placed o not placed, amb pipeline de dades, entrenament versionat, API FastAPI, persistencia de prediccions, containeritzacio Docker, quality gates de testing i validacio CI/CD en cada push.
| Atribut | Detall |
|---|---|
| Nom | Student Placement Dataset |
| Font | Kaggle - sonalshinde123 |
| URL | https://www.kaggle.com/datasets/sonalshinde123/student-placement-dataset |
| Mida | 50.000 registres sintetics (45.000 train / 5.000 test) |
| Problema | Classificacio binaria: predir placement |
| Llicencia | CC0 Public Domain |
Distribucio target aproximada: 36.2% Placed i 63.8% Not Placed.
| Columna original | Columna normalitzada | Tipus | Rang |
|---|---|---|---|
| Age | age | int | 18-24 |
| Gender | gender | int | 0=Female, 1=Male |
| Degree | degree | int | 0=B.Tech, 1=BCA, 2=MCA, 3=B.Sc |
| Branch | branch | int | 0=ECE, 1=ME, 2=Civil, 3=CSE, 4=IT |
| CGPA | cgpa | float | 4.5-9.8 |
| Internships | internships | int | 0-3 |
| Projects | projects | int | 1-6 |
| Coding_Skills | coding_skills | int | 1-10 |
| Communication_Skills | communication_skills | int | 1-10 |
| Aptitude_Test_Score | aptitude_test_score | int | 35-100 |
| Soft_Skills_Rating | soft_skills_rating | int | 1-10 |
| Certifications | certifications | int | 0-3 |
| Backlogs | backlogs | int | 0-3 |
| Placement_Status | target | int | 0=Not Placed, 1=Placed |
- Esborra Student_ID (metadada sense valor predictiu).
- Renomena columnes a format estandard en minuscules.
- Codifica categoriques dins del pipeline:
- gender: Female=0, Male=1
- degree: B.Tech=0, BCA=1, MCA=2, B.Sc=3
- branch: ECE=0, ME=1, Civil=2, CSE=3, IT=4
- Converteix target a binari:
- Placed=1
- Not Placed=0
- app/pipeline.py: ETL + normalitzacio + splits 60/20/20.
- app/train.py: entrenament, quality gate i versionat de model.
- app/api.py: endpoints health, predict i predictions.
- app/pred_store.py: persistencia JSONL de prediccions.
- .cicd/hooks/validate.sh: fase 1 de CI (tests dins Docker a cada push).
- .cicd/hooks/pre-deploy.sh: fase 2 de CI (quality gate de deployment_ready).
- models/: artifacts del model (.pkl).
- metadata/: metadata de versions (.json).
- data/: dades d'entrada, splits i predictions.jsonl.
- .env.production: configuracio del servidor CI comesa al repositori.
Nota important: metadata i model estan separats en directoris diferents:
- models/ nomes te fitxers model_vN.pkl
- metadata/ nomes te fitxers metadata_vN.json
make setup
make pipeline
make train
make devAPI disponible a:
- http://localhost:8000/health
- http://localhost:8000/predict
- http://localhost:8000/predictions
- http://localhost:8000/docs
curl -X POST http://localhost:8000/predict \
-H "Content-Type: application/json" \
-d '{"age":21,"gender":1,"degree":0,"branch":3,"cgpa":7.5,
"internships":1,"projects":3,"coding_skills":7,
"communication_skills":6,"aptitude_test_score":72,
"soft_skills_rating":7,"certifications":2,"backlogs":0}'Resposta esperada (format):
{
"prediction": 1,
"probability": 0.72,
"model_version": "1.0.0"
}Cada crida a predict guarda una entrada JSON Lines amb:
- timestamp
- input
- prediction
- probability
- model_version
Path configurable via .env:
PREDICTIONS_LOG_PATH=data/predictions.jsonlConsulta historial:
curl "http://localhost:8000/predictions?limit=5"Build:
make docker-buildRun amb persistencia de dades i logs:
make docker-up
make healthEl servei en contenidor:
- usa usuari no root
- te healthcheck configurat
- persisteix data i logs via volums
Stop:
make docker-downSuite implementada amb pytest en tres blocs:
- tests/test_pipeline.py: preprocessament + schema
- tests/test_model.py: carrega de model + format de prediccio
- tests/test_api.py: endpoints + validacions + logging
Executar tests local:
make testExecutar tests dins Docker:
make docker-testEstat actual: 12 tests passing local i 12 tests passing en contenidor.
Sessio 12 separa clarament validacio i desplegament:
- git push: executa validacio (fases 1 i 2), sense deploy.
- git tag: disparara deploy a la Sessio 13 (fases 3 i 4).
Fitxers afegits a la sessio:
- .env.production
- .cicd/hooks/validate.sh
- .cicd/hooks/pre-deploy.sh
Fase 1 (validate.sh):
- copia .env.production a .env
- executa make docker-test
- falla si qualsevol test falla
Fase 2 (pre-deploy.sh):
- llegeix METADATA_PATH
- valida que el fitxer metadata existeix
- extreu version, f1_score i deployment_ready amb jq
- bloqueja si deployment_ready no es true
Verificacio local recomanada abans de push:
bash .cicd/hooks/validate.sh
bash .cicd/hooks/pre-deploy.shSortida esperada:
- Validation passed al final de fase 1
- Pre-deploy checks passed al final de fase 2
Requisits tecnics de Sessio 12:
- jq disponible per parsejar JSON en shell scripts
- Makefile amb targets docker-test, docker-up, docker-down, docker-build, health i predict
- metadata amb camp deployment_ready a l'arrel del JSON
Configuracio de servidor CI usada al projecte:
MODEL_PATH=models/model_v6.pkl
METADATA_PATH=metadata/metadata_v6.json
PORT=8085
HOST=0.0.0.0
LOG_LEVEL=INFO
LOG_FILE=logs/api.log
APP_NAME="Student Placement Prediction API"
APP_VERSION=1.0.0
PREDICTIONS_LOG_PATH=data/predictions.jsonlPrimer push a CI (sense deploy):
git push origin masterSi el servidor completa fase 1 i fase 2, el codi queda validat i llest per la Sessio 13.
- Algoritme: Logistic Regression (max_iter=2000)
- Preprocessing: StandardScaler
- Accuracy interna reportada durant training: ~86.67%
- Artifact principal: models/model_vN.pkl
- Metadata versionada: metadata/metadata_vN.json
MODEL_PATH=models/model_v1.pkl
METADATA_PATH=metadata/metadata_v1.json
PREDICTIONS_LOG_PATH=data/predictions.jsonl
PORT=8000
HOST=0.0.0.0
LOG_LEVEL=INFO
LOG_FILE=logs/api.log
APP_NAME=Student Placement Prediction API
APP_VERSION=1.0.0