Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds

Feature Engineering

Feature Engineering to sztuka tworzenia nowych cech (features) z surowych danych - kluczowa dla ML!

Transformacje numeryczne

1import pandas as pd
2import numpy as np
3
4df = pd.DataFrame({
5    'population': [120, 450, 85, 200, 5000],
6    'area_km2': [100, 500, 50, 200, 10000],
7    'year_observed': [2020, 2021, 2019, 2022, 2023]
8})
9
10# Logarytm - dla skośnych rozkładów
11df['log_population'] = np.log1p(df['population'])
12
13# Standaryzacja (Z-score)
14df['pop_standardized'] = (df['population'] - df['population'].mean()) / df['population'].std()
15
16# Normalizacja (Min-Max)
17df['pop_normalized'] = (df['population'] - df['population'].min()) / (df['population'].max() - df['population'].min())
18
19# Binning - podział na kategorie
20df['pop_category'] = pd.cut(
21    df['population'],
22    bins=[0, 100, 300, 1000, float('inf')],
23    labels=['small', 'medium', 'large', 'huge']
24)
25
26# Kwantyle
27df['pop_quartile'] = pd.qcut(df['population'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])

Feature creation

1# Ratio features
2df['density'] = df['population'] / df['area_km2']
3
4# Polynomial features
5df['area_squared'] = df['area_km2'] ** 2
6df['area_sqrt'] = np.sqrt(df['area_km2'])
7
8# Interaction features
9df['pop_area_interaction'] = df['population'] * df['area_km2']
10
11# Aggregated features (np. z grupowania)
12df['pop_vs_mean'] = df['population'] / df['population'].mean()

Encoding kategorii

1# Dane z kategoriami
2df = pd.DataFrame({
3    'species': ['Lion', 'Elephant', 'Cheetah', 'Lion', 'Elephant'],
4    'habitat': ['Savanna', 'Forest', 'Savanna', 'Forest', 'Savanna'],
5    'endangered': ['Yes', 'No', 'Yes', 'No', 'No']
6})
7
8# One-Hot Encoding
9df_encoded = pd.get_dummies(df, columns=['species', 'habitat'])
10
11# Label Encoding
12from sklearn.preprocessing import LabelEncoder
13le = LabelEncoder()
14df['species_encoded'] = le.fit_transform(df['species'])
15
16# Ordinal Encoding (dla uporządkowanych kategorii)
17danger_map = {'Low': 0, 'Medium': 1, 'High': 2}
18df['danger_level'] = df['danger'].map(danger_map)
19
20# Binary Encoding
21df['endangered_binary'] = (df['endangered'] == 'Yes').astype(int)

Feature z dat

1df = pd.DataFrame({
2    'observation_date': pd.date_range('2023-01-01', periods=100, freq='D')
3})
4
5# Wyciąganie komponentów daty
6df['year'] = df['observation_date'].dt.year
7df['month'] = df['observation_date'].dt.month
8df['day'] = df['observation_date'].dt.day
9df['day_of_week'] = df['observation_date'].dt.dayofweek  # 0=Monday
10df['is_weekend'] = df['day_of_week'].isin([5, 6]).astype(int)
11df['quarter'] = df['observation_date'].dt.quarter
12df['day_of_year'] = df['observation_date'].dt.dayofyear
13
14# Cykliczne kodowanie (dla sezonowości)
15df['month_sin'] = np.sin(2 * np.pi * df['month'] / 12)
16df['month_cos'] = np.cos(2 * np.pi * df['month'] / 12)

Feature z tekstu

1df = pd.DataFrame({
2    'description': [
3        'Large male lion spotted near river',
4        'Small elephant calf with mother',
5        'Fast cheetah hunting gazelle',
6    ]
7})
8
9# Długość tekstu
10df['text_length'] = df['description'].str.len()
11df['word_count'] = df['description'].str.split().str.len()
12
13# Obecność słów kluczowych
14df['has_river'] = df['description'].str.contains('river').astype(int)
15df['has_hunting'] = df['description'].str.contains('hunt').astype(int)
16
17# TF-IDF (dla ML)
18from sklearn.feature_extraction.text import TfidfVectorizer
19tfidf = TfidfVectorizer(max_features=100)
20tfidf_features = tfidf.fit_transform(df['description'])

Pipeline z sklearn

1from sklearn.pipeline import Pipeline
2from sklearn.preprocessing import StandardScaler, OneHotEncoder
3from sklearn.compose import ColumnTransformer
4
5# Definiuj transformacje
6numeric_features = ['population', 'area_km2']
7categorical_features = ['habitat']
8
9preprocessor = ColumnTransformer([
10    ('num', StandardScaler(), numeric_features),
11    ('cat', OneHotEncoder(drop='first'), categorical_features)
12])
13
14# Użycie w pipeline
15pipeline = Pipeline([
16    ('preprocessor', preprocessor),
17    # ('model', SomeModel())
18])
Przejdź do CodeWorlds