Вопрос или проблема
Извините за длинную историю, но это длинная история. 🙂
Я использую библиотеку h2o для Python, чтобы построить дерево решений и извлечь из него правила решений. Я использую некоторые данные для обучения, где метки получают значения TRUE и FALSE. Моя конечная цель – извлечь значимый путь (лист) дерева, где количество случаев TRUE значительно превышает количество случаев FALSE.
treemodel=H2OGradientBoostingEstimator(ntrees = 3, max_depth = maxDepth, distribution="bernoulli")
treemodel.train(x=somedata.names[1:],y=somelabel.names[0], training_frame=somedata)
dtree = H2OTree(model = treemodel, tree_number = 0, tree_class = False)
def predict_leaf_node_assignment(self, test_data, type="Path"):
if not isinstance(test_data, h2o.H2OFrame): raise ValueError("test_data
must be an instance of H2OFrame")
assert_is_type(type, None, Enum("Path", "Node_ID"))
j = h2o.api("POST /3/Predictions/models/%s/frames/%s" % (self.model_id,
test_data.frame_id),
data={"leaf_node_assignment": True, "leaf_node_assignment_type":
type})
return h2o.get_frame(j["predictions_frame"]["name"])
dfResLabH2O.leafs = predict_leaf_node_assignment( dtree,test_data=dfResLabH2O , type="Path")
В scikit-learn есть опция для исследования листьев с использованием tree.values
. Я понимаю, что в h2o такой опции нет. Вместо этого в h2o есть возможность возвращать предсказания по листьям.
Когда я запускаю dtree.predictions
, я получаю довольно странные результаты:
dtree.predictions
Out[32]: [0.0, -0.020934915, 0.0832189, -0.0151052615, -0.13453846, -0.0039859135, 0.2931017, 0.0836743, -0.008562919, -0.12405087, -0.02181114, 0.06444048, -0.01736593, 0.13912177, 0.10727943]***
Мои вопросы (и кто-то уже задавал их, но четкого ответа пока не было)
-
Что означает отрицательные прогнозы? Я ожидаю получить пропорции p от TRUE к ALL или FALSE к ALL, где 0<=p<=1. Есть ли что-то неправильно с моей моделью? Я запускал ее в scikit-learn и могу указать определенные значимые пути и извлечь правила.
-
Для положительных значений: это пропорция TRUE к ALL или False к ALL? Я предполагаю, что это FALSE, так как я упоминал Class=False, но я не уверен.
-
Есть ли метод или решение для деревьев h20, чтобы узнать размер выборки определенного листа и [n1,n2] для случаев TRUE и FALSE соответственно, аналогично тому, как это предоставляет scikit-learn?
-
Я нашел на некоторых форумах функцию def predict_leaf_node_assignment, которая предназначена для предсказания на наборе данных и возвращения назначения листового узла (только для моделей на основе деревьев), но она не возвращает результат, и я не могу найти пример, как ее реализовать.
-
В конечном итоге: я хотел бы иметь возможность извлекать значения размера выборки листа и извлекать конкретный путь к нему, реализуя [n1,n2] или действительные пропорции.
Буду признателен за любую помощь и предложения. Спасибо.
Пока что я не вижу способа извлечь информацию об обучении из модели. H2OTree.predictions
может/должен предоставить информацию о пропорции, но не предоставит размеры выборки для листов. Для этого вы можете использовать predict_leaf_node_assignment
, передавая ваш обучающий набор (чтобы безрезультатно пройти через модель, *пожимая плечами*).
predict_leaf_node_assignment
должен вернуть датафрейм с назначением листа для каждой из ваших обучающих точек. (Версия R
похоже поддерживает возврат либо пути, либо id узла, но версия python
кажется не имеет этого). Вы можете взять это, присоединить к исходной таблице и использовать функции группировки и агрегации, чтобы получить желаемые [n1,n2]
.*
Относительно вывода predictions
, см. https://stackoverflow.com/questions/44735518/how-to-reproduce-the-h2o-gbm-class-probability-calculation. В частности, коэффициент обучения по умолчанию в GBM H2O составляет 0.1, что помогает объяснить ваши приглушенные результаты.
Наконец, для небольшого развлечения с объектами деревьев модели, см. https://www.pavel.cool/machine%20learning/h2o-3/h2o-3-tree-api/
и
https://novyden.blogspot.com/2018/12/finally-you-can-plot-h2o-decision-trees.html
*ИЗМЕНЕНИЕ: Для выполнения группировки и агрегации:
(Я больше привык к pandas, чем H2O фреймам, так что сначала выполню преобразование. И учитывая, что H2O считает ваш класс FALSE основным классом, может быть, это строки, а не булевые значения?)
predicted_leaves_frame = treemodel.predict_leaf_node_assignment(data).as_data_frame()
df = data.as_data_frame()
df['binary_dep_var'] = df['dep_var'].apply(lambda x: 1 if x=='TRUE' else 0)
df['T1'] = predicted_leaves_frame['T1.C1']
print(df.groupby('T1')['binary_dep_var'].agg(['sum','count','mean'])
Это должно дать для каждого листа количество образцов TRUE, общее количество образцов и соотношение. Если вам действительно нужно количество образцов FALSE, вы можете определить свою собственную функцию агрегации или просто обработать этот новый датафрейм.
Ответ или решение
Чтобы извлечь значения (семплы) терминальных узлов дерева решений, используя библиотеку h2o, необходимо понимать специфику работы этой библиотеки и методологию ваших вычислений. Ниже приведены ответы на ваши вопросы и рекомендации по достижению вашей цели.
-
Отрицательные предсказания:
Отрицательные значения в предсказаниях дерева решений h2o часто объясняются спецификой использования градиентного бустинга (GBM). В h2o, предсказания представляют собой не сами вероятности классов, а скорее изменения логарифмических шансов после применения каждого дерева, которые затем объединяются. Вы должны пройти финальную трансформацию, чтобы получить вероятности классов. Вероятности получаются путем применения сигмоидной функции к этим числам.
-
Интерпретация положительных значений:
Положительные значения, которые вы получаете, показывают изменения логарифмических шансов, а не фактические вероятности классов. Поскольку ваш класс FALSE указан как основной, положительные значения вероятнее всего подразумевают более высокие шансы на принадлежность к классу TRUE ввиду вашего применения
Class=False
. -
Вывод размеров выборки каждого листа:
К сожалению, напрямую таких функций в h2o нет, но вы можете использовать предсказания листьев с функцией
predict_leaf_node_assignment
и затем сгруппировать и агрегировать данные по узлам деревьев, чтобы вычислить количество случаев TRUE и FALSE в каждом из них ([n1, n2]). -
Применение функции predict_leaf_node_assignment:
Функция
predict_leaf_node_assignment
возвращает DataFrame с назначением терминальных узлов для каждого из ваших точек данных. Вы можете использовать эти данные для анализа структуры модели, присоединив их к исходным данным и используя группировки для анализа. -
Извлечение размеров выборки и пути к листу:
После получения назначений терминальных узлов с помощью
predict_leaf_node_assignment
, преобразуйте полученные h2o-фреймы в pandas, чтобы произвести над ними необходимые операции группировки и агрегации. Например, вы можете использовать Python и pandas для этого:
predicted_leaves_frame = treemodel.predict_leaf_node_assignment(data).as_data_frame()
df = data.as_data_frame()
df['binary_dep_var'] = df['dep_var'].apply(lambda x: 1 if x=='TRUE' else 0)
grouped_data = df.groupby(predicted_leaves_frame['leaf_assignment']).agg({'binary_dep_var': ['sum', 'count']})
grouped_data['FALSE_count'] = grouped_data['binary_dep_var']['count'] - grouped_data['binary_dep_var']['sum']
print(grouped_data)
Это даст вам количество TRUE (n1), количество FALSE (n2) и общее количество наблюдений для каждого листа.
SEO и профессиональная подача:
В завершение, этот подход обеспечит вам возможность извлечения релевантных данных для дальнейшего анализа и может быть адаптирован для специализированных задач, специфичных для вашего проекта. Мы рекомендуем регулярно мониторить изменения в h2o для нововведений, которые могут сделать анализ проще и интуитивнее. Если вы хотите дополнительно визуализировать свои модели, используйте внешние библиотеки для построения графиков деревьев и интерпретации их путей.