[Lane 2 · kotlin-core] F1Score metric
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 57/100
- Issue type
- Feature
- Clarity
- Clearly specified
- Activity status
- Quiet
- Tech stack
- kotlin
- Domain
- machine-learning
Research direction
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).
Written by the indexing model from the issue text.
Description
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
- Add
public class F1Score(averaging: Averaging = Averaging.MACRO, dim: Int = -1, threshold: Float? = null) : Metric
inskainet-lang/skainet-lang-core/src/commonMain/kotlin/sk/ainet/lang/nn/metrics/F1Score.kt:override val name = "f1";- one private
ConfusionMatrixAccumulator— do not hold aPrecisionand a
Recalland callupdate()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)(algebraically2PR/(P+R), but this form has
a single zero-division check:0.0when2·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.
- Factories:
public fun f1Score(averaging: Averaging = Averaging.MACRO, dim: Int = -1): Metric
andpublic fun binaryF1Score(threshold: Float = 0.5f): Metric. - Tests in
skainet-backends/skainet-backend-cpu/src/commonTest/kotlin/sk/ainet/exec/metrics/F1ScoreTest.kt,
reference fixturepred [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 metriccompute()is0.0; - accumulation across two
update()calls equals one concatenated call; computeForBatch(fromMetric.kt) round-trips throughreset().
- macro F1 → 0.4444 (per-class
./gradlew :skainet-lang:skainet-lang-core:apiDumpand
./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).
- Dominant language
- Kotlin
- Stars
- 52
- Forks
- 15
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 37
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from SKaiNET-developers/SKaiNET
-
coding good first issue platform size:xs skill:js sub-issue
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SKaiNET-developers/SKaiNET#1232 ·
Maintainers usually reply within 1 day
-
skeep tracking
Difficulty 5/5 Over a week Newbie friendliness 15/100
SKaiNET-developers/SKaiNET#1331 · 1 comment ·
Maintainers usually reply within 1 day
-
assessment size:s skill:review sub-issue
Difficulty 4/5 1-2 days Newbie friendliness 18/100
SKaiNET-developers/SKaiNET#1330 ·
Maintainers usually reply within 1 day
-
documentation good first issue size:s skill:docs sub-issue
Difficulty 3/5 1-2 days Newbie friendliness 78/100
SKaiNET-developers/SKaiNET#1329 ·
Maintainers usually reply within 1 day
-
coding good first issue size:s skill:kotlin-core sub-issue
Difficulty 3/5 Half a day Newbie friendliness 75/100
SKaiNET-developers/SKaiNET#1328 ·
Maintainers usually reply within 1 day
All issues in SKaiNET-developers/SKaiNET
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
saisaharsh3/Leftovers#13 · 1 comment ·
-
Difficulty 1/5 Under an hour Newbie friendliness 67/100
navikt/esyfo-narmesteleder#700 ·
Maintainers usually reply within 1 day
-
A2A agent card served at agent.json, but A2A 0.3.0 uses agent-card.jsonPossibly taken @hadirsa claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
embabel/embabel-agent#2142 ·
Maintainers usually reply within 1 day
-
bug feedback required
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
streetcomplete/StreetComplete#7275 · 3 comments ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
Kotlin/kotlin-lsp#288 ·