From raw numbers to machine-readable signals
Raw data is rarely ready for a model. If you have a CSV with missing ages, text categories, and values on wildly different scales (age 0-100, income 0-1000000), feeding it directly to an algorithm will break. Imputation fills missing values (mean, median, or learned estimates). Encoding converts categories ('red', 'blue') into numbers that the model can process. Scaling (standardization, normalization) brings all features to the same numeric range so one large-magnitude feature does not dominate.
This is table-stakes preprocessing. Any model expects clean numeric input. The payoff is that a simple model on good features beats a complex model on bad raw data.
Interaction terms and domain knowledge
After cleaning, feature engineering becomes an art. Creating interaction terms (e.g., age multiplied by income) captures nonlinear relationships. Domain knowledge matters: if you are predicting house prices, floor-area is important, but floor-area divided by bedrooms (square feet per room) might be more predictive. Temporal features (day of week, time since last event) often unlock patterns that raw timestamps miss.
Deep learning can learn features automatically through hidden layers, but for tabular data, hand-crafted features on tree-based models (XGBoost, Random Forest) often outperform neural nets. The reason: neural nets need vast data to learn complex feature interactions, while simpler models with smart feature engineering can generalize from smaller datasets. This is why feature engineering remains central in applied ML, despite being less flashy than end-to-end deep learning.