Skip to content

Commit a954cc6

Browse files
committed
[ML] Update to new client & more strict conversion
1 parent 9f435f6 commit a954cc6

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

x-pack/plugins/ml/public/application/components/data_grid/feature_importance/decision_path_classification.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import React, { FC, useMemo, useState } from 'react';
88
import { i18n } from '@kbn/i18n';
99
import { EuiHealth, EuiSpacer, EuiSuperSelect, EuiTitle } from '@elastic/eui';
1010
import d3 from 'd3';
11-
import { isDecisionPathData, useDecisionPathData } from './use_classification_path_data';
11+
import {
12+
isDecisionPathData,
13+
useDecisionPathData,
14+
getStringBasedClassName,
15+
} from './use_classification_path_data';
1216
import { FeatureImportance, TopClasses } from '../../../../../common/types/feature_importance';
1317
import { DecisionPathChart } from './decision_path_chart';
1418
import { MissingDecisionPathCallout } from './missing_decision_path_callout';
@@ -20,27 +24,25 @@ interface ClassificationDecisionPathProps {
2024
topClasses: TopClasses;
2125
}
2226

23-
// cast to 'True' | 'False' | value to match Eui display
24-
const getStr = (v: string | boolean): string =>
25-
typeof v === 'boolean' ? (v ? 'True' : 'False') : v;
26-
2727
export const ClassificationDecisionPath: FC<ClassificationDecisionPathProps> = ({
2828
featureImportance,
2929
predictedValue,
3030
topClasses,
3131
predictionFieldName,
3232
}) => {
33-
const [currentClass, setCurrentClass] = useState<string>(getStr(topClasses[0].class_name));
33+
const [currentClass, setCurrentClass] = useState<string>(
34+
getStringBasedClassName(topClasses[0].class_name)
35+
);
3436
const { decisionPathData } = useDecisionPathData({
3537
featureImportance,
3638
predictedValue: currentClass,
3739
});
3840
const options = useMemo(() => {
39-
const predictionValueStr = getStr(predictedValue);
41+
const predictionValueStr = getStringBasedClassName(predictedValue);
4042

4143
return Array.isArray(topClasses)
4244
? topClasses.map((c) => {
43-
const className = getStr(c.class_name);
45+
const className = getStringBasedClassName(c.class_name);
4446
return {
4547
value: className,
4648
inputDisplay:

x-pack/plugins/ml/public/application/components/data_grid/feature_importance/use_classification_path_data.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ export const isDecisionPathData = (decisionPathData: any): boolean => {
3434
decisionPathData[0].length === 3
3535
);
3636
};
37+
38+
// cast to 'True' | 'False' | value to match Eui display
39+
export const getStringBasedClassName = (v: string | boolean | undefined | number): string => {
40+
if (v === undefined) {
41+
return '';
42+
}
43+
if (typeof v === 'boolean') {
44+
return v ? 'True' : 'False';
45+
}
46+
if (typeof v === 'number') {
47+
return v.toString();
48+
}
49+
return v;
50+
};
51+
3752
export const useDecisionPathData = ({
3853
baseline,
3954
featureImportance,
@@ -139,7 +154,7 @@ export const buildClassificationDecisionPathData = ({
139154
ExtendedFeatureImportance | undefined
140155
> = featureImportance.map((feature) => {
141156
const classFeatureImportance = Array.isArray(feature.classes)
142-
? feature.classes.find((c) => c.class_name === currentClass)
157+
? feature.classes.find((c) => getStringBasedClassName(c.class_name) === currentClass)
143158
: feature;
144159
if (classFeatureImportance && typeof classFeatureImportance[FEATURE_IMPORTANCE] === 'number') {
145160
return {

x-pack/plugins/ml/server/models/data_frame_analytics/feature_importance.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7-
import { ILegacyScopedClusterClient } from 'kibana/server';
7+
import { IScopedClusterClient } from 'kibana/server';
88
import { getPredictionFieldName, isRegressionAnalysis } from '../../../common/util/analytics_utils';
99

1010
// Obtains data for the data frame analytics feature importance functionalities
1111
// such as baseline, decision paths, or importance summary.
1212
export function analyticsFeatureImportanceProvider({
13-
callAsCurrentUser,
14-
callAsInternalUser,
15-
}: ILegacyScopedClusterClient) {
13+
asInternalUser,
14+
asCurrentUser,
15+
}: IScopedClusterClient) {
1616
async function getRegressionAnalyticsBaseline(analyticsId: string): Promise<number | undefined> {
17-
const results = await callAsInternalUser('ml.getDataFrameAnalytics', {
18-
analyticsId,
17+
const { body } = await asInternalUser.ml.getDataFrameAnalytics({
18+
id: analyticsId,
1919
});
20-
const jobConfig = results.data_frame_analytics[0];
20+
const jobConfig = body.data_frame_analytics[0];
2121
if (!isRegressionAnalysis) return undefined;
2222
const destinationIndex = jobConfig.dest.index;
2323
const predictionField = getPredictionFieldName(jobConfig.analysis);
@@ -46,7 +46,7 @@ export function analyticsFeatureImportanceProvider({
4646
},
4747
};
4848
let baseline;
49-
const aggregationResult = await callAsCurrentUser('search', params);
49+
const { body: aggregationResult } = await asCurrentUser.search(params);
5050
if (aggregationResult) {
5151
baseline = aggregationResult.aggregations.featureImportanceBaseline.value;
5252
}

0 commit comments

Comments
 (0)