File size: 3,837 Bytes
4cba5e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
---
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.* ๐Ÿ‡ฎ๐Ÿ‡ฉ