Skip to content

Commit 2b10eca

Browse files
author
minjk-bl
committed
ML > evaluation schema
1 parent 3d65538 commit 2b10eca

File tree

3 files changed

+163
-15
lines changed

3 files changed

+163
-15
lines changed

css/root.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@
4444
.vp-orange-text {
4545
color: var(--font-hightlight);
4646
}
47+
.vp-gray-text {
48+
color: var(--gray-color);
49+
}
50+
.vp-italic {
51+
font-style: italic;
52+
}
4753
.vp-bold {
4854
font-weight: bold;
4955
}

html/m_ml/evaluation.html

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<body>
2+
<div class="vp-grid-box">
3+
<div class="vp-grid-border-box vp-grid-col-p50">
4+
<label class="vp-orange-text">Import Library</label>
5+
<button class="vp-button vp-import-btn" id="vp_importLibrary">Import</button>
6+
</div>
7+
<div class="vp-grid-border-box vp-grid-col-95">
8+
<label for="modelType" class="vp-orange-text">Model Type</label>
9+
<select id="modelType" class="vp-select vp-state">
10+
<option value="clf">Classfication</option>
11+
<option value="rgs">Regression</option>
12+
<!-- <option value="cls">Clustering</option>
13+
<option value="pca">PCA</option> -->
14+
</select>
15+
<label for="predictData" class="vp-orange-text">Predict Data</label>
16+
<input type="text" class="vp-input vp-state" id="predictData" placeholder="Input predict data" value="pred"/>
17+
<label for="targetData" class="vp-orange-text">Target Data</label>
18+
<input type="text" class="vp-input vp-state" id="targetData" placeholder="Input target data" value="y_test"/>
19+
</div>
20+
<div class="vp-grid-border-box">
21+
<label for="featureData" class="vp-orange-text">Evaluation Metrics</label>
22+
<div class="vp-grid-box vp-eval-box vp-eval-clf">
23+
<input type="checkbox" id="confusion_matrix" class="vp-state" checked><label for="confusion_matrix">Confusion Matrix</label>
24+
<input type="checkbox" id="report" class="vp-state" checked><label for="report">Report (Accuracy/Precision/Recall/F1-score)</label>
25+
<label class="vp-gray-text vp-italic">* You can select individually</label>
26+
<input type="checkbox" id="accuracy" class="vp-state"><label for="accuracy">Accuracy</label>
27+
<input type="checkbox" id="precision" class="vp-state"><label for="precision">Precision</label>
28+
<input type="checkbox" id="recall" class="vp-state"><label for="recall">Recall</label>
29+
<input type="checkbox" id="f1_score" class="vp-state"><label for="f1_score">F1-score</label>
30+
</div>
31+
<div class="vp-grid-box vp-eval-box vp-eval-rgs">
32+
<input type="checkbox" id="coefficient" class="vp-state"><label for="coefficient">Coefficient</label>
33+
<input type="checkbox" id="intercept" class="vp-state"><label for="intercept">Intercept</label>
34+
<input type="checkbox" id="r_squared" class="vp-state" checked><label for="r_squared">R squared</label>
35+
<input type="checkbox" id="mae" class="vp-state"><label for="mae">Mean Absolute Error</label>
36+
<input type="checkbox" id="mape" class="vp-state"><label for="mape">Mean Absolute Percentage Error</label>
37+
<input type="checkbox" id="rmse" class="vp-state" checked><label for="rmse">Root Mean Squared Error</label>
38+
<input type="checkbox" id="scatter_plot" class="vp-state"><label for="scatter_plot">Scatter plot</label>
39+
</div>
40+
</div>
41+
</div>
42+
</body>

js/m_ml/evaluation.js

Lines changed: 115 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,45 +13,145 @@
1313
// [CLASS] Evaluation
1414
//============================================================================
1515
define([
16+
'text!vp_base/html/m_ml/evaluation.html!strip',
1617
'vp_base/js/com/com_util',
1718
'vp_base/js/com/com_Const',
1819
'vp_base/js/com/com_String',
1920
'vp_base/js/com/component/PopupComponent'
20-
], function(com_util, com_Const, com_String, PopupComponent) {
21+
], function(evalHTML, com_util, com_Const, com_String, PopupComponent) {
2122

2223
/**
2324
* Evaluation
2425
*/
2526
class Evaluation extends PopupComponent {
2627
_init() {
2728
super._init();
28-
/** Write codes executed before rendering */
29+
this.config.dataview = false;
30+
31+
this.state = {
32+
modelType: 'clf',
33+
predictData: 'pred',
34+
targetData: 'y_test',
35+
// classification
36+
confusion_matrix: true, report: true,
37+
accuracy: false, precision: false, recall: false, f1_score: false,
38+
// regression
39+
coefficient: false, intercept: false, r_squared: true,
40+
mae: false, mape: false, rmse: true, scatter_plot: false,
41+
...this.state
42+
}
2943
}
3044

3145
_bindEvent() {
3246
super._bindEvent();
3347
/** Implement binding events */
3448
var that = this;
35-
this.$target.on('click', function(evt) {
36-
var target = evt.target;
37-
if ($(that.wrapSelector()).find(target).length > 0) {
38-
// Sample : getDataList from Kernel
39-
vpKernel.getDataList().then(function(resultObj) {
40-
vpLog.display(VP_LOG_TYPE.DEVELOP, resultObj);
41-
}).catch(function(err) {
42-
vpLog.display(VP_LOG_TYPE.DEVELOP, err);
43-
});
44-
}
49+
50+
// import library
51+
$(this.wrapSelector('#vp_importLibrary')).on('click', function() {
52+
com_interface.insertCell('code', 'from sklearn import metrics');
4553
});
54+
55+
// model type change
56+
$(this.wrapSelector('#modelType')).on('change', function() {
57+
let modelType = $(this).val();
58+
that.state.modelType = modelType;
59+
60+
$(page).find('.vp-eval-box').hide();
61+
$(page).find('.vp-eval-'+modelType).show();
62+
})
4663
}
4764

4865
templateForBody() {
49-
/** Implement generating template */
50-
return 'This is sample.';
66+
let page = $(evalHTML);
67+
68+
$(page).find('.vp-eval-box').hide();
69+
$(page).find('.vp-eval-'+this.state.modelType).show();
70+
71+
return page;
5172
}
5273

5374
generateCode() {
54-
return "print('sample code')";
75+
let code = new com_String();
76+
let {
77+
modelType, predictData, targetData,
78+
// classification
79+
confusion_matrix, report, accuracy, precision, recall, f1_score,
80+
// regression
81+
coefficient, intercept, r_squared, mae, mape, rmse, scatter_plot
82+
} = this.state;
83+
84+
//====================================================================
85+
// Classfication
86+
//====================================================================
87+
if (modelType == 'clf') {
88+
if (confusion_matrix) {
89+
code.appendLine("# Confusion Matrix");
90+
code.appendFormatLine('pd.crosstab({0}, {1}, margins=True)', targetData, predictData);
91+
}
92+
if (report) {
93+
code.appendLine("# Classification report");
94+
code.appendFormatLine('print(metrics.classification_report({0}, {1}))', targetData, predictData);
95+
}
96+
if (accuracy) {
97+
code.appendLine("# Accuracy");
98+
code.appendFormatLine('metrics.accuracy_score({0}, {1})', targetData, predictData);
99+
}
100+
if (precision) {
101+
code.appendLine("# Precision");
102+
code.appendFormatLine("metrics.precision_score({0}, {1}, average='weighted')", targetData, predictData);
103+
}
104+
if (recall) {
105+
code.appendLine("# Recall");
106+
code.appendFormatLine("metrics.recall_score({0}, {1}, average='weighted')", targetData, predictData);
107+
}
108+
if (f1_score) {
109+
code.appendLine("# F1-score");
110+
code.appendFormatLine("metrics.f1_score({0}, {1}, average='weighted')", targetData, predictData);
111+
}
112+
}
113+
114+
//====================================================================
115+
// Regression
116+
//====================================================================
117+
if (modelType == 'rgs') {
118+
if (coefficient) {
119+
code.appendLine("# Coefficient (scikit-learn only)");
120+
code.appendFormatLine('model.coef_');
121+
}
122+
if (intercept) {
123+
code.appendLine("# Intercept (scikit-learn only)");
124+
code.appendFormatLine('model.intercept_');
125+
}
126+
if (r_squared) {
127+
code.appendLine("# R square");
128+
code.appendFormatLine('metrics.r2_score({0}, {1})', targetData, predictData);
129+
}
130+
if (mae) {
131+
code.appendLine("# MAE(Mean Absolute Error)");
132+
code.appendFormatLine('metrics.mean_absolute_error({0}, {1})', targetData, predictData);
133+
}
134+
if (mape) {
135+
code.appendLine("# MAPE(Mean Absolute Percentage Error)");
136+
code.appendLine('def MAPE(y_test, y_pred):');
137+
code.appendLine(' return np.mean(np.abs((y_test - pred) / y_test)) * 100');
138+
code.appendLine();
139+
code.appendFormatLine('MAPE({0}, {1})', targetData, predictData);
140+
}
141+
if (rmse) {
142+
code.appendLine("# RMSE(Root Mean Squared Error)");
143+
code.appendFormatLine('metrics.mean_squared_error({0}, {1})**0.5', targetData, predictData);
144+
}
145+
if (scatter_plot) {
146+
code.appendLine('# Regression plot');
147+
code.appendFormatLine('plt.scatter({0}, {1})', targetData, predictData);
148+
code.appendFormatLine("plt.xlabel('{0}')", targetData);
149+
code.appendFormatLine("plt.ylabel('{1}')", predictData);
150+
code.appendLine('plt.show()');
151+
}
152+
}
153+
// FIXME: as seperated cells
154+
return code.toString();
55155
}
56156

57157
}

0 commit comments

Comments
 (0)