[FAQ] omework 5 (2026): Why does `/predict` return 200 OK for `"Paid_Ads"`, `"tiktok"` or a negative count, and how do I reject bad input?
I maintainer di solito rispondono entro 2 giorni
Valutazione
- Difficoltà
- 1/5
- Tempo stimato
- Meno di un'ora
- Idoneità per principianti
- 72/100
- Tipo di issue
- Documentazione
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- python, scikit-learn
- Ambito
- documentation, machine-learning
Direzione di ricerca
Leggi la risposta nelle FAQ e il contesto collegato di predict.py nella soluzione dei compiti di machine-learning-zoomcamp. L’issue spiega già il comportamento della validazione e mostra un esempio separato di modello di richiesta. Controlla che la spiegazione e gli esempi corrispondano alla versione funzionante collegata. Il lavoro è terminato quando le FAQ distinguono chiaramente il comportamento dei compiti valutati dagli esperimenti e spiegano quali input non validi restituiscono 422.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Course
machine-learning-zoomcamp
Question
Homework 5 (2026): I sent "lead_source": "Paid_Ads" (capital letters) to the API and got HTTP 200 with a different probability than for "paid_ads". "tiktok", "interaction_count": -3 and an income typo of 7927600 also return 200. Shouldn't the API reject these?
Answer
The course API validates types, not values, and DictVectorizer silently ignores categories it didn't see in training. Your graded answers are unaffected: the homework leads are all valid. In a real service, though, these mistakes go unnoticed.
What happens with the Q3 lead (/predict from the provided predict.py):
| change | status | probability |
|---|---|---|
| none | 200 | 0.533 |
lead_source: "Paid_Ads" |
200 | 0.553 |
lead_source: "tiktok" |
200 | 0.553 |
annual_income: 7927600 (×100 typo) |
200 | 0.000 |
interaction_count: -3 |
200 | 0.167 |
number_of_courses_viewed: 2.5 |
422 | — |
Why:
DictVectorizerone-hot encodes only thefeature=valuepairs it saw duringfit."Paid_Ads"and"tiktok"match no column, so the wholelead_sourceblock becomes zeros, and both get the same score.- Pydantic checks that
annual_incomeis a float and thatinteraction_countis an int. WithoutFieldconstraints, any float or int passes. Only2.5fails, because it isn't a valid int. - Income isn't scaled, so a ×100 typo multiplies a −1.2e-5 weight by about 8 million and pushes the probability to 0.
**Fix: validate values in the request model. Read the allowed categories from the model itself so they can't drift:
from typing import Literal, Optional
from pydantic import BaseModel, Field, create_model, field_validator
def vocabulary(feature):
names = pipeline.steps[0][1].get_feature_names_out()
return tuple(n.split("=", 1)[1] for n in names
if n.startswith(f"{feature}=") and not n.endswith("=NA"))
class Numbers(BaseModel):
number_of_courses_viewed: Optional[int] = Field(None, ge=0)
annual_income: Optional[float] = Field(None, ge=0, lt=1_000_000)
interaction_count: Optional[int] = Field(None, ge=0)
lead_score: Optional[float] = Field(None, ge=0, le=1)
@field_validator("lead_source", "industry", "employment_status", "location",
mode="before", check_fields=False)
@classmethod
def clean(cls, v): # "Paid_Ads" -> "paid_ads", "North America" -> "north_america"
if isinstance(v, str):
return v.strip().lower().replace(" ", "_") or None
return v
Lead = create_model("Lead", __base__=Numbers, {
f: (Optional[Literal[vocabulary(f)]], None)
for f in ["lead_source", "industry", "employment_status", "location"]})
Now "Paid_Ads" scores the same as "paid_ads" (0.533). "tiktok", negative counts, the income typo and lead_score: 4.1 return 422 with a clear message, and missing fields still fall back to the training medians. Add model_config = ConfigDict(extra="forbid") to reject misspelled field names such as leadscore too.
Don't change the provided predict.py for the graded Q4/Q6 runs. Use a separate app for experiments.
Full working version with 23 tests: https://github.com/devotuoma/machine-learning-zoomcamp/tree/hw05-deployment/cohorts/2026/homework/05-deployment/solution
Checklist
- I have searched existing FAQs and this question is not already answered
- The answer provides accurate, helpful information
- I have included any relevant code examples or links
- Lingua principale
- Python
- Stelle
- 7
- Fork
- 20
- Merge medio
- 7g 9h
- PR unite (30g)
- 8
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di DataTalksClub/faq
-
Fixing ValueError: feature_names must not contain [, ], or < in XGBoostForse già presa @github-actions l’ha presa oggi. Apertafaq-proposal
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
DataTalksClub/faq#536 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
How to fix uv warning: VIRTUAL_ENV does not match the project environment pathForse già presa @github-actions l’ha presa oggi. Apertafaq-proposal
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
DataTalksClub/faq#534 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Fixing ValueError: This solver needs samples of at least 2 classes in Logistic RegressionForse già presa @github-actions l’ha presa oggi. Apertafaq-proposal
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
DataTalksClub/faq#532 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 60/100
DataTalksClub/faq#531 ·
I maintainer di solito rispondono entro 2 giorni
-
[FAQ]Forse già presa @github-actions l’ha presa 3 giorni fa. Apertafaq-proposal
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
DataTalksClub/faq#521 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di DataTalksClub/faq
Issue simili
-
getchaintips leaves out the active tip once a header is staged on it, where Core always lists itAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
btclib-org/btclib-node#2158 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
dbt-msft/dbt-sqlserver#897 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
Gathin23/cleanyourtv#2770 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
vllm-project/vllm#64845 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
dekobon/big-code-analysis#1729 ·
I maintainer di solito rispondono entro 1 giorno