feature: add workshop 3 template
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
# Workshop 3 Feature Engineering: Melbourne Housing Dataset
|
||||
|
||||
Aufbereitung des **Melbourne Housing Datasets** für Supervised Learning, gemäss
|
||||
den in Workshop 2 erarbeiteten und konsolidierten Empfehlungen.
|
||||
|
||||
- **Input:** `data/melb_data.csv` (Rohdaten)
|
||||
- **Output:** `data/melb_data_prep.csv` (aufbereitet)
|
||||
- **Pipeline:** `src/prepare.py`
|
||||
|
||||
Die Empfehlungen stammen aus der EDA in Workshop 2. Dieses README ist die
|
||||
einzige Quelle der Wahrheit für die anzuwendenden Transformationen, das
|
||||
ursprüngliche `WS_03_Empfehlungen.xlsx` muss nicht geöffnet werden.
|
||||
|
||||
## Aufgabenstellung
|
||||
|
||||
Das Dataset wurde in Workshop 2 mit Sicht auf Machine Learning untersucht.
|
||||
Die daraus abgeleiteten Empfehlungen (siehe unten) werden hier in einer
|
||||
deterministischen Pipeline `CSV rein → CSV raus` implementiert. Es findet
|
||||
keine neue Exploration statt, die Entscheidungen sind bereits getroffen.
|
||||
|
||||
## Drehbuch (Transformationsliste)
|
||||
|
||||
### 1. Data Frame
|
||||
|
||||
| # | Transformation | Details |
|
||||
|-----|----------------|---------|
|
||||
| 1.1 | Beobachtungen nach Bedingung entfernen | `Price >= 8000000`; `YearBuilt == 1196` |
|
||||
| 1.2 | Duplikate entfernen | kein Bedarf |
|
||||
| 1.3 | Fragwürdige Variablen entfernen | `Unnamed: 0`, `Suburb`, `Address`, `SellerG`, `Postcode`, `Bedroom2` |
|
||||
| 1.4 | NAs ersetzen | kategoriale: Modalwert · numerische: Median |
|
||||
|
||||
### 2. Kategoriale Variablen
|
||||
|
||||
| # | Transformation | Details |
|
||||
|-----|----------------|---------|
|
||||
| 2.1 | Kardinalität reduzieren | `Regionname`: `* Victoria` → `Victoria` · `Method`: `SA` → `S` |
|
||||
| 2.2 | Faktorisieren | `CouncilArea` |
|
||||
| 2.3 | Ordinal encodieren | `Type`: `h, u, t` → `1, 2, 3` |
|
||||
| 2.4 | Binär encodieren | kein Bedarf |
|
||||
| 2.5 | Nominal encodieren (One-Hot) | alle verbleibenden kategorialen Variablen ausser `Date` |
|
||||
|
||||
### 3. Numerische Variablen
|
||||
|
||||
| # | Transformation | Details |
|
||||
|-----|----------------|---------|
|
||||
| 3.1 | Logarithmieren (+ umbenennen) | `Landsize` → `logLandsize` · `BuildingArea` → `logBuildingArea` |
|
||||
| 3.2 | Binär umcodieren | kein Bedarf |
|
||||
|
||||
### 4. Andere Tätigkeiten
|
||||
|
||||
| # | Transformation | Details |
|
||||
|-----|----------------|---------|
|
||||
| 4.1 | Konstruktion | `Date` → `month`, `year`, `day_of_week`; danach `Date` droppen |
|
||||
| 4.2 | Variablennamen bereinigen | unerwünschte Zeichen → `_` |
|
||||
| 4.3 | Standardisieren | kein Bedarf |
|
||||
| 4.4 | Speichern | als `melb_data_prep.csv` |
|
||||
|
||||
## Reihenfolge — wichtig
|
||||
|
||||
Die Schritte sind nicht beliebig vertauschbar. Insbesondere:
|
||||
|
||||
- **1.1 vor 1.4:** erst Ausreisser/fehlerhafte Zeilen raus, dann NAs füllen
|
||||
(sonst fliessen Schrottwerte in Median/Modalwert ein).
|
||||
- **2.1 vor 2.5:** erst Kardinalität reduzieren, dann One-Hot
|
||||
(sonst entstehen Dummy-Spalten für Levels, die man gerade zusammenlegen will).
|
||||
- **2.5 nach allen anderen kategorialen Schritten:** One-Hot greift alle
|
||||
*übrigen* `object`-Spalten ab — `CouncilArea` und `Type` sind dann schon
|
||||
numerisch und werden korrekt übersprungen.
|
||||
- **4.1 vor 2.5 ODER `Date` explizit ausnehmen:** `Date` ist `object` und würde
|
||||
sonst von One-Hot zerlegt. Lösung: `Date` beim One-Hot ignorieren und erst in
|
||||
4.1 zu `month`/`year`/`day_of_week` zerlegen.
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
workshop3
|
||||
├── data/
|
||||
│ ├── melb_data.csv # Rohdaten (Input)
|
||||
│ └── melb_data_prep.csv # aufbereitet (Output, generiert)
|
||||
├── src/
|
||||
│ └── prepare.py # Pipeline
|
||||
├── devenv.nix
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Ausführen
|
||||
|
||||
```sh
|
||||
cd src && python prepare.py
|
||||
```
|
||||
|
||||
## Offene Punkte / Selbstcheck
|
||||
|
||||
- [ ] `YearBuilt == 1196` verifizieren (vermutlich Tippfehler für 1996)
|
||||
- [ ] NA-Spalten prüfen -> sind NAs in der Target-Variable `Price`?
|
||||
(Falls ja: Zeilen entfernen statt Median einsetzen.)
|
||||
- [ ] Standardisieren bleibt hier aus -> relevant erst beim Training,
|
||||
und modellabhängig (Bäume brauchen es nicht).
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"nodes": {
|
||||
"devenv": {
|
||||
"locked": {
|
||||
"dir": "src/modules",
|
||||
"lastModified": 1779303056,
|
||||
"narHash": "sha256-+DJSNTtrdUb5yelcKp8fa5aITlg050701WCOJt0oMtI=",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"rev": "0d0be23517b92cbcedd95a0dbb6f735deae9b38c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"dir": "src/modules",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"inputs": {
|
||||
"nixpkgs-src": "nixpkgs-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778507786,
|
||||
"narHash": "sha256-HzSQCKMsMr8r55LwM1JuzIOB+8bzk0FEv6sItKvsfoY=",
|
||||
"owner": "cachix",
|
||||
"repo": "devenv-nixpkgs",
|
||||
"rev": "8f24a228a782e24576b155d1e39f0d914b380691",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"ref": "rolling",
|
||||
"repo": "devenv-nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-python": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779117433,
|
||||
"narHash": "sha256-iKhNJH1ABTrPvDF6Sd1U+GCVYSh8Xn88ee10ko7PvvE=",
|
||||
"owner": "cachix",
|
||||
"repo": "nixpkgs-python",
|
||||
"rev": "a0f88fb785debcb0a201d0ce311a2e3d829e4a1b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "nixpkgs-python",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1778274207,
|
||||
"narHash": "sha256-I4puXmX1iovcCHZlRmztO3vW0mAbbRvq4F8wgIMQ1MM=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "b3da656039dc7a6240f27b2ef8cc6a3ef3bccae7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"devenv": "devenv",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-python": "nixpkgs-python"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{ pkgs, lib, config, ... }:
|
||||
|
||||
{
|
||||
languages.python = {
|
||||
enable = true;
|
||||
version = "3.12";
|
||||
venv.enable = true;
|
||||
venv.requirements = ''
|
||||
imbalanced-learn
|
||||
ipython
|
||||
jupyter
|
||||
jupyterlab
|
||||
matplotlib
|
||||
numpy
|
||||
pandas
|
||||
scikit-learn
|
||||
seaborn
|
||||
setuptools<81
|
||||
statsmodels
|
||||
ydata-profiling
|
||||
'';
|
||||
};
|
||||
|
||||
packages = [
|
||||
pkgs.graphviz
|
||||
pkgs.zsh
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
inputs:
|
||||
nixpkgs-python:
|
||||
url: github:cachix/nixpkgs-python
|
||||
inputs:
|
||||
nixpkgs:
|
||||
follows: nixpkgs
|
||||
@@ -0,0 +1,30 @@
|
||||
"""
|
||||
Workshop 3 Feature Engineering Pipeline für das Melbourne Housing Dataset.
|
||||
|
||||
Wendet die in Workshop 2 erarbeiteten Empfehlungen (WS_03_Empfehlungen.xlsx)
|
||||
auf melb_data.csv an und schreibt melb_data_prep.csv.
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
RAW = "data/melb_data.csv"
|
||||
OUT = "data/melb_data_prep.csv"
|
||||
|
||||
|
||||
def load(path: str = RAW) -> pd.DataFrame:
|
||||
return pd.read_csv(path)
|
||||
|
||||
|
||||
def inspect(df: pd.DataFrame) -> None:
|
||||
"""Annahmen des Drehbuchs verifizieren -> wird in der Pipeline nicht aufgerufen."""
|
||||
print(df.shape)
|
||||
print(df.info())
|
||||
print(df.isna().sum()[df.isna().sum() > 0]) # NAs pro Spalte
|
||||
print(df.Price.sort_values().tail(5)) # Price-Ausreisser?
|
||||
print(df.YearBuilt.sort_values().head(5)) # das ominöse 1196
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data = load()
|
||||
inspect(data)
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user