Spaces:
Running
Running
fix (performance overview): Use normalized scores for radar plots.
Browse files
src/views/model-comparator/ModelComparator.tsx
CHANGED
@@ -666,7 +666,7 @@ export default function ModelComparator({
|
|
666 |
<Slider
|
667 |
ariaLabelInput="Lower bound"
|
668 |
unstable_ariaLabelInputUpper="Upper bound"
|
669 |
-
labelText={
|
670 |
value={
|
671 |
selectedMetricRange
|
672 |
? selectedMetricRange[0]
|
|
|
666 |
<Slider
|
667 |
ariaLabelInput="Lower bound"
|
668 |
unstable_ariaLabelInputUpper="Upper bound"
|
669 |
+
labelText={`Choose range`}
|
670 |
value={
|
671 |
selectedMetricRange
|
672 |
? selectedMetricRange[0]
|
src/views/performance-overview/Hide.module.scss
CHANGED
@@ -47,7 +47,7 @@
|
|
47 |
margin: 0 0 $spacing-03 $spacing-05;
|
48 |
padding: $spacing-05;
|
49 |
display: none;
|
50 |
-
column-gap: $spacing-
|
51 |
box-shadow: 0 0 5px 2px $gray-40;
|
52 |
}
|
53 |
|
@@ -72,3 +72,13 @@
|
|
72 |
.selector {
|
73 |
max-width: 30%;
|
74 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
margin: 0 0 $spacing-03 $spacing-05;
|
48 |
padding: $spacing-05;
|
49 |
display: none;
|
50 |
+
column-gap: $spacing-12;
|
51 |
box-shadow: 0 0 5px 2px $gray-40;
|
52 |
}
|
53 |
|
|
|
72 |
.selector {
|
73 |
max-width: 30%;
|
74 |
}
|
75 |
+
|
76 |
+
.selector label {
|
77 |
+
width: 100%;
|
78 |
+
}
|
79 |
+
|
80 |
+
.selectorLabel {
|
81 |
+
display: flex;
|
82 |
+
justify-content: space-between;
|
83 |
+
align-items: center;
|
84 |
+
}
|
src/views/performance-overview/Hide.tsx
CHANGED
@@ -80,11 +80,26 @@ export default function HidePanel({
|
|
80 |
</Tooltip>
|
81 |
{show ? (
|
82 |
<div className={cx(classes.container, show && classes.visible)}>
|
83 |
-
<div
|
|
|
|
|
|
|
84 |
<FilterableMultiSelect
|
85 |
id={'model--limiter'}
|
86 |
-
titleText=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
items={models}
|
|
|
88 |
itemToString={(item) => (item.name ? item.name : item.modelId)}
|
89 |
onChange={(event) => {
|
90 |
setIgnoredModels(event.selectedItems);
|
@@ -103,11 +118,26 @@ export default function HidePanel({
|
|
103 |
})}
|
104 |
</div>
|
105 |
</div>
|
106 |
-
<div
|
|
|
|
|
|
|
107 |
<FilterableMultiSelect
|
108 |
id={'metrics--limiter'}
|
109 |
-
titleText=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
items={metrics}
|
|
|
111 |
itemToString={(item) =>
|
112 |
item.displayName ? item.displayName : item.name
|
113 |
}
|
|
|
80 |
</Tooltip>
|
81 |
{show ? (
|
82 |
<div className={cx(classes.container, show && classes.visible)}>
|
83 |
+
<div
|
84 |
+
key={'models-limiter--' + `${ignoredModels === models}`}
|
85 |
+
className={classes.selector}
|
86 |
+
>
|
87 |
<FilterableMultiSelect
|
88 |
id={'model--limiter'}
|
89 |
+
titleText={
|
90 |
+
<div className={classes.selectorLabel}>
|
91 |
+
<span>Models</span>
|
92 |
+
<Button
|
93 |
+
kind="ghost"
|
94 |
+
size="sm"
|
95 |
+
onClick={() => setIgnoredModels(models)}
|
96 |
+
>
|
97 |
+
select all
|
98 |
+
</Button>
|
99 |
+
</div>
|
100 |
+
}
|
101 |
items={models}
|
102 |
+
initialSelectedItems={ignoredModels}
|
103 |
itemToString={(item) => (item.name ? item.name : item.modelId)}
|
104 |
onChange={(event) => {
|
105 |
setIgnoredModels(event.selectedItems);
|
|
|
118 |
})}
|
119 |
</div>
|
120 |
</div>
|
121 |
+
<div
|
122 |
+
key={'metrics-limiter--' + `${ignoredMetrics === metrics}`}
|
123 |
+
className={classes.selector}
|
124 |
+
>
|
125 |
<FilterableMultiSelect
|
126 |
id={'metrics--limiter'}
|
127 |
+
titleText={
|
128 |
+
<div className={classes.selectorLabel}>
|
129 |
+
<span>Metrics</span>
|
130 |
+
<Button
|
131 |
+
kind="ghost"
|
132 |
+
size="sm"
|
133 |
+
onClick={() => setIgnoredMetrics(metrics)}
|
134 |
+
>
|
135 |
+
select all
|
136 |
+
</Button>
|
137 |
+
</div>
|
138 |
+
}
|
139 |
items={metrics}
|
140 |
+
initialSelectedItems={ignoredMetrics}
|
141 |
itemToString={(item) =>
|
142 |
item.displayName ? item.displayName : item.name
|
143 |
}
|
src/views/performance-overview/PerformanceOverview.tsx
CHANGED
@@ -825,25 +825,48 @@ export default function PerformanceOverview({
|
|
825 |
<>
|
826 |
<RadarChart
|
827 |
data={humanMetricsData.map((entry) => {
|
|
|
828 |
const metric = metrics.find(
|
829 |
(m) => m.displayName === entry.metric,
|
830 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
831 |
return {
|
832 |
model: entry.model,
|
833 |
metric: entry.metric,
|
834 |
-
score:
|
835 |
-
metric && metric.maxValue
|
836 |
-
? Math.round(
|
837 |
-
(entry.score /
|
838 |
-
(typeof metric.maxValue === 'number'
|
839 |
-
? metric.maxValue
|
840 |
-
: castToNumber(
|
841 |
-
metric.maxValue?.value,
|
842 |
-
metric.values,
|
843 |
-
))) *
|
844 |
-
100,
|
845 |
-
) / 100
|
846 |
-
: entry.score,
|
847 |
};
|
848 |
})}
|
849 |
options={{
|
@@ -899,10 +922,50 @@ export default function PerformanceOverview({
|
|
899 |
data={algorithmicMetricsData
|
900 |
.sort((a, b) => (a.model > b.model ? -1 : 1))
|
901 |
.map((entry) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
902 |
return {
|
903 |
group: entry.model,
|
904 |
key: entry.metric,
|
905 |
-
value:
|
906 |
};
|
907 |
})}
|
908 |
options={{
|
|
|
825 |
<>
|
826 |
<RadarChart
|
827 |
data={humanMetricsData.map((entry) => {
|
828 |
+
// Step 1: Find metric under consideration
|
829 |
const metric = metrics.find(
|
830 |
(m) => m.displayName === entry.metric,
|
831 |
);
|
832 |
+
|
833 |
+
// Step 2: Calculate normalized score
|
834 |
+
let normalizedScore = entry.score;
|
835 |
+
if (
|
836 |
+
metric?.minValue !== undefined &&
|
837 |
+
metric.maxValue !== undefined
|
838 |
+
) {
|
839 |
+
// Step 2.a: Fetch minimum value
|
840 |
+
const minValue =
|
841 |
+
typeof metric.minValue === 'number'
|
842 |
+
? metric.minValue
|
843 |
+
: castToNumber(
|
844 |
+
metric.minValue?.value,
|
845 |
+
metric.values,
|
846 |
+
);
|
847 |
+
|
848 |
+
// Step 2.b: Fetch maximum value
|
849 |
+
const maxValue =
|
850 |
+
typeof metric.maxValue === 'number'
|
851 |
+
? metric.maxValue
|
852 |
+
: castToNumber(
|
853 |
+
metric.maxValue?.value,
|
854 |
+
metric.values,
|
855 |
+
);
|
856 |
+
|
857 |
+
// Step 2.c: Calculate min-max normalized score
|
858 |
+
normalizedScore =
|
859 |
+
Math.round(
|
860 |
+
((entry.score - minValue) / (maxValue - minValue)) *
|
861 |
+
100,
|
862 |
+
) / 100;
|
863 |
+
}
|
864 |
+
|
865 |
+
// Step 3: Return
|
866 |
return {
|
867 |
model: entry.model,
|
868 |
metric: entry.metric,
|
869 |
+
score: normalizedScore,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
870 |
};
|
871 |
})}
|
872 |
options={{
|
|
|
922 |
data={algorithmicMetricsData
|
923 |
.sort((a, b) => (a.model > b.model ? -1 : 1))
|
924 |
.map((entry) => {
|
925 |
+
// Step 1: Find metric under consideration
|
926 |
+
const metric = metrics.find(
|
927 |
+
(m) => m.displayName === entry.metric,
|
928 |
+
);
|
929 |
+
|
930 |
+
// Step 2: Calculate normalized score
|
931 |
+
let normalizedScore = entry.score;
|
932 |
+
|
933 |
+
if (
|
934 |
+
metric?.minValue !== undefined &&
|
935 |
+
metric.maxValue !== undefined
|
936 |
+
) {
|
937 |
+
// Step 2.a: Fetch minimum value
|
938 |
+
const minValue =
|
939 |
+
typeof metric.minValue === 'number'
|
940 |
+
? metric.minValue
|
941 |
+
: castToNumber(
|
942 |
+
metric.minValue?.value,
|
943 |
+
metric.values,
|
944 |
+
);
|
945 |
+
|
946 |
+
// Step 2.b: Fetch maximum value
|
947 |
+
const maxValue =
|
948 |
+
typeof metric.maxValue === 'number'
|
949 |
+
? metric.maxValue
|
950 |
+
: castToNumber(
|
951 |
+
metric.maxValue?.value,
|
952 |
+
metric.values,
|
953 |
+
);
|
954 |
+
|
955 |
+
// Step 2.c: Calculate min-max normalized score
|
956 |
+
normalizedScore =
|
957 |
+
Math.round(
|
958 |
+
((entry.score - minValue) /
|
959 |
+
(maxValue - minValue)) *
|
960 |
+
100,
|
961 |
+
) / 100;
|
962 |
+
}
|
963 |
+
|
964 |
+
// Step 3: Return
|
965 |
return {
|
966 |
group: entry.model,
|
967 |
key: entry.metric,
|
968 |
+
value: normalizedScore,
|
969 |
};
|
970 |
})}
|
971 |
options={{
|