MCPcopy Create free account
hub / github.com/catboost/catboost / UnwindFeaturePath

Function UnwindFeaturePath

catboost/libs/fstr/shap_values.cpp:66–104  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

64}
65
66static TVector<TFeaturePathElement> UnwindFeaturePath(
67 const TVector<TFeaturePathElement>& oldFeaturePath,
68 size_t eraseElementIdx)
69{
70 const size_t pathLength = oldFeaturePath.size();
71 CB_ENSURE(pathLength > 0, "Path to unwind must have at least one element");
72
73 TVector<TFeaturePathElement> newFeaturePath(
74 oldFeaturePath.begin(),
75 oldFeaturePath.begin() + pathLength - 1);
76
77 for (size_t elementIdx = eraseElementIdx; elementIdx < pathLength - 1; ++elementIdx) {
78 newFeaturePath[elementIdx].Feature = oldFeaturePath[elementIdx + 1].Feature;
79 newFeaturePath[elementIdx].ZeroPathsFraction = oldFeaturePath[elementIdx + 1].ZeroPathsFraction;
80 newFeaturePath[elementIdx].OnePathsFraction = oldFeaturePath[elementIdx + 1].OnePathsFraction;
81 }
82
83 const double onePathsFraction = oldFeaturePath[eraseElementIdx].OnePathsFraction;
84 const double zeroPathsFraction = oldFeaturePath[eraseElementIdx].ZeroPathsFraction;
85 double weightDiff = oldFeaturePath[pathLength - 1].Weight;
86
87 if (!FuzzyEquals(1 + onePathsFraction, 1 + 0.0)) {
88 for (int elementIdx = pathLength - 2; elementIdx >= 0; --elementIdx) {
89 double oldWeight = newFeaturePath[elementIdx].Weight;
90 newFeaturePath[elementIdx].Weight = weightDiff * pathLength
91 / (onePathsFraction * (elementIdx + 1));
92 weightDiff = oldWeight
93 - newFeaturePath[elementIdx].Weight * zeroPathsFraction * (pathLength - elementIdx - 1)
94 / pathLength;
95 }
96 } else {
97 for (int elementIdx = pathLength - 2; elementIdx >= 0; --elementIdx) {
98 newFeaturePath[elementIdx].Weight *= pathLength
99 / (zeroPathsFraction * (pathLength - elementIdx - 1));
100 }
101 }
102
103 return newFeaturePath;
104}
105
106static void UpdateShapByFeaturePath(
107 const TVector<TFeaturePathElement>& featurePath,

Calls 3

FuzzyEqualsFunction · 0.85
sizeMethod · 0.45
beginMethod · 0.45

Tested by

no test coverage detected