Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[Lane 2 · kotlin-core] F1Score metric

Aperta
#1,229 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-3 ore
Idoneità per principianti
57/100
Tipo di issue
Funzionalità
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
kotlin

Direzione di ricerca

Read Precision.kt and Recall.kt from the blocking issues, then inspect the accumulator and Metric.kt before implementing F1Score.kt at the specified core path. Add the specified tests in F1ScoreTest.kt and run the JVM metrics tests plus the API dump command. Done means the listed cases pass and the public API appears in the dump; this issue is blocked by #1227 and #1228 (or at least #1226).

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

coding good first issue size:s skill:kotlin-core sub-issue training

Sub-issue of #1222 (Precision, Recall and F1Score metrics).

Lane: 2 · Kotlin core
Skill needed: Kotlin. Read Precision.kt / Recall.kt from #1227 / #1228 first — F1Score composes their formulas over one accumulator.
Size: s (~2–3 h)
Blocked by: #1227 and #1228 (or at least #1226 — F1 only needs the accumulator, but its tests cross-check against Precision/Recall).

What to do

  1. Add public class F1Score(averaging: Averaging = Averaging.MACRO, dim: Int = -1, threshold: Float? = null) : Metric
    in skainet-lang/skainet-lang-core/src/commonMain/kotlin/sk/ainet/lang/nn/metrics/F1Score.kt:
    • override val name = "f1";
    • one private ConfusionMatrixAccumulator — do not hold a Precision and a
      Recall and call update() on both; that walks every batch twice;
    • compute() = reduce(acc.counts(), averaging) { tp, fp, fn -> per-class F1 } where
      per-class F1 = 2·tp / (2·tp + fp + fn) (algebraically 2PR/(P+R), but this form has
      a single zero-division check: 0.0 when 2·tp + fp + fn == 0).
    • Note that for MACRO, F1 is the mean of per-class F1s — not the F1 of macro-P and
      macro-R. Say so in the KDoc; it is the most common F1 implementation mistake.
  2. Factories: public fun f1Score(averaging: Averaging = Averaging.MACRO, dim: Int = -1): Metric
    and public fun binaryF1Score(threshold: Float = 0.5f): Metric.
  3. Tests in skainet-backends/skainet-backend-cpu/src/commonTest/kotlin/sk/ainet/exec/metrics/F1ScoreTest.kt,
    reference fixture pred [2,0,1,2], target [2,1,1,0]:
    • macro F1 → 0.4444 (per-class [0, 0.667, 0.667]), and assert it is not
      2·0.5·0.5/(0.5+0.5) = 0.5 — the mean-of-F1s vs. F1-of-means trap;
    • micro F1 → 0.5, equal to micro precision, micro recall and accuracy;
    • binary with threshold on 2-class logits, hand-computed;
    • a class with TP+FP+FN = 0 contributes 0.0; fresh metric compute() is 0.0;
    • accumulation across two update() calls equals one concatenated call;
    • computeForBatch (from Metric.kt) round-trips through reset().
  4. ./gradlew :skainet-lang:skainet-lang-core:apiDump and
    ./gradlew :skainet-backends:skainet-backend-cpu:jvmTest --tests "sk.ainet.exec.metrics.*".

Acceptance

  • F1Score + f1Score() + binaryF1Score() public and in the API dump
  • All test cases above pass on JVM
  • Batches are walked once per update()
  • PR body states "unit tests only; ground-truth wiring tracked in SKEEP-005 (#1223)"

Notes

Reference: sklearn f1_score docs — https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html ;
torchmetrics F1Score — https://lightning.ai/docs/torchmetrics/stable/classification/f1_score.html .
Closing this issue is what unblocks the platform-parity lane (#1230–#1233) and review (#1235).

Lingua principale
Kotlin
Stelle
52
Fork
15
Merge medio
1g 15h
PR unite (30g)
36

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di SKaiNET-developers/SKaiNET

Tutte le issue di SKaiNET-developers/SKaiNET

Issue simili

Altre issue su Kotlin

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.