Что здесь может ввести в заблуждение, так это то, что вы смотрите только на результирующие sum
выходных значений. Причина, по которой все прогнозы в сумме дают 1, когда модель обучается с нормализованными метками, заключается в том, что она будет прогнозировать только среди этих массивов с несколькими выходами, которые она видела. И это происходит потому, что при таком небольшом количестве образцов модель переоснащается, и дерево решений де-факто действует как классификатор. применяется к DecisionTree
):
from sklearn.tree import DecisionTreeRegressor
features = np.random.random((6, 5))
targets = np.random.random((6, 3))
rfr = DecisionTreeRegressor(random_state=42)
rfr.fit(features, targets)
Если теперь мы прогнозируем на новый набор случайных функций, мы будем получать прогнозы среди набора выходных данных, которые модель была обучена on:
features2 = np.random.random((6, 5))
preds = rfr.predict(features2)
print(preds)
array([[0.0017143 , 0.05348525, 0.60877828], #0
[0.05232433, 0.37249988, 0.27844562], #1
[0.08177551, 0.39454957, 0.28182183],
[0.05232433, 0.37249988, 0.27844562],
[0.08177551, 0.39454957, 0.28182183],
[0.80068346, 0.577799 , 0.66706668]])
print(targets)
array([[0.80068346, 0.577799 , 0.66706668],
[0.0017143 , 0.05348525, 0.60877828], #0
[0.08177551, 0.39454957, 0.28182183],
[0.75093787, 0.29467892, 0.11253746],
[0.87035059, 0.32162589, 0.57288903],
[0.05232433, 0.37249988, 0.27844562]]) #1
Таким образом, если все результаты обучения в сумме составляют 1
, то же самое будет применяться к прогнозируемым значениям.
Если мы возьмем пересечение sum
s вдоль первой оси для целевых и прогнозируемых значений, мы видим, что сумма всех прогнозируемых значений существует в targets
:
preds_sum = np.unique(preds.sum(1))
targets_sum = np.unique(targets.sum(1))
len(np.intersect1d(targets_sum, preds_sum)) == len(features)
# True