После некоторых исследований я пришел к следующему:
from sklearn.cross_validation import ShuffleSplit
from collections import defaultdict
names = db_train.iloc[:,1:].columns.tolist()
# -- Gridsearched parameters
model_rf = RandomForestClassifier(n_estimators=500,
class_weight="auto",
criterion='gini',
bootstrap=True,
max_features=10,
min_samples_split=1,
min_samples_leaf=6,
max_depth=3,
n_jobs=-1)
scores = defaultdict(list)
# -- Fit the model (could be cross-validated)
rf = model_rf.fit(X_train, Y_train)
acc = roc_auc_score(Y_test, rf.predict(X_test))
for i in range(X_train.shape[1]):
X_t = X_test.copy()
np.random.shuffle(X_t[:, i])
shuff_acc = roc_auc_score(Y_test, rf.predict(X_t))
scores[names[i]].append((acc-shuff_acc)/acc)
print("Features sorted by their score:")
print(sorted([(round(np.mean(score), 4), feat) for
feat, score in scores.items()], reverse=True))
Features sorted by their score:
[(0.0028999999999999998, 'Var1'), (0.0027000000000000001, 'Var2'), (0.0023999999999999998, 'Var3'), (0.0022000000000000001, 'Var4'), (0.0022000000000000001, 'Var5'), (0.0022000000000000001, 'Var6'), (0.002, 'Var7'), (0.002, 'Var8'), ...]
Результат не очень сексуальный, но идея вы поняли. Слабость этого подхода в том, что важность функции кажется очень зависимой от параметров. Я запустил его, используя разные параметры (max_depth
, max_features
..), и получил много разных результатов. Поэтому я решил запустить поиск по сетке по параметрам (scoring = 'roc_auc'
), а затем применить этот VIM (Variable Importance Measure) к лучшей модели.
Я черпал вдохновение из этой (великолепной) записной книжки .
Все предложения / комментарии приветствуются!
person
gowithefloww
schedule
08.07.2015