Gotchas
The mistakes that do not raise an error.
fit_transform on training data, transform on test data
Calling fit_transform on your test set re-learns the parameters from it and quietly corrupts the evaluation. A Pipeline makes this structurally impossible, which is the main argument for always using one.
LabelEncoder is for targets only
It takes 1-D input. Using it on feature columns is a common early mistake — reach for OrdinalEncoder there instead.
OneHotEncoder needs handle_unknown='ignore'
Without it, the first unseen category in production raises an exception. The default is to error.
random_state everywhere you want reproducibility
Splitters, models, searches. Omit it and your numbers move between runs, and you cannot tell whether a change helped.
n_jobs=-1 is not the default
Free speedup on random forests, cross-validation and grid search. You have to ask for it.
Convergence warnings are not noise
max_iter on LogisticRegression and MLPClassifier defaults too low for real data. The warning means the model has not finished fitting.
Sparse output surprises people
TfidfVectorizer and OneHotEncoder return sparse matrices. Some models refuse them, and calling .toarray() on a large corpus exhausts memory. LinearSVC, LogisticRegression and MultinomialNB all accept sparse input directly.
Feature selection belongs inside the Pipeline
Selecting features on the full dataset before splitting is leakage. It is easy to do by accident and it inflates results convincingly.