Skip to content

Commit 112792c

Browse files
author
minjk-bl
committed
Edit permutation importances and add plot
1 parent 8001e7c commit 112792c

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

visualpython/js/com/component/ModelEditor.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,16 +479,30 @@ define([
479479
name: 'permutation_importance',
480480
label: 'Permutation importance',
481481
import: 'from sklearn.inspection import permutation_importance',
482-
code: '${importance_allocate} = permutation_importance(${model}, ${importance_featureData}, ${importance_targetData}${scoring}${random_state}${etc})',
482+
code: '${importance_allocate} = vp_create_permutation_importances(${model}, ${importance_featureData}, ${importance_targetData}${scoring}${sort})',
483483
description: 'Permutation importance for feature evaluation.',
484484
options: [
485485
{ name: 'importance_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' },
486486
{ name: 'importance_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' },
487487
{ name: 'scoring', component: ['input'], usePair: true },
488-
{ name: 'random_state', component: ['input_number'], placeholder: '123', usePair: true },
488+
{ name: 'sort', label: 'Sort data', component: ['bool_checkbox'], value: true, usePair: true },
489489
{ name: 'importance_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'importances' }
490490
]
491491
},
492+
'plot_permutation_importance': {
493+
name: 'plot_permutation_importance',
494+
label: 'Plot permutation importance',
495+
import: 'from sklearn.inspection import permutation_importance',
496+
code: 'vp_plot_permutation_importances(${model}, ${importance_featureData}, ${importance_targetData}${scoring}${sort}${top_count})',
497+
description: 'Permutation importance for feature evaluation.',
498+
options: [
499+
{ name: 'importance_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' },
500+
{ name: 'importance_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' },
501+
{ name: 'scoring', component: ['input'], usePair: true },
502+
{ name: 'sort', label: 'Sort data', component: ['bool_checkbox'], value: true, usePair: true },
503+
{ name: 'top_count', label: 'Top count', component: ['input_number'], min: 0, usePair: true }
504+
]
505+
},
492506
'feature_importances': {
493507
name: 'feature_importances',
494508
label: 'Feature importances',

visualpython/js/m_ml/ModelInfo.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -409,16 +409,30 @@ define([
409409
name: 'permutation_importance',
410410
label: 'Permutation importance',
411411
import: 'from sklearn.inspection import permutation_importance',
412-
code: '${importance_allocate} = permutation_importance(${model}, ${importance_featureData}, ${importance_targetData}${scoring}${random_state}${etc})',
412+
code: '${importance_allocate} = vp_create_permutation_importances(${model}, ${importance_featureData}, ${importance_targetData}${scoring}${sort})',
413413
description: 'Permutation importance for feature evaluation.',
414414
options: [
415415
{ name: 'importance_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' },
416416
{ name: 'importance_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' },
417417
{ name: 'scoring', component: ['input'], usePair: true },
418-
{ name: 'random_state', component: ['input_number'], placeholder: '123', usePair: true },
418+
{ name: 'sort', label: 'Sort data', component: ['bool_checkbox'], value: true, usePair: true },
419419
{ name: 'importance_allocate', label: 'Allocate to', component: ['input'], placeholder: 'New variable', value: 'importances' }
420420
]
421421
},
422+
'plot_permutation_importance': {
423+
name: 'plot_permutation_importance',
424+
label: 'Plot permutation importance',
425+
import: 'from sklearn.inspection import permutation_importance',
426+
code: 'vp_plot_permutation_importances(${model}, ${importance_featureData}, ${importance_targetData}${scoring}${sort}${top_count})',
427+
description: 'Permutation importance for feature evaluation.',
428+
options: [
429+
{ name: 'importance_featureData', label: 'Feature Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'X_train' },
430+
{ name: 'importance_targetData', label: 'Target Data', component: ['data_select'], var_type: ['DataFrame', 'Series', 'ndarray', 'list', 'dict'], value: 'y_train' },
431+
{ name: 'scoring', component: ['input'], usePair: true },
432+
{ name: 'sort', label: 'Sort data', component: ['bool_checkbox'], value: true, usePair: true },
433+
{ name: 'top_count', label: 'Top count', component: ['input_number'], min: 0, usePair: true }
434+
]
435+
},
422436
'feature_importances': {
423437
name: 'feature_importances',
424438
label: 'Feature importances',

visualpython/python/userCommand.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,41 @@ def vp_plot_feature_importances(model, X_train=None, sort=False, top_count=0):
123123

124124
_vp_plt.show()
125125
######
126+
# Visual Python: Machine Learning > Model Info
127+
######
128+
def vp_create_permutation_importances(model, X_train, y_train, scoring=None, sort=False):
129+
from sklearn.inspection import permutation_importance
130+
if isinstance(X_train, _vp_pd.core.frame.DataFrame):
131+
feature_names = X_train.columns
132+
else:
133+
feature_names = [ 'X{}'.format(i) for i in range(len(model.feature_importances_)) ]
134+
135+
imp = permutation_importance(model, X_train, y_train, scoring)
136+
137+
df_i = _vp_pd.DataFrame(imp['importances_mean'], index=feature_names, columns=['Feature_importance'])
138+
df_i['Percentage'] = 100 * df_i['Feature_importance']
139+
if sort: df_i.sort_values(by='Feature_importance', ascending=False, inplace=True)
140+
df_i = df_i.round(2)
141+
142+
return df_i
143+
######
144+
# Visual Python: Machine Learning > Model Info
145+
######
146+
def vp_plot_permutation_importances(model, X_train, y_train, scoring=None, sort=False, top_count=0):
147+
df_i = vp_create_permutation_importances(model, X_train, y_train, scoring, sort)
148+
149+
if sort:
150+
if top_count > 0:
151+
df_i['Percentage'].sort_values().tail(top_count).plot(kind='barh')
152+
else:
153+
df_i['Percentage'].sort_values().plot(kind='barh')
154+
else:
155+
df_i['Percentage'].plot(kind='barh')
156+
_vp_plt.xlabel('Feature importance Percentage')
157+
_vp_plt.ylabel('Features')
158+
159+
_vp_plt.show()
160+
######
126161
# Visual Python: Visualization > Seaborn
127162
######
128163
def vp_seaborn_show_values(axs, precision=1, space=0.01):

0 commit comments

Comments
 (0)