Я пытаюсь реализовать DecisionTreeClassifier из sklearn с помощью DataFrame (pandas), но при расщеплении моих данных он возвращает некоторые странные значения. Мой набор данных содержит 3 столбца с коэффициентами корреляции Пирсона, которые могут быть только между -1.0 и 1.0. Корневой узел, однако, уже начинает разделение одним из этих столбцов на Pearsons <= 1.0 и показывает два дочерних узла для True и False. Но это невозможно! Все значения <= 1.0. Там не было никакого раскола. Кто-нибудь знает, что здесь происходит?
В моем коде я попробовал как критерий Джини, так и Энтропию, как разделители, так и другие комбинации возможных параметров. Вот более или менее мой код сейчас, но я все еще играю с параметрами:
newtable = table_of_pickle_ptptnew.loc[:,('Pearsons Ratio', 'Pearsons 330nm', 'Pearsons 350nm', 'Ratio Space', '330nm Similarity', '350nm Similarity')]
x = newtable.values
y = table_of_pickle_ptptnew['Binding Known'].values
dtree=DecisionTreeClassifier(max_features='auto',
max_depth=3,
criterion ='entropy',
min_impurity_decrease=0.09
)
fittree = dtree.fit(x, y.astype('str'))
dot_data = tree.export_graphviz(fittree, out_file=None,
class_names=['No Interaction', 'Interaction'],
feature_names=['Pearsons Ratio', 'Pearsons 330nm', 'Pearsons 350nm', 'Ratio Space', '330nm Similarity', '350nm Similarity'],
filled=True)
graph = graphviz.Source(dot_data)
graph
Pearsons Ratio Pearsons 330nm Pearsons 350nm Ratio Space 330nm Similarity 350nm Similarity
Elem a 0.94856 0.99999 0.99999 0.000725507 0.157209 0.0572688
Elem b 0.99234 1 0.99999 0.00657003 0.0568281 0.0465139
Elem c 0.98525 0.99999 0.99999 0.0114932 0.0226809 0.133452
Elem d 0.99793 0.99999 0.99999 0.000643209 0.154585 0.0914759
Elem e 0.99849 0.99999 0.99999 0.00128532 0.0932893 0.0464462
Вот как выглядят первые узлы дерева. Итак, я имею в виду, что дочерний узел для False в состоянии корневого узла (Pearson 350nm <= 1.0) невозможно существовать, поскольку все образцы <= 1.0 (True).
Хорошо. Я узнал, в чем проблема. Графическая визуализация дерева имеет предел десятичным числам и округляет их, если они слишком большие. Я использовал алгоритм, чтобы дать мне псевдокод для моего дерева решений автоматически, и в выводе кода появились "истинные значения". В графическом дереве из graphviz 1.0 из корневого узла фактически "0.9999749660491943".
Я думаю, что важно знать это для всех, кто работает с научными цифрами, которые имеют много цифр. :) Если вы работаете с такими цифрами, не забудьте получить код решения с вашего дерева и не ходите только за красивое дерево.
Спасибо всем, кто использовал немного своего времени, чтобы попытаться помочь мне в моей проблеме. :)