gow*_*oww 6 python scoring machine-learning scikit-learn
我试图用随机森林和逻辑回归预测二元变量.我有很多不平衡的课程(约占Y = 1的1.5%).
随机森林中的默认特征重要性技术基于分类准确性(错误率) - 已被证明是不平衡类的不良衡量标准(参见此处和此处).
用于RF特性选择的两个标准VIM是Gini VIM和置换VIM.粗略地说,一个感兴趣的预测器的基尼VIM是森林中由该预测器产生的基尼杂质减少的总和,无论何时选择用于分裂,通过树的数量来缩放.
我的问题是:在scikit-learn中实现的那种方法(就像在R包中一样party)?或者可能是一种解决方法?
PS:这个问题与其他问题有关.
经过一些研究后,我得出以下结论:
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'), ...]
Run Code Online (Sandbox Code Playgroud)
输出不是很性感,但你明白了。这种方法的缺点是特征重要性似乎非常依赖于参数。max_depth我使用不同的参数( , ..)运行它max_features,并且得到了很多不同的结果。因此,我决定对参数 ( ) 运行网格搜索scoring = 'roc_auc',然后将此 VIM(变量重要性度量)应用于最佳模型。
我从这本(很棒的)笔记本中获得了灵感。
非常欢迎所有建议/意见!
| 归档时间: |
|
| 查看次数: |
2480 次 |
| 最近记录: |