Регрессионная квантификация важности переменных в случайном лесу - PullRequest
0 голосов
/ 25 сентября 2018

Можно ли количественно оценить важность переменных при определении вероятности попадания наблюдения в один класс?Что-то похожее на логистическую регрессию.

Например: если у меня есть следующие независимые переменные 1) Количество кошек на человека 2) Количество собак на человека 3) Количество цыплят на человека

С моей зависимой переменной: неважно, является ли человек частью PETA или нет

Можно ли сказать что-то вроде "если человек усыновит на одну кошку больше, чем его существующий диапазон животных, его вероятность бытьчасть PETA увеличивается на 0,12 "

. В настоящее время я использую следующую методологию для достижения этого конкретного сценария: 1) Построить модель случайного леса, используя данные обучения. 2) Предсказать вероятность того, что клиент попадет в один конкретный класс.(Peta vs non Peta) 3) Искусственно увеличить количество кошек, принадлежащих каждому наблюдению, на 1 4) Предсказать новую вероятность того, что клиент попадет в один из двух классов 5) Среднее изменение между вероятностью (4) и (2)) вероятность - это среднее увеличение вероятности человека, если онpted cat.

Имеет ли это смысл?Есть ли какой-то недостаток в методологии, о котором я не думал?Есть ли лучший способ сделать то же самое?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я прошу прощения.Я не уловил ту часть, где вы упоминаете, какое заявление вы пытаетесь сделать.Я предполагаю, что ваша переменная ответа равна 1 или нулю.Вы можете попробовать что-то вроде этого:

  1. Подгоните модель линейной регрессии к данным.Это на самом деле не даст вам наиболее точного соответствия, но будет надежным для получения информации, которую вы ищете.
  2. Найдите ответ модели с исходными данными.(Скорее всего, это не будут единицы или нули)
  3. Искусственно измените входные данные и найдите разницу в выходных данных исходных и измененных данных, как вы предложили в своем вопросе.

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

Вы можете даже попробовать однослойную нейронную сеть с регрессионным / линейным выходным слоем, чтобы сделать то же самое.Добавьте слои или нелинейные функции активации, если данные с меньшей вероятностью будут линейными.

Приветствия!

0 голосов
/ 25 сентября 2018

Если вы используете scikitlearn, вы можете легко сделать это, обратившись к свойству feature_importance_ встроенного RandomForestClassifier.Согласно SciKitLearn:

Относительный ранг (т. Е. Глубина) объекта, используемого в качестве узла принятия решения в дереве, может использоваться для оценки относительной важности этого объекта в отношении предсказуемости цели.переменная.Элементы, используемые в верхней части дерева, способствуют окончательному прогнозированию большей части входных выборок.Таким образом, ожидаемая доля образцов, в которые они вносят вклад, может использоваться в качестве оценки относительной важности признаков.Усредняя эти ожидаемые показатели активности по нескольким рандомизированным деревьям, можно уменьшить дисперсию такой оценки и использовать ее для выбора признаков.

Свойство feature_importance_ сохраняет среднюю глубину каждого объекта среди деревьев.,Вот пример.Давайте начнем с импорта необходимых библиотек.

# using this for some array manipulations
import numpy as np
# of course we're going to plot stuff!
import matplotlib.pyplot as plt

# dummy iris dataset
from sklearn.datasets import load_iris
#random forest classifier
from sklearn.ensemble import RandomForestClassifier

Как только они у нас появятся, мы собираемся загрузить фиктивный набор данных, определить модель классификации и подогнать данные к модели.

data = load_iris()
​
# we're gonna use 100 trees
forest = RandomForestClassifier(n_estimators = 100)
​
# fit data to model by passing features and labels
forest.fit(data.data, data.target)

Теперь мы можем использовать свойство важности объекта, чтобы получить оценку каждой функции, основываясь на том, насколько хорошо она может классифицировать данные по различным целям.

# find importances of each feature
importances = forest.feature_importances_
# find the standard dev of each feature to assess the spread 
std = np.std([tree.feature_importances_ for tree in forest.estimators_],
             axis=0)
​
# find sorting indices of importances (descending)
indices = np.argsort(importances)[::-1]
​
# Print the feature ranking
print("Feature ranking:")
​
for f in range(data.data.shape[1]):
    print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))

Ранжирование объектов: 1.функция 2 (0.441183) 2. функция 3 (0.416197) 3. функция 0 (0.112287) 4. функция 1 (0.030334)

Теперь мы можем отобразить важность каждой функции в виде гистограммы ирешить, стоит ли их всех оставить.Мы также строим графики ошибок для оценки значимости.

plt.figure()
plt.title("Feature importances")
plt.bar(range(data.data.shape[1]), importances[indices],
       color="b", yerr=std[indices], align="center")
plt.xticks(range(data.data.shape[1]), indices)
plt.xlim([-1, data.data.shape[1]])
plt.show()

Гистограмма важности объектов

...