Как случайный индекс леса sklearn feature_importances_

Я использовал RandomForestClassifier в sklearn для определения важных функций в моем наборе данных. Как я могу вернуть фактические имена функций (мои переменные помечены как x1, x2, x3 и т. Д.), А не их относительное имя (он говорит мне, что важными функциями являются «12», «22» и т. Д.). Ниже приведен код, который я использую для возврата важных функций.

important_features = [] for x,i in enumerate(rf.feature_importances_): if i>np.average(rf.feature_importances_): important_features.append(str(x)) print important_features 

Кроме того, чтобы понять индексирование, я смог узнать, какова была важная функция «12» (она была переменной x14). Когда я перемещаю переменную x14 в позицию индекса 0 для набора учебных данных и снова запускаю код, он должен тогда сказать мне, что функция «0» важна, но это не так, это похоже на то, что она не может видеть эту функцию и первая функция, указанная в списке, – это функция, которая на самом деле была второй функцией, указанной при первом запуске кода (функция «22»).

Я думаю, что, возможно, feature_importances_ фактически использует первый столбец (где я разместил x14) как своего рода идентификатор для остальной части набора учебных материалов и, таким образом, игнорируя его при выборе важных функций. Может ли кто-нибудь пролить свет на эти два вопроса? Заранее благодарю вас за любую помощь.

РЕДАКТИРОВАТЬ
Вот как я сохранил имена функций:

 tgmc_reader = csv.reader(csvfile) row = tgmc_reader.next() #Header contains feature names feature_names = np.array(row) 

Затем я загрузил наборы данных и целевые классы

 tgmc_x, tgmc_y = [], [] for row in tgmc_reader: tgmc_x.append(row[3:]) #This says predictors start at the 4th column, columns 2 and 3 are just considered ID variables. tgmc_y.append(row[0]) #Target column is the first in the dataset 

Затем приступил к разделению набора данных на части тестирования и обучения.

 from sklearn.cross_validation import train_test_split x_train, x_test, y_train, y_test = train_test_split(tgmc_x, tgmc_y, test_size=.10, random_state=33) 

Затем установите модель

 from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=1, criterion='entropy', max_features=2, max_depth=5, bootstrap=True, oob_score=True, n_jobs=2, random_state=33) rf = rf.fit(x_train, y_train) 

Затем вернулись важные функции

 important_features = [] for x,i in enumerate(rf.feature_importances_): if i>np.average(rf.feature_importances_): important_features.append((x)) 

Затем я включил ваше предложение, которое сработало (Большое спасибо!)

 important_names = feature_names[important_features > np.mean(important_features)] print important_names 

И он действительно возвращал имена переменных.

 ['x9' 'x10' 'x11' 'x12' 'x13' 'x15' 'x16'] 

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

 print important_features 

Он возвращает следующий результат:

 [12, 22, 51, 67, 73, 75, 87, 91, 92, 106, 125, 150, 199, 206, 255, 256, 275, 309, 314, 317] 

Я интерпретирую это как означающее, что переменные 12, 22, 51 и т. Д. Являются важными. Таким образом, это будет 12-я переменная с той точки, где я сказал, чтобы индексировать наблюдения в начале моего кода:

 tgmc_x.append(row[3:]) 

Правильно ли это толкование? Если это правильно, когда я перемещаю 12-ю переменную в 4-й столбец в исходном наборе данных (где я сказал, чтобы начать считывать значения предиктора с кодом, на который я только что ссылался) и снова запустить код, я получаю следующий вывод:

 [22, 51, 66, 73, 75, 76, 106, 112, 125, 142, 150, 187, 191, 199, 250, 259, 309, 317] 

Это похоже на то, что он не распознает эту переменную больше. Кроме того, когда я переношу одну и ту же переменную в 5-й столбец в исходном наборе данных, результат выглядит следующим образом:

 [1,22, 51, 66, 73, 75, 76, 106, 112, 125, 142, 150, 187, 191, 199, 250, 259, 309, 317] 

Похоже, что он снова это узнал. Последнее, после того как я получил его, чтобы вернуть имена переменных по вашему предложению, он дал мне список из 7 переменных. Когда я просто возвращаю важные переменные, используя код, который я сделал первоначально, он дает мне более длинный список важных переменных. Почему это? Еще раз спасибо за вашу помощь. Я очень ценю это!

  • Использование ансамбля голосования sklearn с частичной подгонкой
  • Использование памяти DBSCAN scikit-learn
  • scikit изучает создание фиктивных переменных
  • Как получить доступ к отдельным прогнозам в Spark RandomForest?
  • Рандомизированная стратифицированная k-кратная перекрестная проверка в scikit-learn?
  • Ошибка при попытке установить sklearn из Pycharm | arrayobject.h не может быть абсолютным
  • Как получить наиболее информативные функции для scikit-learn classifier для разных классов?
  • как мы можем познакомиться с выбранными и опущенными именами (столбцами) объектов (столбцов), используя scikit-learn
  • 3 Solutions collect form web for “Как случайный индекс леса sklearn feature_importances_”

    Feature Import возвращает массив, где каждый индекс соответствует оценочной важности этой функции в наборе обучения. Нет внутренней сортировки, это соответствие 1 к 1 с функциями, предоставляемыми ему во время обучения.

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

     importances = rf.feature_importances_ important_names = feature_names[importances > np.mean(importances)] print important_names 

    Объяснение переменной:

     regressor.score(X, y) 

    Получить значение переменной:

     importances = regressor.feature_importances_ print(importances) 

    Вот что я использую для печати и построения важности объекта, включая имена, а не только значения

     importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)}) importances = importances.sort_values('importance',ascending=False).set_index('feature') print importances importances.plot.bar() 

    Полный пример

     from sklearn.ensemble import RandomForestClassifier from sklearn.cross_validation import train_test_split import numpy as np import pandas as pd # set vars predictors = ['x1','x2'] response = 'y' X = df[predictors] y = df[response] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20) # run model clf = RandomForestClassifier(max_features=5) clf.fit(X_train.values, y_train.values) #show to plot importances importances = pd.DataFrame({'feature':X_train.columns,'importance':np.round(clf.feature_importances_,3)}) importances = importances.sort_values('importance',ascending=False).set_index('feature') print importances importances.plot.bar() 
    Python - лучший язык программирования в мире.