Repository navigation
[Lane 2 · kotlin-core] Precision metric #1227
Copy link
Copy link
Open
Labels
codingImplementation task (DARC: C)Implementation task (DARC: C)good first issueGood for newcomers; no prior SKaiNET codebase knowledge assumedGood for newcomers; no prior SKaiNET codebase knowledge assumedsize:sA few hoursA few hoursskill:kotlin-coreKotlin implementation in commonMainKotlin implementation in commonMainsub-issueSub-issue of a tracking issueSub-issue of a tracking issuetrainingTraining pipeline, optimizers, lossTraining pipeline, optimizers, loss
Description
Sub-issue of #1222 (Precision, Recall and F1Score metrics).
Lane: 2 · Kotlin core
Skill needed: Kotlin. Read Accuracy.kt and ConfusionMatrixAccumulator first — this task is mostly wiring.
Size: s (~2–3 h)
Blocked by: #1226 (accumulator + Averaging)
What to do
- Add
public class Precision(averaging: Averaging = Averaging.MACRO, dim: Int = -1, threshold: Float? = null) : Metric
inskainet-lang/skainet-lang-core/src/commonMain/kotlin/sk/ainet/lang/nn/metrics/Precision.kt:override val name = "precision";update(...)delegates to a privateConfusionMatrixAccumulator(dim, threshold);compute()=reduce(acc.counts(), averaging) { tp, fp, fn -> if (tp + fp == 0L) 0.0 else tp.toDouble() / (tp + fp) };reset()delegates.
MirrorAccuracy.kt's KDoc style (what the metric means, thedim/thresholdsemantics, whataveragingdoes).
- Add factory functions at the bottom of the file mirroring
accuracy()/binaryAccuracy():
public fun precision(averaging: Averaging = Averaging.MACRO, dim: Int = -1): Metricand
public fun binaryPrecision(threshold: Float = 0.5f): Metric. - Tests in
skainet-backends/skainet-backend-cpu/src/commonTest/kotlin/sk/ainet/exec/metrics/PrecisionTest.kt,
copyingAccuracyTest.kt's tensor helpers. Cover, with hand-computed expected values
(see the parent issue and [Lane 1 · numerics] Precision/Recall/F1 — averaging-mode and zero-division conventions #1224 for the reference fixturepred [2,0,1,2],target [2,1,1,0]):- macro multi-class with
Int32index targets → 0.5; - micro multi-class → 0.5 (and assert it equals
Accuracyon the same batch); - the same batch with soft (
FP32one-hot) targets gives the same result; - binary with
threshold, 2-class logits; - accumulation across two
update()calls equals one call on the concatenated batch; - zero-division: a class with TP+FP+FN = 0 contributes
0.0(per [Lane 1 · numerics] Precision/Recall/F1 — averaging-mode and zero-division conventions #1224), and
compute()on a fresh metric returns0.0.
- macro multi-class with
./gradlew :skainet-lang:skainet-lang-core:apiDumpand
./gradlew :skainet-backends:skainet-backend-cpu:jvmTest --tests "sk.ainet.exec.metrics.*".
Acceptance
-
Precision+precision()+binaryPrecision()public and in the API dump - All six test cases above pass on JVM
- No duplicated argmax / iteration logic — everything goes through the accumulator
- PR links this issue and [Feature]: Precision, Recall and F1Score metrics #1222; PR body states "unit tests only; ground-truth wiring tracked in SKEEP-005 ([SKEEP-005]: Ground-truth validation for stateful metrics #1223)"
Notes
Precision answers "of what I predicted positive, how much was right". The twin task #1228 (Recall) is the same shape with tp / (tp + fn) — if you take both, fine, but they are filed separately so two people can each ship one.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
codingImplementation task (DARC: C)Implementation task (DARC: C)good first issueGood for newcomers; no prior SKaiNET codebase knowledge assumedGood for newcomers; no prior SKaiNET codebase knowledge assumedsize:sA few hoursA few hoursskill:kotlin-coreKotlin implementation in commonMainKotlin implementation in commonMainsub-issueSub-issue of a tracking issueSub-issue of a tracking issuetrainingTraining pipeline, optimizers, lossTraining pipeline, optimizers, loss
Activity