diff --git a/boards/default_src/python_mixpy/blocks/sklearn.js b/boards/default_src/python_mixpy/blocks/sklearn.js index 97c8db1a..f03597e9 100644 --- a/boards/default_src/python_mixpy/blocks/sklearn.js +++ b/boards/default_src/python_mixpy/blocks/sklearn.js @@ -168,7 +168,12 @@ export const sklearn_data_target = { this.appendDummyInput() .setAlign(Blockly.inputs.Align.RIGHT) .appendField(Blockly.Msg.MIXLY_GET) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.EIGENVALUES, "data"], [Blockly.Msg.LABEL_VALUE, "target"], [Blockly.Msg.FEATURE, "feature_names"], [Blockly.Msg.mixpy_PYLAB_TICKS_TAG, "target_names"]]), "type"); + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.EIGENVALUES, "data"], + [Blockly.Msg.LABEL_VALUE, "target"], + [Blockly.Msg.FEATURE, "feature_names"], + [Blockly.Msg.mixpy_PYLAB_TICKS_TAG, "target_names"] + ]), "type"); this.setOutput(true, null); this.setColour(SKLEARN_HUE); this.setTooltip(""); @@ -303,7 +308,10 @@ export const sklearn_DecisionTreeClassifier_Regressor = { init: function () { this.appendDummyInput() .appendField("sklearn " + Blockly.Msg.SKLEARN_DECISIONTREE_INIT) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "DecisionTreeClassifier"], [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "DecisionTreeRegressor"]]), "type"); + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "DecisionTreeClassifier"], + [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "DecisionTreeRegressor"] + ]), "type"); this.appendValueInput("model_name") .setCheck(null) .setAlign(Blockly.inputs.Align.RIGHT) @@ -330,7 +338,10 @@ export const sklearn_RandomForestClassifier_Regressor = { init: function () { this.appendDummyInput() .appendField("sklearn " + Blockly.Msg.SKLEARN_RANDOMFOREST_INIT) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "RandomForestClassifier"], [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "RandomForestRegressor"]]), "type"); + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "RandomForestClassifier"], + [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "RandomForestRegressor"] + ]), "type"); this.appendValueInput("model_name") .setCheck(null) .setAlign(Blockly.inputs.Align.RIGHT) @@ -365,7 +376,10 @@ export const sklearn_KNeighborsClassifier_Regressor = { init: function () { this.appendDummyInput() .appendField("sklearn " + Blockly.Msg.SKLEARN_KNN_INIT) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "KNeighborsClassifier"], [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "KNeighborsRegressor"]]), "type"); + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLASSIFICATION_ALGORITHM, "KNeighborsClassifier"], + [Blockly.Msg.SKLEARN_REGRESSION_ALGORITHM, "KNeighborsRegressor"] + ]), "type"); this.appendValueInput("model_name") .setCheck(null) .setAlign(Blockly.inputs.Align.RIGHT) @@ -627,7 +641,10 @@ export const sklearn_coef_intercept = { this.appendDummyInput() .setAlign(Blockly.inputs.Align.RIGHT) .appendField(Blockly.Msg.MIXLY_GET) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_COEF, "coef_"], [Blockly.Msg.SKLEARN_INTERCEPT, "intercept_"]]), "type"); + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_COEF, "coef_"], + [Blockly.Msg.SKLEARN_INTERCEPT, "intercept_"] + ]), "type"); this.setOutput(true, null); this.setColour(SKLEARN_HUE); this.setTooltip(""); @@ -646,7 +663,11 @@ export const sklearn_cluster_centers_labels_inertia = { .appendField(Blockly.Msg.MODEL_NAME); this.appendDummyInput() .appendField(Blockly.Msg.MIXLY_GET) - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_CLUSTER_CENTER, "cluster_centers_"], [Blockly.Msg.SKLEARN_LABELS_AFTER_CLUSTERING, "labels_"], [Blockly.Msg.SKLEARN_CLUSTERING_SUM_OF_SQUARED_DISTANCES, "inertia_"]]), "type"); + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_CLUSTER_CENTER, "cluster_centers_"], + [Blockly.Msg.SKLEARN_LABELS_AFTER_CLUSTERING, "labels_"], + [Blockly.Msg.SKLEARN_CLUSTERING_SUM_OF_SQUARED_DISTANCES, "inertia_"] + ]), "type"); this.setInputsInline(true); this.setOutput(true, null); this.setColour(SKLEARN_HUE); @@ -662,7 +683,10 @@ export const sklearn_save_load_model = { .setCheck(null) .setAlign(Blockly.inputs.Align.RIGHT) .appendField("sklearn") - .appendField(new Blockly.FieldDropdown([[Blockly.Msg.SKLEARN_SAVE_MODEL, "dump"], [Blockly.Msg.SKLEARN_LOAD_MODEL, "load"]]), "type") + .appendField(new Blockly.FieldDropdown([ + [Blockly.Msg.SKLEARN_SAVE_MODEL, "dump"], + [Blockly.Msg.SKLEARN_LOAD_MODEL, "load"] + ]), "type") .appendField(" " + Blockly.Msg.MODEL_NAME); this.appendValueInput("address") .setCheck(null) diff --git a/boards/default_src/python_mixpy/generators/sklearn.js b/boards/default_src/python_mixpy/generators/sklearn.js index 61617a9d..2cf28e8a 100644 --- a/boards/default_src/python_mixpy/generators/sklearn.js +++ b/boards/default_src/python_mixpy/generators/sklearn.js @@ -8,7 +8,7 @@ export const sklearn_make_classification = function (_, generator) { var value_n_clusters_per_class = generator.valueToCode(this, 'n_clusters_per_class', generator.ORDER_ATOMIC) || '2'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_make_classification'] = 'from sklearn.datasets import make_classification'; - var code = 'make_classification(n_samples=' + value_n_samples + ',n_features=' + value_n_features + ',n_informative=' + value_n_informative + ',n_redundant=' + value_n_redundant + ',n_repeated=' + value_n_repeated + ',n_classes=' + value_n_classes + ',n_clusters_per_class=' + value_n_clusters_per_class + ',random_state=' + value_random_state + ')'; + var code = 'make_classification(n_samples=' + value_n_samples + ', n_features=' + value_n_features + ', n_informative=' + value_n_informative + ', n_redundant=' + value_n_redundant + ', n_repeated=' + value_n_repeated + ', n_classes=' + value_n_classes + ', n_clusters_per_class=' + value_n_clusters_per_class + ', random_state=' + value_random_state + ')'; return [code, generator.ORDER_ATOMIC]; } @@ -22,7 +22,7 @@ export const sklearn_make_regression = function (_, generator) { var value_noise = generator.valueToCode(this, 'noise', generator.ORDER_ATOMIC) || '0.0'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_make_regression'] = 'from sklearn.datasets import make_regression'; - var code = 'make_regression(n_samples=' + value_n_samples + ',n_features=' + value_n_features + ',n_informative=' + value_n_informative + ',n_targets=' + value_n_targets + ',bias=' + value_bias + ',noise=' + value_noise + ',random_state=' + value_random_state + ')'; + var code = 'make_regression(n_samples=' + value_n_samples + ', n_features=' + value_n_features + ', n_informative=' + value_n_informative + ', n_targets=' + value_n_targets + ', bias=' + value_bias + ', noise=' + value_noise + ', random_state=' + value_random_state + ')'; return [code, generator.ORDER_ATOMIC]; } @@ -36,7 +36,7 @@ export const sklearn_make_blobs = function (_, generator) { var value_shuffle = generator.valueToCode(this, 'shuffle', generator.ORDER_ATOMIC) || 'True'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_make_blobs'] = 'from sklearn.datasets import make_blobs'; - var code = 'make_blobs(n_samples=' + value_n_samples + ',n_features=' + value_n_features + ',centers=' + value_centers + ',cluster_std=' + value_cluster_std + ',center_box=' + value_center_box + ',shuffle=' + value_shuffle + ',random_state=' + value_random_state + ')'; + var code = 'make_blobs(n_samples=' + value_n_samples + ', n_features=' + value_n_features + ', centers=' + value_centers + ', cluster_std=' + value_cluster_std + ', center_box=' + value_center_box + ', shuffle=' + value_shuffle + ', random_state=' + value_random_state + ')'; return [code, generator.ORDER_ATOMIC]; } @@ -64,10 +64,11 @@ export const sklearn_train_test_split = function (_, generator) { var value_test_size = generator.valueToCode(this, 'test_size', generator.ORDER_ATOMIC) || '0.3'; var value_rondom_state = generator.valueToCode(this, 'rondom_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_train_test_split'] = 'from sklearn.model_selection import train_test_split'; - if (value_train_target == 'None') - var code = 'train_test_split(' + value_train_data + ',test_size = ' + value_test_size + ',random_state = ' + value_rondom_state + ')'; - else - var code = 'train_test_split(' + value_train_data + ',' + value_train_target + ',test_size = ' + value_test_size + ',random_state = ' + value_rondom_state + ')'; + if (value_train_target == 'None') { + var code = 'train_test_split(' + value_train_data + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; + } else { + var code = 'train_test_split(' + value_train_data + ', ' + value_train_target + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; + } return [code, generator.ORDER_ATOMIC]; } @@ -77,7 +78,7 @@ export const sklearn_train_test_split_no_target = function (_, generator) { var value_test_size = generator.valueToCode(this, 'test_size', generator.ORDER_ATOMIC) || '0.3'; var value_rondom_state = generator.valueToCode(this, 'rondom_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_train_test_split'] = 'from sklearn.model_selection import train_test_split'; - var code = 'train_test_split(' + value_train_data + ',test_size = ' + value_test_size + ',random_state = ' + value_rondom_state + ')'; + var code = 'train_test_split(' + value_train_data + ', test_size=' + value_test_size + ', random_state=' + value_rondom_state + ')'; return [code, generator.ORDER_ATOMIC]; } @@ -88,7 +89,7 @@ export const sklearn_LinearRegression = function (_, generator) { var value_normalize = generator.valueToCode(this, 'normalize', generator.ORDER_ATOMIC) || 'False'; var value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import LinearRegression'; - var code = value_model_name + ' = LinearRegression(fit_intercept = ' + value_fit_intercept + ',normalize = ' + value_normalize + ',n_jobs = ' + value_n_jobs + ')\n'; + var code = value_model_name + ' = LinearRegression(fit_intercept=' + value_fit_intercept + ', normalize=' + value_normalize + ', n_jobs=' + value_n_jobs + ')\n'; return code; } @@ -101,7 +102,7 @@ export const sklearn_Ridge = function (_, generator) { var value_max_iter = generator.valueToCode(this, 'max_iter', generator.ORDER_ATOMIC) || '300'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import Ridge'; - var code = value_model_name + ' = Ridge(alpha = ' + value_alpha + ',fit_intercept = ' + value_fit_intercept + ',normalize = ' + value_normalize + ',max_iter = ' + value_max_iter + ',random_state = ' + value_random_state + ')\n'; + var code = value_model_name + ' = Ridge(alpha=' + value_alpha + ', fit_intercept=' + value_fit_intercept + ', normalize=' + value_normalize + ', max_iter=' + value_max_iter + ', random_state=' + value_random_state + ')\n'; return code; } @@ -112,7 +113,7 @@ export const sklearn_DecisionTreeClassifier_Regressor = function (_, generator) var value_max_depth = generator.valueToCode(this, 'max_depth', generator.ORDER_ATOMIC) || 'None'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_' + dropdown_type] = 'from sklearn.tree import ' + dropdown_type; - var code = value_model_name + ' = ' + dropdown_type + '(max_depth = ' + value_max_depth + ',random_state = ' + value_random_state + ')\n'; + var code = value_model_name + ' = ' + dropdown_type + '(max_depth=' + value_max_depth + ', random_state=' + value_random_state + ')\n'; return code; } @@ -124,7 +125,7 @@ export const sklearn_RandomForestClassifier_Regressor = function (_, generator) var value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_' + dropdown_type] = 'from sklearn.ensemble import ' + dropdown_type; - var code = value_model_name + ' = ' + dropdown_type + '(n_estimators = ' + value_n_estimators + ',max_depth = ' + value_max_depth + ',n_jobs = ' + value_n_jobs + ',random_state = ' + value_random_state + ')\n'; + var code = value_model_name + ' = ' + dropdown_type + '(n_estimators=' + value_n_estimators + ', max_depth=' + value_max_depth + ', n_jobs=' + value_n_jobs + ', random_state=' + value_random_state + ')\n'; return code; } @@ -135,7 +136,7 @@ export const sklearn_KNeighborsClassifier_Regressor = function (_, generator) { var value_K = generator.valueToCode(this, 'K', generator.ORDER_ATOMIC) || '5'; var value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_' + dropdown_type] = 'from sklearn.neighbors import ' + dropdown_type; - var code = value_model_name + ' = ' + dropdown_type + '(n_neighbors = ' + value_K + ',n_jobs = ' + value_n_jobs + ')\n'; + var code = value_model_name + ' = ' + dropdown_type + '(n_neighbors=' + value_K + ', n_jobs=' + value_n_jobs + ')\n'; return code; } @@ -170,7 +171,7 @@ export const sklearn_KMeans = function (_, generator) { var value_max_iter = generator.valueToCode(this, 'max_iter', generator.ORDER_ATOMIC) || '300'; var value_random_state = generator.valueToCode(this, 'random_state', generator.ORDER_ATOMIC) || 'None'; generator.definitions_['import_sklearn_KMeans'] = 'from sklearn.cluster import KMeans'; - var code = value_model_name + ' = KMeans(n_clusters = ' + value_n_clusters + ',max_iter = ' + value_max_iter + ',random_state = ' + value_random_state + ')\n'; + var code = value_model_name + ' = KMeans(n_clusters=' + value_n_clusters + ', max_iter=' + value_max_iter + ', random_state=' + value_random_state + ')\n'; return code; } @@ -186,10 +187,11 @@ export const sklearn_fit = function (_, generator) { var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train'; - if (value_train_target == 'None') + if (value_train_target == 'None') { var code = value_model_name + '.fit(' + value_train_data + ')\n'; - else - var code = value_model_name + '.fit(' + value_train_data + ',' + value_train_target + ')\n'; + } else { + var code = value_model_name + '.fit(' + value_train_data + ', ' + value_train_target + ')\n'; + } return code; } @@ -214,10 +216,11 @@ export const sklearn_score = function (_, generator) { var value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; var value_train_data = generator.valueToCode(this, 'train_data', generator.ORDER_ATOMIC) || 'X_train'; var value_train_target = generator.valueToCode(this, 'train_target', generator.ORDER_ATOMIC) || 'y_train'; - if (value_train_target == 'None') + if (value_train_target == 'None') { var code = value_model_name + '.score(' + value_train_data + ')'; - else - var code = value_model_name + '.score(' + value_train_data + ',' + value_train_target + ')'; + } else { + var code = value_model_name + '.score(' + value_train_data + ', ' + value_train_target + ')'; + } return [code, generator.ORDER_ATOMIC]; } @@ -252,9 +255,10 @@ export const sklearn_save_load_model = function (_, generator) { var value_address = generator.valueToCode(this, 'address', generator.ORDER_ATOMIC) || 'D:/mixly/test.pkl'; generator.definitions_['import_sklearn_joblib'] = 'import joblib'; var code = ''; - if (dropdown_type == 'dump') - code = 'joblib.dump(' + value_model_name + ',' + value_address + ')\n'; - else + if (dropdown_type == 'dump') { + code = 'joblib.dump(' + value_model_name + ', ' + value_address + ')\n'; + } else { code = value_model_name + ' = joblib.load(' + value_address + ')\n'; + } return code; } \ No newline at end of file diff --git a/boards/default_src/python_mixpy/template.xml b/boards/default_src/python_mixpy/template.xml index 3c87e325..8ba4021a 100644 --- a/boards/default_src/python_mixpy/template.xml +++ b/boards/default_src/python_mixpy/template.xml @@ -3502,7 +3502,7 @@ - iris_X + iris_x @@ -3623,7 +3623,7 @@ - X + x @@ -3680,7 +3680,7 @@ - X + x @@ -3692,7 +3692,7 @@ - X_train + x_train @@ -3709,7 +3709,7 @@ - X_test + x_test @@ -3726,7 +3726,7 @@ - X_test + x_test diff --git a/boards/default_src/python_pyodide/blocks/sklearn.js b/boards/default_src/python_pyodide/blocks/sklearn.js new file mode 100644 index 00000000..4a706272 --- /dev/null +++ b/boards/default_src/python_pyodide/blocks/sklearn.js @@ -0,0 +1,36 @@ +/** + * @typedef {import('@mixly/python-mixpy').PythonMixpySKLearnBlocks} PythonMixpySKLearnBlocks + */ +import * as Blockly from 'blockly/core'; + +const SKLEARN_HUE = 80; + + +/** + * @override Override {@link PythonMixpySKLearnBlocks.sklearn_LinearRegression} + */ +//sklearn 初始化线性回归 +export const sklearn_LinearRegression = { + init: function () { + this.appendDummyInput() + .appendField('sklearn ' + Blockly.Msg.SKLEARN_LINEARREGRESSION_INIT); + this.appendValueInput('model_name') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.MODEL_NAME); + this.appendValueInput('fit_intercept') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_CALCULATE_MODEL_INTERRUPT); + this.appendValueInput('n_jobs') + .setCheck(null) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(Blockly.Msg.SKLEARN_THREADS); + this.setInputsInline(false); + this.setPreviousStatement(true, null); + this.setNextStatement(true, null); + this.setColour(SKLEARN_HUE); + this.setTooltip(''); + this.setHelpUrl(''); + } +}; \ No newline at end of file diff --git a/boards/default_src/python_pyodide/export.js b/boards/default_src/python_pyodide/export.js index e69de29b..70d64194 100644 --- a/boards/default_src/python_pyodide/export.js +++ b/boards/default_src/python_pyodide/export.js @@ -0,0 +1,7 @@ +import * as PythonPyodideSKLearnBlocks from './blocks/sklearn'; +import * as PythonPyodideSKLearnGenerators from './generators/sklearn'; + +export { + PythonPyodideSKLearnBlocks, + PythonPyodideSKLearnGenerators +}; \ No newline at end of file diff --git a/boards/default_src/python_pyodide/generators/sklearn.js b/boards/default_src/python_pyodide/generators/sklearn.js new file mode 100644 index 00000000..53dee6d7 --- /dev/null +++ b/boards/default_src/python_pyodide/generators/sklearn.js @@ -0,0 +1,13 @@ +/** + * @typedef {import('@mixly/python-mixpy').PythonMixpySKLearnGenerators} PythonMixpySKLearnGenerators + */ + +// sklearn 初始化线性回归 +export const sklearn_LinearRegression = function (_, generator) { + const value_model_name = generator.valueToCode(this, 'model_name', generator.ORDER_ATOMIC) || 'model'; + const value_fit_intercept = generator.valueToCode(this, 'fit_intercept', generator.ORDER_ATOMIC) || 'True'; + const value_n_jobs = generator.valueToCode(this, 'n_jobs', generator.ORDER_ATOMIC) || 'None'; + generator.definitions_['import_sklearn_linear_model'] = 'from sklearn.linear_model import LinearRegression'; + const code = value_model_name + ' = LinearRegression(fit_intercept=' + value_fit_intercept + ', n_jobs=' + value_n_jobs + ')\n'; + return code; +} \ No newline at end of file diff --git a/boards/default_src/python_pyodide/index.js b/boards/default_src/python_pyodide/index.js index eb3019da..85c308b0 100644 --- a/boards/default_src/python_pyodide/index.js +++ b/boards/default_src/python_pyodide/index.js @@ -67,6 +67,11 @@ import { PythonMixpyTurtleGenerators } from '@mixly/python-mixpy'; +import { + PythonPyodideSKLearnBlocks, + PythonPyodideSKLearnGenerators +} from './'; + import './others/loader'; import './css/color_mixpy_python_advance.css'; @@ -108,6 +113,7 @@ Object.assign( PythonMixpySKLearnBlocks, PythonMixpySystemBlocks, PythonMixpyTurtleBlocks, + PythonPyodideSKLearnBlocks ); Object.assign( @@ -139,5 +145,6 @@ Object.assign( PythonMixpySerialGenerators, PythonMixpySKLearnGenerators, PythonMixpySystemGenerators, - PythonMixpyTurtleGenerators + PythonMixpyTurtleGenerators, + PythonPyodideSKLearnGenerators ); \ No newline at end of file diff --git a/boards/default_src/python_pyodide/template.xml b/boards/default_src/python_pyodide/template.xml index 9001fdcb..1a58a660 100644 --- a/boards/default_src/python_pyodide/template.xml +++ b/boards/default_src/python_pyodide/template.xml @@ -3467,7 +3467,7 @@ - iris_X + iris_x @@ -3495,11 +3495,6 @@ TRUE - - - FALSE - - @@ -3588,7 +3583,7 @@ - X + x @@ -3645,7 +3640,7 @@ - X + x @@ -3657,7 +3652,7 @@ - X_train + x_train @@ -3674,7 +3669,7 @@ - X_test + x_test @@ -3691,7 +3686,7 @@ - X_test + x_test @@ -3717,7 +3712,7 @@ - D:/mixly/test.pkl + /test.pkl