Skill Tracer
Skills › Scientific Agent Skills › scikit-learn › preprocessing.md

preprocessing.md

623 lines · skills/scikit-learn/references/preprocessing.md at 5f2bc03

Open on GitHub
1# Data Preprocessing and Feature Engineering Reference
2
3Targets scikit-learn 1.9.1. Snippets with caller-supplied data/columns are illustrative; fit all learned preprocessing inside the training folds when estimating predictive performance.
4

Data Preprocessing and Feature Engineering Reference

Targets scikit-learn 1.9.1. Snippets with caller-supplied data/columns are illustrative; fit all learned preprocessing inside the training folds when estimating predictive performance.

Raw lines 1 to 4
5## Overview
6
7Data preprocessing transforms raw data into a format suitable for machine learning models. This includes scaling, encoding, handling missing values, and feature engineering.
8

Overview

Data preprocessing transforms raw data into a format suitable for machine learning models. This includes scaling, encoding, handling missing values, and feature engineering.

Raw lines 5 to 8
9## Feature Scaling and Normalization

Feature Scaling and Normalization

Raw lines 9 to 10
11### StandardScaler
13**StandardScaler (`sklearn.preprocessing.StandardScaler`)**
14- Standardizes features to zero mean and unit variance
15- Formula: z = (x - mean) / std
16- Use when: Different feature scales distort a distance, kernel, or regularization penalty; standardization does not make data Gaussian
17- Often useful for SVM, KNN, neural networks, PCA, and regularized linear models; choose scales using scientific units and noise. For sparse data use `with_mean=False`
18- Example:
19```python
20from sklearn.preprocessing import StandardScaler
22scaler = StandardScaler()
23X_train_scaled = scaler.fit_transform(X_train)
24X_test_scaled = scaler.transform(X_test) # Use same parameters as training
26# Access learned parameters
27print(f"Mean: {scaler.mean_}")
28print(f"Std: {scaler.scale_}")
29```

StandardScaler

**StandardScaler (sklearn.preprocessing.StandardScaler)**

  • Standardizes features to zero mean and unit variance
  • Formula: z = (x - mean) / std
  • Use when: Different feature scales distort a distance, kernel, or regularization penalty; standardization does not make data Gaussian
  • Often useful for SVM, KNN, neural networks, PCA, and regularized linear models; choose scales using scientific units and noise. For sparse data use with_mean=False
  • Example:
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)  # Use same parameters as training

# Access learned parameters
print(f"Mean: {scaler.mean_}")
print(f"Std: {scaler.scale_}")
Raw lines 11 to 30
31### MinMaxScaler
33**MinMaxScaler (`sklearn.preprocessing.MinMaxScaler`)**
34- Scales features to a given range (default [0, 1])
35- Formula: X_scaled = (X - X.min) / (X.max - X.min)
36- Training values map to the requested range; unseen values can exceed it unless `clip=True`. Clipping can hide distribution shift
37- Sensitive to outliers
38- Example:
39```python
40from sklearn.preprocessing import MinMaxScaler
42scaler = MinMaxScaler(feature_range=(0, 1))
43X_scaled = scaler.fit_transform(X_train)
45# Custom range
46scaler = MinMaxScaler(feature_range=(-1, 1))
47X_scaled = scaler.fit_transform(X_train)
48```

MinMaxScaler

**MinMaxScaler (sklearn.preprocessing.MinMaxScaler)**

  • Scales features to a given range (default [0, 1])
  • Formula: X_scaled = (X - X.min) / (X.max - X.min)
  • Training values map to the requested range; unseen values can exceed it unless clip=True. Clipping can hide distribution shift
  • Sensitive to outliers
  • Example:
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(0, 1))
X_scaled = scaler.fit_transform(X_train)

# Custom range
scaler = MinMaxScaler(feature_range=(-1, 1))
X_scaled = scaler.fit_transform(X_train)
Raw lines 31 to 49
50### RobustScaler
52**RobustScaler (`sklearn.preprocessing.RobustScaler`)**
53- Scales using median and interquartile range (IQR)
54- Formula: X_scaled = (X - median) / IQR
55- Use when: Data contains outliers
56- Robust to outliers
57- Example:
58```python
59from sklearn.preprocessing import RobustScaler
61scaler = RobustScaler()
62X_scaled = scaler.fit_transform(X_train)
63```

RobustScaler

**RobustScaler (sklearn.preprocessing.RobustScaler)**

  • Scales using median and interquartile range (IQR)
  • Formula: X_scaled = (X - median) / IQR
  • Use when: Data contains outliers
  • Robust to outliers
  • Example:
from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
X_scaled = scaler.fit_transform(X_train)
Raw lines 50 to 64
65### Normalizer
67**Normalizer (`sklearn.preprocessing.Normalizer`)**
68- Normalizes samples individually to unit norm
69- Common norms: 'l1', 'l2', 'max'
70- Use when: Need to normalize each sample independently (e.g., text features)
71- Example:
72```python
73from sklearn.preprocessing import Normalizer
75normalizer = Normalizer(norm='l2') # Euclidean norm
76X_normalized = normalizer.fit_transform(X)
77```

Normalizer

**Normalizer (sklearn.preprocessing.Normalizer)**

  • Normalizes samples individually to unit norm
  • Common norms: 'l1', 'l2', 'max'
  • Use when: Need to normalize each sample independently (e.g., text features)
  • Example:
from sklearn.preprocessing import Normalizer

normalizer = Normalizer(norm='l2')  # Euclidean norm
X_normalized = normalizer.fit_transform(X)
Raw lines 65 to 78
79### MaxAbsScaler
81**MaxAbsScaler (`sklearn.preprocessing.MaxAbsScaler`)**
82- Scales by maximum absolute value
83- Training range lies within [-1, 1]; new extrema can exceed it
84- Doesn't shift/center data (preserves sparsity)
85- Use when: Data is already centered or sparse
86- Example:
87```python
88from sklearn.preprocessing import MaxAbsScaler
90scaler = MaxAbsScaler()
91X_scaled = scaler.fit_transform(X_sparse)
92```

MaxAbsScaler

**MaxAbsScaler (sklearn.preprocessing.MaxAbsScaler)**

  • Scales by maximum absolute value
  • Training range lies within [-1, 1]; new extrema can exceed it
  • Doesn't shift/center data (preserves sparsity)
  • Use when: Data is already centered or sparse
  • Example:
from sklearn.preprocessing import MaxAbsScaler

scaler = MaxAbsScaler()
X_scaled = scaler.fit_transform(X_sparse)
Raw lines 79 to 93
94## Encoding Categorical Variables

Encoding Categorical Variables

Raw lines 94 to 95
96### OneHotEncoder
98**OneHotEncoder (`sklearn.preprocessing.OneHotEncoder`)**
99- Creates binary columns for each category
100- Use when: Nominal categories (no order), tree-based models or linear models
101- Example:
102```python
103from sklearn.preprocessing import OneHotEncoder
105encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore')
106X_encoded = encoder.fit_transform(X_categorical)
108# Get feature names
109feature_names = encoder.get_feature_names_out(['color', 'size'])
111# Handle unknown categories during transform
112X_test_encoded = encoder.transform(X_test_categorical)
113```

OneHotEncoder

**OneHotEncoder (sklearn.preprocessing.OneHotEncoder)**

  • Creates binary columns for each category
  • Use when: Nominal categories (no order), tree-based models or linear models
  • Example:
from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore')
X_encoded = encoder.fit_transform(X_categorical)

# Get feature names
feature_names = encoder.get_feature_names_out(['color', 'size'])

# Handle unknown categories during transform
X_test_encoded = encoder.transform(X_test_categorical)
Raw lines 96 to 114
115### OrdinalEncoder
117**OrdinalEncoder (`sklearn.preprocessing.OrdinalEncoder`)**
118- Encodes categories as integers
119- Use when: Ordinal categories (ordered), or tree-based models
120- Example:
121```python
122from sklearn.preprocessing import OrdinalEncoder
124# Default sorted category order is not necessarily a scientific ordering
125encoder = OrdinalEncoder()
126X_encoded = encoder.fit_transform(X_categorical)
128# Custom ordering
129encoder = OrdinalEncoder(categories=[['small', 'medium', 'large']])
130X_encoded = encoder.fit_transform(X_categorical)
131```

OrdinalEncoder

**OrdinalEncoder (sklearn.preprocessing.OrdinalEncoder)**

  • Encodes categories as integers
  • Use when: Ordinal categories (ordered), or tree-based models
  • Example:
from sklearn.preprocessing import OrdinalEncoder

# Default sorted category order is not necessarily a scientific ordering
encoder = OrdinalEncoder()
X_encoded = encoder.fit_transform(X_categorical)

# Custom ordering
encoder = OrdinalEncoder(categories=[['small', 'medium', 'large']])
X_encoded = encoder.fit_transform(X_categorical)
Raw lines 115 to 132
133### LabelEncoder
135**LabelEncoder (`sklearn.preprocessing.LabelEncoder`)**
136- Encodes target labels (y) as integers
137- Use for: Target variable encoding
138- Example:
139```python
140from sklearn.preprocessing import LabelEncoder
142le = LabelEncoder()
143y_encoded = le.fit_transform(y)
145# Decode back
146y_decoded = le.inverse_transform(y_encoded)
147print(f"Classes: {le.classes_}")
148```

LabelEncoder

**LabelEncoder (sklearn.preprocessing.LabelEncoder)**

  • Encodes target labels (y) as integers
  • Use for: Target variable encoding
  • Example:
from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
y_encoded = le.fit_transform(y)

# Decode back
y_decoded = le.inverse_transform(y_encoded)
print(f"Classes: {le.classes_}")
Raw lines 133 to 149
150### Target Encoding (with internal cross-fitting)
152```python
153from sklearn.preprocessing import TargetEncoder
154from sklearn.model_selection import StratifiedKFold
156encoder = TargetEncoder(cv=StratifiedKFold(5, shuffle=True, random_state=42))
157X_train_encoded = encoder.fit_transform(X_train_categorical, y_train)
158X_test_encoded = encoder.transform(X_test_categorical)
159```
161`fit_transform` uses out-of-fold encodings for training rows, while `fit(...).transform(...)` does not; they intentionally differ. Put the encoder inside the model pipeline for outer CV. In 1.9, custom internal splitters are supported if every row occurs in exactly one validation fold; use metadata routing for groups. Ordinary `TimeSeriesSplit` does not satisfy that partition requirement. Use a study-specific causal encoding design for forecasting. Plain shuffled folds assume independent rows. The old encoder `shuffle` and `random_state` parameters are deprecated; configure the splitter instead. Numeric integer regression targets may be inferred as multiclass, so set `target_type='continuous'` when appropriate.

Target Encoding (with internal cross-fitting)

from sklearn.preprocessing import TargetEncoder
from sklearn.model_selection import StratifiedKFold

encoder = TargetEncoder(cv=StratifiedKFold(5, shuffle=True, random_state=42))
X_train_encoded = encoder.fit_transform(X_train_categorical, y_train)
X_test_encoded = encoder.transform(X_test_categorical)

fit_transform uses out-of-fold encodings for training rows, while fit(...).transform(...) does not; they intentionally differ. Put the encoder inside the model pipeline for outer CV. In 1.9, custom internal splitters are supported if every row occurs in exactly one validation fold; use metadata routing for groups. Ordinary TimeSeriesSplit does not satisfy that partition requirement. Use a study-specific causal encoding design for forecasting. Plain shuffled folds assume independent rows. The old encoder shuffle and random_state parameters are deprecated; configure the splitter instead. Numeric integer regression targets may be inferred as multiclass, so set target_type='continuous' when appropriate.

Raw lines 150 to 162
163## Non-linear Transformations

Non-linear Transformations

Raw lines 163 to 164
165### Power Transforms
167**PowerTransformer**
168- Makes data more Gaussian-like
169- Methods: 'yeo-johnson' (works with negative values), 'box-cox' (positive only)
170- Use when: Data is skewed, algorithm assumes normality
171- Example:
172```python
173from sklearn.preprocessing import PowerTransformer
175# Yeo-Johnson (handles negative values)
176pt = PowerTransformer(method='yeo-johnson', standardize=True)
177X_transformed = pt.fit_transform(X)
179# Box-Cox (positive values only)
180pt = PowerTransformer(method='box-cox', standardize=True)
181X_transformed = pt.fit_transform(X)
182```

Power Transforms

PowerTransformer

  • Makes data more Gaussian-like
  • Methods: 'yeo-johnson' (works with negative values), 'box-cox' (positive only)
  • Use when: Data is skewed, algorithm assumes normality
  • Example:
from sklearn.preprocessing import PowerTransformer

# Yeo-Johnson (handles negative values)
pt = PowerTransformer(method='yeo-johnson', standardize=True)
X_transformed = pt.fit_transform(X)

# Box-Cox (positive values only)
pt = PowerTransformer(method='box-cox', standardize=True)
X_transformed = pt.fit_transform(X)
Raw lines 165 to 183
184### Quantile Transformation
186**QuantileTransformer**
187- Transforms features to follow uniform or normal distribution
188- Robust to outliers
189- Use when: Want to reduce outlier impact
190- Example:
191```python
192from sklearn.preprocessing import QuantileTransformer
194# Transform to uniform distribution
195qt = QuantileTransformer(output_distribution='uniform', random_state=42)
196X_transformed = qt.fit_transform(X)
198# Transform to normal distribution
199qt = QuantileTransformer(output_distribution='normal', random_state=42)
200X_transformed = qt.fit_transform(X)
201```

Quantile Transformation

QuantileTransformer

  • Transforms features to follow uniform or normal distribution
  • Robust to outliers
  • Use when: Want to reduce outlier impact
  • Example:
from sklearn.preprocessing import QuantileTransformer

# Transform to uniform distribution
qt = QuantileTransformer(output_distribution='uniform', random_state=42)
X_transformed = qt.fit_transform(X)

# Transform to normal distribution
qt = QuantileTransformer(output_distribution='normal', random_state=42)
X_transformed = qt.fit_transform(X)
Raw lines 184 to 202
203### Log Transform
205```python
206import numpy as np
208# Log1p (log(1 + x)) - handles zeros
209X_log = np.log1p(X)
211# Or use FunctionTransformer
212from sklearn.preprocessing import FunctionTransformer
214log_transformer = FunctionTransformer(np.log1p, inverse_func=np.expm1)
215X_log = log_transformer.fit_transform(X)
216```

Log Transform

import numpy as np

# Log1p (log(1 + x)) - handles zeros
X_log = np.log1p(X)

# Or use FunctionTransformer
from sklearn.preprocessing import FunctionTransformer

log_transformer = FunctionTransformer(np.log1p, inverse_func=np.expm1)
X_log = log_transformer.fit_transform(X)
Raw lines 203 to 217
218## Missing Value Imputation

Missing Value Imputation

Raw lines 218 to 219
220### SimpleImputer
222Default `missing_values=np.nan` does not normalize every sentinel: convert categorical `None`/`pd.NA` consistently. In 1.9 even constant-strategy imputers drop entirely missing columns unless `keep_empty_features=True`. Decide explicitly whether the schema should preserve those columns.
224**SimpleImputer (`sklearn.impute.SimpleImputer`)**
225- Basic imputation strategies
226- Strategies: 'mean', 'median', 'most_frequent', 'constant'
227- Example:
228```python
229from sklearn.impute import SimpleImputer
231# For numerical features
232imputer = SimpleImputer(strategy='mean')
233X_imputed = imputer.fit_transform(X)
235# For categorical features
236imputer = SimpleImputer(strategy='most_frequent')
237X_imputed = imputer.fit_transform(X_categorical)
239# Fill with constant
240imputer = SimpleImputer(strategy='constant', fill_value=0)
241X_imputed = imputer.fit_transform(X)
242```

SimpleImputer

Default missing_values=np.nan does not normalize every sentinel: convert categorical None/pd.NA consistently. In 1.9 even constant-strategy imputers drop entirely missing columns unless keep_empty_features=True. Decide explicitly whether the schema should preserve those columns.

**SimpleImputer (sklearn.impute.SimpleImputer)**

  • Basic imputation strategies
  • Strategies: 'mean', 'median', 'most_frequent', 'constant'
  • Example:
from sklearn.impute import SimpleImputer

# For numerical features
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)

# For categorical features
imputer = SimpleImputer(strategy='most_frequent')
X_imputed = imputer.fit_transform(X_categorical)

# Fill with constant
imputer = SimpleImputer(strategy='constant', fill_value=0)
X_imputed = imputer.fit_transform(X)
Raw lines 220 to 243
244### Iterative Imputer
246**IterativeImputer**
247- Models each feature with missing values as function of other features
248- Experimental: enabling import remains required. Iterative imputation does not itself propagate missing-data uncertainty; inspect convergence and assumptions
249- Example:
250```python
251from sklearn.experimental import enable_iterative_imputer
252from sklearn.impute import IterativeImputer
254imputer = IterativeImputer(max_iter=10, random_state=42)
255X_imputed = imputer.fit_transform(X)
256```

Iterative Imputer

IterativeImputer

  • Models each feature with missing values as function of other features
  • Experimental: enabling import remains required. Iterative imputation does not itself propagate missing-data uncertainty; inspect convergence and assumptions
  • Example:
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer

imputer = IterativeImputer(max_iter=10, random_state=42)
X_imputed = imputer.fit_transform(X)
Raw lines 244 to 257
258### KNN Imputer
260**KNNImputer**
261- Imputes using k-nearest neighbors
262- Use when: Features are correlated
263- Example:
264```python
265from sklearn.impute import KNNImputer
267imputer = KNNImputer(n_neighbors=5)
268X_imputed = imputer.fit_transform(X)
269```

KNN Imputer

KNNImputer

  • Imputes using k-nearest neighbors
  • Use when: Features are correlated
  • Example:
from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=5)
X_imputed = imputer.fit_transform(X)
Raw lines 258 to 270
271## Feature Engineering

Feature Engineering

Raw lines 271 to 272
273### Polynomial Features
275**PolynomialFeatures**
276- Creates polynomial and interaction features
277- Use when: Need non-linear features for linear models
278- Example:
279```python
280from sklearn.preprocessing import PolynomialFeatures
282# Degree 2: includes x1, x2, x1^2, x2^2, x1*x2
283poly = PolynomialFeatures(degree=2, include_bias=False)
284X_poly = poly.fit_transform(X)
286# Get feature names
287feature_names = poly.get_feature_names_out(['x1', 'x2'])
289# Only interactions (no powers)
290poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)
291X_interactions = poly.fit_transform(X)
292```

Polynomial Features

PolynomialFeatures

  • Creates polynomial and interaction features
  • Use when: Need non-linear features for linear models
  • Example:
from sklearn.preprocessing import PolynomialFeatures

# Degree 2: includes x1, x2, x1^2, x2^2, x1*x2
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

# Get feature names
feature_names = poly.get_feature_names_out(['x1', 'x2'])

# Only interactions (no powers)
poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)
X_interactions = poly.fit_transform(X)
Raw lines 273 to 293
294### Binning/Discretization
296**KBinsDiscretizer**
297- Bins continuous features into discrete intervals
298- Strategies: 'uniform', 'quantile', 'kmeans'
299- Encoding: 'onehot', 'ordinal', 'onehot-dense'
300- Example:
301```python
302from sklearn.preprocessing import KBinsDiscretizer
304# Equal-width bins
305binner = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='uniform')
306X_binned = binner.fit_transform(X)
308# Equal-frequency bins (quantile-based)
309binner = KBinsDiscretizer(n_bins=5, encode='onehot', strategy='quantile',
310 quantile_method='averaged_inverted_cdf', random_state=42)
311X_binned = binner.fit_transform(X)
312```

Binning/Discretization

KBinsDiscretizer

  • Bins continuous features into discrete intervals
  • Strategies: 'uniform', 'quantile', 'kmeans'
  • Encoding: 'onehot', 'ordinal', 'onehot-dense'
  • Example:
from sklearn.preprocessing import KBinsDiscretizer

# Equal-width bins
binner = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='uniform')
X_binned = binner.fit_transform(X)

# Equal-frequency bins (quantile-based)
binner = KBinsDiscretizer(n_bins=5, encode='onehot', strategy='quantile',
                           quantile_method='averaged_inverted_cdf', random_state=42)
X_binned = binner.fit_transform(X)
Raw lines 294 to 313
314### Binarization
316**Binarizer**
317- Converts features to binary (0 or 1) based on threshold
318- Example:
319```python
320from sklearn.preprocessing import Binarizer
322binarizer = Binarizer(threshold=0.5)
323X_binary = binarizer.fit_transform(X)
324```

Binarization

Binarizer

  • Converts features to binary (0 or 1) based on threshold
  • Example:
from sklearn.preprocessing import Binarizer

binarizer = Binarizer(threshold=0.5)
X_binary = binarizer.fit_transform(X)
Raw lines 314 to 325
326### Spline Features
328**SplineTransformer**
329- Creates spline basis functions
330- Useful for capturing non-linear relationships
331- Example:
332```python
333from sklearn.preprocessing import SplineTransformer
335spline = SplineTransformer(n_knots=5, degree=3)
336X_splines = spline.fit_transform(X)
337```

Spline Features

SplineTransformer

  • Creates spline basis functions
  • Useful for capturing non-linear relationships
  • Example:
from sklearn.preprocessing import SplineTransformer

spline = SplineTransformer(n_knots=5, degree=3)
X_splines = spline.fit_transform(X)
Raw lines 326 to 338
339## Text Feature Extraction

Text Feature Extraction

Raw lines 339 to 340
341### CountVectorizer
343**CountVectorizer (`sklearn.feature_extraction.text.CountVectorizer`)**
344- Converts text to token count matrix
345- Use for: Bag-of-words representation
346- Example:
347```python
348from sklearn.feature_extraction.text import CountVectorizer
350vectorizer = CountVectorizer(
351 max_features=5000, # Keep top 5000 features
352 min_df=2, # Ignore terms appearing in < 2 documents
353 max_df=0.8, # Ignore terms appearing in > 80% documents
354 ngram_range=(1, 2) # Unigrams and bigrams
357X_counts = vectorizer.fit_transform(documents)
358feature_names = vectorizer.get_feature_names_out()
359```

CountVectorizer

**CountVectorizer (sklearn.feature_extraction.text.CountVectorizer)**

  • Converts text to token count matrix
  • Use for: Bag-of-words representation
  • Example:
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(
    max_features=5000,  # Keep top 5000 features
    min_df=2,  # Ignore terms appearing in < 2 documents
    max_df=0.8,  # Ignore terms appearing in > 80% documents
    ngram_range=(1, 2)  # Unigrams and bigrams
)

X_counts = vectorizer.fit_transform(documents)
feature_names = vectorizer.get_feature_names_out()
Raw lines 341 to 360
361### TfidfVectorizer
363**TfidfVectorizer**
364- TF-IDF (Term Frequency-Inverse Document Frequency) transformation
365- Weights counts by inverse document frequency; compare against counts on held-out data
366- Example:
367```python
368from sklearn.feature_extraction.text import TfidfVectorizer
370vectorizer = TfidfVectorizer(
371 max_features=5000,
372 min_df=2,
373 max_df=0.8,
374 ngram_range=(1, 2),
375 stop_words='english' # Remove English stop words
378X_tfidf = vectorizer.fit_transform(documents)
379```

TfidfVectorizer

TfidfVectorizer

  • TF-IDF (Term Frequency-Inverse Document Frequency) transformation
  • Weights counts by inverse document frequency; compare against counts on held-out data
  • Example:
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(
    max_features=5000,
    min_df=2,
    max_df=0.8,
    ngram_range=(1, 2),
    stop_words='english'  # Remove English stop words
)

X_tfidf = vectorizer.fit_transform(documents)
Raw lines 361 to 380
381### HashingVectorizer
383**HashingVectorizer**
384- Uses hashing trick for memory efficiency
385- No fit needed, can't reverse transform
386- Use when: Very large vocabulary, streaming data
387- Example:
388```python
389from sklearn.feature_extraction.text import HashingVectorizer
391vectorizer = HashingVectorizer(n_features=2**18)
392X_hashed = vectorizer.transform(documents) # No fit needed
393```

HashingVectorizer

HashingVectorizer

  • Uses hashing trick for memory efficiency
  • No fit needed, can't reverse transform
  • Use when: Very large vocabulary, streaming data
  • Example:
from sklearn.feature_extraction.text import HashingVectorizer

vectorizer = HashingVectorizer(n_features=2**18)
X_hashed = vectorizer.transform(documents)  # No fit needed
Raw lines 381 to 394
395## Feature Selection

Feature Selection

Raw lines 395 to 396
397### Filter Methods
399**Variance Threshold**
400- Removes low-variance features
401- Example:
402```python
403from sklearn.feature_selection import VarianceThreshold
405selector = VarianceThreshold(threshold=0.01)
406X_selected = selector.fit_transform(X)
407```
409**SelectKBest / SelectPercentile**
410- Select features based on statistical tests
411- Tests: f_classif, chi2, mutual_info_classif
412- Example:
413```python
414from sklearn.feature_selection import SelectKBest, f_classif
416# Select top 10 features
417selector = SelectKBest(score_func=f_classif, k=10)
418X_selected = selector.fit_transform(X_train, y_train)
420# Get selected feature indices
421selected_indices = selector.get_support(indices=True)
422```

Filter Methods

Variance Threshold

  • Removes low-variance features
  • Example:
from sklearn.feature_selection import VarianceThreshold

selector = VarianceThreshold(threshold=0.01)
X_selected = selector.fit_transform(X)

SelectKBest / SelectPercentile

  • Select features based on statistical tests
  • Tests: f_classif, chi2, mutual_info_classif
  • Example:
from sklearn.feature_selection import SelectKBest, f_classif

# Select top 10 features
selector = SelectKBest(score_func=f_classif, k=10)
X_selected = selector.fit_transform(X_train, y_train)

# Get selected feature indices
selected_indices = selector.get_support(indices=True)
Raw lines 397 to 423
424### Wrapper Methods
426**Recursive Feature Elimination (RFE)**
427- Recursively removes features
428- Uses model feature importances
429- Example:
430```python
431from sklearn.feature_selection import RFE
432from sklearn.ensemble import RandomForestClassifier
434model = RandomForestClassifier(n_estimators=100, random_state=42)
435rfe = RFE(estimator=model, n_features_to_select=10, step=1)
436X_selected = rfe.fit_transform(X_train, y_train)
438# Get selected features
439selected_features = rfe.support_
440feature_ranking = rfe.ranking_
441```
443**RFECV (with Cross-Validation)**
444- RFE with cross-validation to find optimal number of features
445- Example:
446```python
447from sklearn.feature_selection import RFECV
449model = RandomForestClassifier(n_estimators=100, random_state=42)
450rfecv = RFECV(estimator=model, cv=5, scoring='accuracy')
451X_selected = rfecv.fit_transform(X_train, y_train)
453print(f"Optimal number of features: {rfecv.n_features_}")
454```

Wrapper Methods

Recursive Feature Elimination (RFE)

  • Recursively removes features
  • Uses model feature importances
  • Example:
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, random_state=42)
rfe = RFE(estimator=model, n_features_to_select=10, step=1)
X_selected = rfe.fit_transform(X_train, y_train)

# Get selected features
selected_features = rfe.support_
feature_ranking = rfe.ranking_

RFECV (with Cross-Validation)

  • RFE with cross-validation to find optimal number of features
  • Example:
from sklearn.feature_selection import RFECV

model = RandomForestClassifier(n_estimators=100, random_state=42)
rfecv = RFECV(estimator=model, cv=5, scoring='accuracy')
X_selected = rfecv.fit_transform(X_train, y_train)

print(f"Optimal number of features: {rfecv.n_features_}")
Raw lines 424 to 455
456### Embedded Methods
458**SelectFromModel**
459- Select features based on model coefficients/importances
460- Works with: Linear models (L1), Tree-based models
461- Example:
462```python
463from sklearn.feature_selection import SelectFromModel
464from sklearn.ensemble import RandomForestClassifier
466model = RandomForestClassifier(n_estimators=100, random_state=42)
467selector = SelectFromModel(model, threshold='median')
468selector.fit(X_train, y_train)
469X_selected = selector.transform(X_train)
471# Get selected features
472selected_features = selector.get_support()
473```
475**L1-based Feature Selection**
476```python
477from sklearn.linear_model import LogisticRegression
478from sklearn.feature_selection import SelectFromModel
480model = LogisticRegression(l1_ratio=1.0, solver='liblinear', C=0.1)
481selector = SelectFromModel(model)
482selector.fit(X_train, y_train)
483X_selected = selector.transform(X_train)
484```

Embedded Methods

SelectFromModel

  • Select features based on model coefficients/importances
  • Works with: Linear models (L1), Tree-based models
  • Example:
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=100, random_state=42)
selector = SelectFromModel(model, threshold='median')
selector.fit(X_train, y_train)
X_selected = selector.transform(X_train)

# Get selected features
selected_features = selector.get_support()

L1-based Feature Selection

from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModel

model = LogisticRegression(l1_ratio=1.0, solver='liblinear', C=0.1)
selector = SelectFromModel(model)
selector.fit(X_train, y_train)
X_selected = selector.transform(X_train)
Raw lines 456 to 485
486## Handling Outliers

Handling Outliers

Raw lines 486 to 487
488### IQR Method
490Illustrative exploratory filtering only: this does not establish measurement error. Learn thresholds on training data, retain valid rare biology, and apply any row mask to `y` and metadata too. Do not delete test outliers to improve reported performance.
492```python
493import numpy as np
495Q1 = np.percentile(X, 25, axis=0)
496Q3 = np.percentile(X, 75, axis=0)
497IQR = Q3 - Q1
499# Define outlier boundaries
500lower_bound = Q1 - 1.5 * IQR
501upper_bound = Q3 + 1.5 * IQR
503# Flag rows; any removal must preserve aligned labels/metadata
504mask = np.all((X >= lower_bound) & (X <= upper_bound), axis=1)
505X_no_outliers = X[mask]
506```

IQR Method

Illustrative exploratory filtering only: this does not establish measurement error. Learn thresholds on training data, retain valid rare biology, and apply any row mask to y and metadata too. Do not delete test outliers to improve reported performance.

import numpy as np

Q1 = np.percentile(X, 25, axis=0)
Q3 = np.percentile(X, 75, axis=0)
IQR = Q3 - Q1

# Define outlier boundaries
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# Flag rows; any removal must preserve aligned labels/metadata
mask = np.all((X >= lower_bound) & (X <= upper_bound), axis=1)
X_no_outliers = X[mask]
Raw lines 488 to 507
508### Winsorization
510This computes thresholds on the supplied array. Do not winsorize test data independently or before CV; learn training cutoffs and reuse them. Report the scientific justification for clipping.
512```python
513from scipy.stats import mstats
515# Clip outliers at 5th and 95th percentiles
516X_winsorized = mstats.winsorize(X, limits=[0.05, 0.05], axis=0)
517```

Winsorization

This computes thresholds on the supplied array. Do not winsorize test data independently or before CV; learn training cutoffs and reuse them. Report the scientific justification for clipping.

from scipy.stats import mstats

# Clip outliers at 5th and 95th percentiles
X_winsorized = mstats.winsorize(X, limits=[0.05, 0.05], axis=0)
Raw lines 508 to 518
519## Custom Transformers

Custom Transformers

Raw lines 519 to 520
521### Using FunctionTransformer
523```python
524from sklearn.preprocessing import FunctionTransformer
525import numpy as np
527def log_transform(X):
528 return np.log1p(X)
530transformer = FunctionTransformer(log_transform, inverse_func=np.expm1)
531X_transformed = transformer.fit_transform(X)
532```

Using FunctionTransformer

from sklearn.preprocessing import FunctionTransformer
import numpy as np

def log_transform(X):
    return np.log1p(X)

transformer = FunctionTransformer(log_transform, inverse_func=np.expm1)
X_transformed = transformer.fit_transform(X)
Raw lines 521 to 533
534### Creating Custom Transformer
536```python
537from sklearn.base import BaseEstimator, TransformerMixin
539class CustomTransformer(TransformerMixin, BaseEstimator):
540 def __init__(self, parameter=1):
541 self.parameter = parameter
543 def fit(self, X, y=None):
544 # Learn parameters from X if needed
545 return self
547 def transform(self, X):
548 # Transform X
549 return X * self.parameter
551transformer = CustomTransformer(parameter=2)
552X_transformed = transformer.fit_transform(X)
553```

Creating Custom Transformer

from sklearn.base import BaseEstimator, TransformerMixin

class CustomTransformer(TransformerMixin, BaseEstimator):
    def __init__(self, parameter=1):
        self.parameter = parameter

    def fit(self, X, y=None):
        # Learn parameters from X if needed
        return self

    def transform(self, X):
        # Transform X
        return X * self.parameter

transformer = CustomTransformer(parameter=2)
X_transformed = transformer.fit_transform(X)
Raw lines 534 to 554
555## Best Practices

Best Practices

Raw lines 555 to 556
557### Fit on Training Data Only
558Always fit transformers on training data only:
559```python
560# Correct
561scaler = StandardScaler()
562X_train_scaled = scaler.fit_transform(X_train)
563X_test_scaled = scaler.transform(X_test)
565# Wrong - causes data leakage
566scaler = StandardScaler()
567X_all_scaled = scaler.fit_transform(np.vstack([X_train, X_test]))
568```

Fit on Training Data Only

Always fit transformers on training data only:

# Correct
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Wrong - causes data leakage
scaler = StandardScaler()
X_all_scaled = scaler.fit_transform(np.vstack([X_train, X_test]))
Raw lines 557 to 569
570### Use Pipelines
571Combine preprocessing with models:
572```python
573from sklearn.pipeline import Pipeline
574from sklearn.preprocessing import StandardScaler
575from sklearn.linear_model import LogisticRegression
577pipeline = Pipeline([
578 ('scaler', StandardScaler()),
579 ('classifier', LogisticRegression())
580])
582pipeline.fit(X_train, y_train)
583```

Use Pipelines

Combine preprocessing with models:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])

pipeline.fit(X_train, y_train)
Raw lines 570 to 584
585### Handle Categorical and Numerical Separately
586Use ColumnTransformer:
587```python
588from sklearn.compose import ColumnTransformer
589from sklearn.preprocessing import StandardScaler, OneHotEncoder
591numeric_features = ['age', 'income']
592categorical_features = ['gender', 'occupation']
594preprocessor = ColumnTransformer(
595 transformers=[
596 ('num', StandardScaler(), numeric_features),
597 ('cat', OneHotEncoder(), categorical_features)
598 ]
601X_transformed = preprocessor.fit_transform(X)
602```

Handle Categorical and Numerical Separately

Use ColumnTransformer:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

numeric_features = ['age', 'income']
categorical_features = ['gender', 'occupation']

preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(), categorical_features)
    ]
)

X_transformed = preprocessor.fit_transform(X)
Raw lines 585 to 603
604### Algorithm-Specific Requirements
606**Often Benefit from Scaling:**
607- SVM, KNN, Neural Networks
608- PCA, Linear/Logistic Regression with regularization
609- K-Means clustering
611**Don't Require Scaling:**
612- Tree-based models (Decision Trees, Random Forest, Gradient Boosting)
613- Gaussian Naive Bayes; MultinomialNB requires nonnegative features
615**Encoding Requirements:**
616- Linear models, SVM, KNN: One-hot encoding for nominal features
617- Ordinary trees accept numeric codes but impose threshold order; that can misrepresent nominal categories. HistGradientBoosting supports explicitly declared categorical features

Algorithm-Specific Requirements

Often Benefit from Scaling:

  • SVM, KNN, Neural Networks
  • PCA, Linear/Logistic Regression with regularization
  • K-Means clustering

Don't Require Scaling:

  • Tree-based models (Decision Trees, Random Forest, Gradient Boosting)
  • Gaussian Naive Bayes; MultinomialNB requires nonnegative features

Encoding Requirements:

  • Linear models, SVM, KNN: One-hot encoding for nominal features
  • Ordinary trees accept numeric codes but impose threshold order; that can misrepresent nominal categories. HistGradientBoosting supports explicitly declared categorical features
Raw lines 604 to 618
619## Upstream references
621- https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.TargetEncoder.html
622- https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html
623- https://scikit-learn.org/stable/modules/preprocessing.html

Upstream references

  • https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.TargetEncoder.html
  • https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html
  • https://scikit-learn.org/stable/modules/preprocessing.html
Raw lines 619 to 623