Как можно расшифровать функции из дерева решений, чтобы увидеть важные функции? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть набор данных, с которым я работаю.Я преобразую их из категориальных функций в числовые функции для моего дерева решений.Преобразование происходит во всем фрейме данных со следующими строками:

le = LE()
df = df.apply(le.fit_transform)

Позже я беру эти данные и делю их на данные обучения и тестирования со следующими данными:

target = ['label']
df_y = df['label']
df_x = df.drop(target, axis=1)

# Split into training and testing data
train_x, test_x, train_y, test_y = tts(df_x, df_y, test_size=0.3, random_state=42)  

Затем яЯ передаю его методу для обучения дерева решений:

def Decision_Tree_Classifier(train_x, train_y, test_x, test_y, le):
    print " - Candidate: Decision Tree Classifier"
    dec_tree_classifier = DecisionTreeClassifier(random_state=0) # Load Module
    dec_tree_classifier.fit(train_x, train_y) # Fit
    accuracy = dec_tree_classifier.score(test_x, test_y) # Acc
    predicted = dec_tree_classifier.predict(test_x)
    mse = mean_squared_error(test_y, predicted)

    tree_feat = list(le.inverse_transform(dec_tree_classifier.tree_.feature))
    print "Tree Features:"
    print tree_feat
    print "Tree Thresholds:"
    print dec_tree_classifier.tree_.threshold

    scores = cross_val_score(dec_tree_classifier, test_x, test_y.values.ravel(), cv=10)
    return (accuracy, mse, scores.mean(), scores.std())

В вышеупомянутом методе я передаю объект LabelEncoder, первоначально использовавшийся для кодирования кадра данных.У меня есть строка

tree_feat = list(le.inverse_transform(dec_tree_classifier.tree_.feature))

Чтобы попытаться преобразовать функции обратно в их исходное категориальное представление, но я продолжаю получать эту ошибку трассировки стека:

  File "<ipython-input-6-c2005f8661bc>", line 1, in <module>
    runfile('main.py', wdir='/Users/mydir)

  File "/Users/me/anaconda2/lib/python2.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "/Users/me/anaconda2/lib/python2.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 100, in execfile
    builtins.execfile(filename, *where)

  File "/Users/me/mydir/main.py", line 125, in <module>
    main()  # Run main routine

  File "candidates.py", line 175, in get_baseline
    dec_tre_acc = Decision_Tree_Classifier(train_x, train_y, test_x, test_y, le)

  File "candidates.py", line 40, in Decision_Tree_Classifier
    tree_feat = list(le.inverse_transform(dec_tree_classifier.tree_.feature))

  File "/Users/me/anaconda2/lib/python2.7/site-packages/sklearn/preprocessing/label.py", line 281, in inverse_transform
    "y contains previously unseen labels: %s" % str(diff))

ValueError: y contains previously unseen labels: [-2]

Что мне нужно изменитьчтобы иметь возможность посмотреть на сами особенности?

1 Ответ

0 голосов
/ 28 ноября 2018

Когда вы делаете это:

df = df.apply(le.fit_transform)

вы используете один экземпляр LabelEncoder для всех ваших столбцов.При вызове fit() или fit_transform(), le забудет предыдущие данные и узнает только текущие данные.Таким образом, le, который у вас есть, хранит информацию только о последнем увиденном столбце, а не обо всех столбцах.

Существует несколько способов решения этой проблемы:

  1. Вы можете поддерживать несколько объектов LabelEncoder (по одному для каждого столбца).См. Этот превосходный ответ здесь:

  2. Если вы хотите сохранить один объект для обработки всех столбцов, вы можете использовать OrdinalEncoder, если у вас установлена ​​последняя версия scikit-learn.

    from sklearn.preprocessing import OrdinalEncoder
    enc = OrdinalEncoder()
    
    df = enc.fit_transform(df)
    

Но, тем не менее, ошибка не будет решена, поскольку tree_.feature не соответствует значениям объектов, но использовался индекс (столбец в df), который использовалсядля расщепления в этом узле.Таким образом, если у вас есть 3 элемента (столбцы) в данных (независимо от значений в этом столбце), tree_.feature может иметь значения:

  • 0, 1, 2, -2

  • -2 - это специальное значение-заполнитель, обозначающее, что узел является конечным узлом, и поэтому никакая функция не используется для разделения чего-либо.

tree_.threshold будет содержать значения, соответствующие вашим значениям данных.Но это будет с плавающей точкой, поэтому вам придется конвертировать в соответствии с преобразованием категорий в числа.

См. Этот пример для более детального понимания структуры дерева:

...