---
# System prepended metadata

title: Feature Engineering Teachniques
tags: [Machine Learning, Feature Engineering]

---

# Feature Engineering Teachniques

###### tags: `Machine Learning`, `Feature Engineering`

## 1. Missing Data Imputation

- Complete Case Analysis (Remove row)
- Mean/Median
- Arbitrary value (Điền 1 số cụ thể # range của trường đó)
- Mode
- Missing Category (Điền giá trị "Missing")
- Random theo phân phối xác suất trường đó
- Missing Indicator (Tạo cột mới và đánh dấu trường miss là 1)
- KNN
- MICE

#### Code Simple method
```python=
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer

features_numeric = ['BsmtUnfSF', 'LotFrontage', 'MasVnrArea', ]
features_categoric = ['BsmtQual', 'FireplaceQu', 'MSZoning',
                      'Street', 'Alley']

preprocessor = ColumnTransformer(transformers=[
    ('numeric_imputer', SimpleImputer(strategy='mean'), features_numeric),
    ('categoric_imputer', SimpleImputer(strategy='most_frequent'), features_categoric),
    ('imputer_LotFrontAge', SimpleImputer(
        strategy='constant', fill_value=999), ['LotFrontage'])
])
```

#### Code KNN
```python=
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV

pipe = Pipeline(steps=[
    ('imputer', KNNImputer(
        n_neighbors=5,
        weights='distance',
        add_indicator=False)),
    
    ('scaler', StandardScaler()),
    ('regressor', Lasso(max_iter=2000)),
])

param_grid = {
    'imputer__n_neighbos': [3,5,10],
    'imputer__weights': ['uniform', 'distance'],
    'imputer__add_indicator': [True, False],
    'regressor__alpha': [10, 100, 200],
}

grid_search = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='r2')

grid_search.fit(X_train, y_train)
```

#### Code MICE
```python=
from sklearn.impute import IterativeImputer
imputer = IterativeImputer(
    estimator=BayesianRidge(), # the estimator to predict the NA (KNeighborsRegressor(n_neighbors=5),DecisionTreeRegressor(max_features='sqrt', random_state=0),)
    initial_strategy='mean', # how will NA be imputed in step 1
    max_iter=10, # number of cycles
    imputation_order='ascending', # the order in which to impute the variables
    n_nearest_features=None, # whether to limit the number of predictors
    skip_complete=True, # whether to ignore variables without NA
    random_state=0,
)

imputer.fit(X_train)
train_t = imputer.transform(X_train)
```

## 2. Category Encoding
- One hot
- Top one hot
- Integer Encoding
- Count/Frequence Encoding
- Mean Encoding
- Ratio Encoding
- Weigh of Evidence
- Rare Encoding

## 3. Variable Transformation
-> Transform data to a normal distribution

- Logarit: np.log(X)
- Reciprocal: 1/X
- Square root: X**(1/2)
- Exp: X**k
- Box-Cox
- Yeo-Johnson

## 4. Descretisation
-> Process of transforming continuous variables into discrete variables.
- Equal-width
- Equal-frequency
- K-means
- Decision Trees

## 5. Outlier Handling
- **Trimming**: remove outliers from data
- **Treat outliers as missing data**
- **Discrestisation**: place outliers in border bins
- **Censoring**: Capping

## 6. Feature Scaling
- Standardisation [0,1]: $x_i = \frac{x_i - \mu}{\sigma}$

- Mean Normalisation [-1, 1]: $x_i = \frac{x_i - \mu}{x_{max} - x_{min}}$

- MinMaxScaling [0,1]: $x_i = \frac{x_i - x_{min}}{x_{max} - x_{min}}$

- MaxAbsScaling [-1, 1]: $x_i = \frac{x_i}{x_{|max|}}$

- RobustScaling: $x_i = \frac{x_i - \mu}{IQR}$ (Handle outlier)

- Scaling to Unit norm: 



