DockerSpace / frontend /src /utils /predictionReliability.ts
DennisChan0909's picture
Clarify prediction reliability display
0cafa73
Raw
History Blame Contribute Delete
3.39 kB
export type PredictionConfidence = 'HIGH' | 'MEDIUM' | 'LOW'
export type ReliabilityLevel = PredictionConfidence | 'PENDING' | 'UNKNOWN'
const confidenceRank: Record<PredictionConfidence, number> = {
LOW: 0,
MEDIUM: 1,
HIGH: 2,
}
const confidenceByRank: Record<number, PredictionConfidence> = {
0: 'LOW',
1: 'MEDIUM',
2: 'HIGH',
}
export const confidenceColor: Record<PredictionConfidence, string> = {
HIGH: 'text-green-400',
MEDIUM: 'text-yellow-400',
LOW: 'text-red-400',
}
export const confidenceZh: Record<PredictionConfidence, string> = {
HIGH: '高信心',
MEDIUM: '中信心',
LOW: '低信心',
}
const reliabilityColor: Record<ReliabilityLevel, string> = {
HIGH: 'text-green-400',
MEDIUM: 'text-yellow-400',
LOW: 'text-red-400',
PENDING: 'text-yellow-300',
UNKNOWN: 'text-slate-300',
}
const reliabilityZh: Record<ReliabilityLevel, string> = {
HIGH: '高可靠度',
MEDIUM: '中可靠度',
LOW: '低可靠度',
PENDING: '計算中',
UNKNOWN: '尚無',
}
export interface PredictionReliabilitySummary {
level: ReliabilityLevel
levelText: string
levelColor: string
confidenceText: string
confidenceColor: string
accuracyText: string
accuracyColor: string
hasModelAccuracy: boolean
warning?: string
}
function clampConfidence(
confidence: PredictionConfidence,
maxConfidence: PredictionConfidence
): PredictionConfidence {
const rank = Math.min(confidenceRank[confidence], confidenceRank[maxConfidence])
return confidenceByRank[rank]
}
export function getPredictionReliabilitySummary({
confidence,
trainingAccuracy,
isQuick = false,
}: {
confidence: PredictionConfidence
trainingAccuracy?: number | null
isQuick?: boolean
}): PredictionReliabilitySummary {
const hasModelAccuracy = !isQuick
&& Number.isFinite(trainingAccuracy)
&& Number(trainingAccuracy) > 0
const accuracyText = hasModelAccuracy
? `${(Number(trainingAccuracy) * 100).toFixed(1)}%`
: isQuick ? 'ML 計算中' : '尚無'
const confidenceText = `${confidence} (${confidenceZh[confidence]})`
if (!hasModelAccuracy) {
const level: ReliabilityLevel = isQuick ? 'PENDING' : 'UNKNOWN'
return {
level,
levelText: reliabilityZh[level],
levelColor: reliabilityColor[level],
confidenceText,
confidenceColor: confidenceColor[confidence],
accuracyText,
accuracyColor: isQuick ? 'text-yellow-300' : 'text-slate-300',
hasModelAccuracy,
}
}
const accuracy = Number(trainingAccuracy)
let level: PredictionConfidence = confidence
let warning: string | undefined
if (accuracy < 0.5) {
level = 'LOW'
warning = confidence === 'HIGH'
? '高信心但模型品質偏弱,請謹慎參考。'
: '模型近期驗證準確率低於 50%,請謹慎參考。'
} else if (accuracy < 0.6) {
level = clampConfidence(confidence, 'MEDIUM')
warning = confidence === 'HIGH'
? '模型近期驗證準確率未達 60%,高信心訊號降為中可靠度。'
: undefined
}
return {
level,
levelText: `${level} (${reliabilityZh[level]})`,
levelColor: reliabilityColor[level],
confidenceText,
confidenceColor: confidenceColor[confidence],
accuracyText,
accuracyColor: accuracy < 0.5 ? 'text-red-300' : accuracy < 0.6 ? 'text-yellow-300' : 'text-slate-200',
hasModelAccuracy,
warning,
}
}