--- license: mit tags: - regression - tabular-regression - scikit-learn - statsmodels - fisheries - vessel-length-estimation datasets: - custom --- # 🌊 POSEIDON: Phase 0 ⚡ Prediksi Length Kapal Ikan dari Gross Tonnage (GT) ⚡ ![Python](https://img.shields.io/badge/Python-3.10%2B-blue) ![Statsmodels](https://img.shields.io/badge/Statsmodels-0.14%2B-brightgreen) ![Scikit-Learn](https://img.shields.io/badge/Scikit--Learn-1.3%2B-blue) ![Hugging Face](https://img.shields.io/badge/Hugging%20Face-Ready-yellow) Sistem regresi untuk mengestimasi panjang (*Length*, dalam meter) kapal ikan berdasarkan nilai *Gross Tonnage* (GT). Model ini dilatih dari data gabungan **Global Fishing Watch (GFW) Vessels API** dan **EU Fleet Register**, sebagai bagian dari tahap awal (Phase 0) *pipeline* POSEIDON (Patrol Oriented SAR Enabled IUU Detection Over Indonesian Natuna). [Model Details](#-model-details) • [Data Training](#-data-training) • [Usage](#-cara-pakai) • [Contributors](#-contributors) --- ## 🎯 Model Details Model dipilih otomatis dengan membandingkan RMSE antara dua kandidat formula (*Linear Regression* dan *Log-Log Power Regression*) pada data uji, lalu di-*fit* ulang dengan OLS (*statsmodels*) pada keseluruhan data untuk formula final. - **Tipe model**: `log_log_power_regression` - **Formula**: `Length = a * GT^b` - **Koefisien**: `{"a": 5.7251, "b": 0.3088}` - **Fitur input**: GT (*Gross Tonnage*) - **Target output**: Length (meter) - **R-squared**: 0.9491 - **Jumlah observasi training**: 79,902 --- ## 📊 Data Training - **Sumber**: Global Fishing Watch Vessels API (`public-global-vessel-identity:latest`) & EU Fleet Register - **Jumlah baris bersih**: 79,902 (duplikat dihapus, nilai non-positif dibuang, outlier 1%–99% persentil dipotong) - **Rentang GT & Length**: Sesuai dengan distribusi kapal perikanan standar pada dataset GFW. --- ## 📁 Repository Structure (Phase 0) | Berkas | Deskripsi | |---|---| | `poseidon_length_model.pkl` | Objek model asli (statsmodels OLS), dimuat dengan `joblib.load()` | | `model_config.json` | Koefisien model dalam format ringan, tanpa *dependency* | | `predict.py` | Script mandiri untuk prediksi memakai `model_config.json` | | `POSEIDON_training_dataset_Length_Regression.xlsx` | Dataset final (GT, Length) yang dipakai untuk training | --- ## 🚀 Cara Pakai ### Opsi 1: Tanpa *dependency* (Disarankan) Pendekatan ini sangat ringan karena hanya membutuhkan Python bawaan dan `model_config.json`. ```python import json with open("model_config.json") as f: cfg = json.load(f) def predict_length(gt_value, cfg): coef = cfg["coefficients"] if cfg["model_type"] == "log_log_power_regression": return coef["a"] * (gt_value ** coef["b"]) return coef["intercept"] + coef["slope"] * gt_value # Contoh prediksi untuk kapal dengan GT 150 print(predict_length(150, cfg)) ``` ### Opsi 2: Dengan `statsmodels` (Objek model asli) ```python import joblib model = joblib.load("poseidon_length_model.pkl") # Sesuaikan input dengan kebutuhan (misal log GT dan constant) # print(model.predict([1, 150])) ``` --- ## ⚠️ Keterbatasan - Model hanya memakai satu fitur tunggal (GT), tidak memperhitungkan jenis alat tangkap (*geartype*), bendera negara, atau desain spesifik kapal. - Prediksi pada nilai GT yang jauh melampaui rentang *training* bersifat ekstrapolasi dan berisiko kurang andal. - Data GT dan Length bersumber dari registri publik internasional yang mungkin mengandung *noise* pelaporan. --- ## 👨‍💻 Contributors Dipersembahkan oleh Tim Mahasiswa dari **Universitas Negeri Surabaya**: - **Faishal Muflih Irfanu Tsaqib** - **Daffa Ahmad Pangreksa** - **Dimas Rafi Izzulhaq** *Dibuat untuk mendukung penjagaan kedaulatan maritim dan kelestarian sumber daya laut Indonesia.* 🇮🇩