์ฌํ ๋จ๊ณ:
@dancuarini ๋๋ ์ด๊ฒ์ ๋ก์ปฌ์์ ์ฌํํ๋ ค๊ณ ํ์ง๋ง ํ ์ ์์์ต๋๋ค. AutoMLSearch๋ฅผ ์คํํ๊ธฐ ์ ์ ์ถ๊ฐ ๋จ๊ณ(์: ๋ฐ์ดํฐ ๋ถํ ํฌ๊ธฐ, ์ด ์ญ์ ) ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ตฌ์ฑ์ ๋ํด ์ด์ผ๊ธฐํฉ์๋ค!
๋ก์ปฌ์์ ์คํํ๋ ค๊ณ ์๋ํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
from evalml.automl import AutoMLSearch
import pandas as pd
import woodwork as ww
from evalml.automl.callbacks import raise_error_callback
happiness_data_set = pd.read_csv("Happiness Data Full Set.csv")
y = happiness_data_set['Happiness']
X = happiness_data_set.drop(['Happiness'], axis=1)
# display(X.head())
X = ww.DataTable(X)
X_train, X_holdout, y_train, y_holdout = evalml.preprocessing.split_data(X, y, problem_type='regression', test_size=0.2, random_seed=0)
# print(X.types)
automl = AutoMLSearch(X, y, problem_type="regression", objective="MAE", error_callback=raise_error_callback, max_batches=20, ensembling=True)
automl.search()
๊ทธ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ์์๊ฐ ๋ํ๋ฉ๋๋ค.
ํ์ฌ ์งํ ์ํฉ: @dancuarini ์ ๋ก์ปฌ์์ ๋ฌธ์ ์ ๋ํด ๋ ผ์ํ์ผ๋ฉฐ @Cmancuso ์ ๊ณ์ ์ฐ๋ฝํ ๊ฒ์ ๋๋ค.
@angela97lin ์ ๊น๋ง,
์ฌ์์ฐ ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
@dsherry ์คํํ ์์๋ธ๋ฌ๊ฐ ๋งจ ์์ ์์ง ์๋ค๋ ๊ฒ์ด ์ฝ๊ฐ ์์ฌ
@angela97lin ์ ๋ค ์ดํดํ์ต๋๋ค! ๋ด๊ฐ ๋น์ ์๊ฒ ๋ช ๊ฐ์ง ๋ฉ๋ชจ๋ฅผ ๋ณด๋์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ์ ์์๋ธ์ด ํญ์ ์ ์์ ๊ฐ๊น์ง ์๋ค๋ ์ฆ๊ฑฐ๊ฐ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์กฐ๊ธ ๋ ํ์ญ์์ค. ์์๋ธ๋ฌ๊ฐ ์ด ๋ฐ์ดํฐ ์ธํธ์์ ์ ๋๋ก ์๋ํ์ง ์๋ ๋ฐ์๋ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ์ดํฐ ์ธํธ๋ ์ ๋ง ์์ผ๋ฉฐ ํ์ฌ ๋ฐ์ดํฐ ๋ถํ ์ ๋ต์ ์์๋ธ๋ฌ์ ๋งค์ฐ ์์ ๋ฐ์ดํฐ ํ์ ์งํฉ์ด ์ ๊ณต๋๊ณ ๊ฒ์ฆ๋จ์ ์๋ฏธํฉ๋๋ค. ์ง๊ธ ๋น์ฅ ์คํํ ์์๋ธ๋ฌ๋ฅผ ํ๋ จ์ํค๋ ค๋ฉด ์์๋ธ๋ฌ๊ฐ ํ๋ จํ ๋ฐ์ดํฐ( ensembling_indices
์๋ณ)๋ฅผ ๋ถํ ํฉ๋๋ค. ์ด๊ฒ์ ์
๋ ฅ ํ์ดํ๋ผ์ธ์ด ์ด๋ฏธ ํ๋ จ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐ์ดํฐ์ ๋ํ ๊ธ์ ํ์ต๊ธฐ๋ฅผ ํ๋ จํ์ฌ ์์๋ธ๋ฌ๋ฅผ ๊ณผ์ ํฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ๋์ CV ๋ถํ ์ ์ํํ์ฌ ensembling_indices
์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ถํ ํฉ๋๋ค. 128๊ฐ ํ์ ์ด ๋ฐ์ดํฐ ์ธํธ์ ๋ํด ๊ฐ๊ฐ 17๊ฐ ๋ฐ 8๊ฐ ํ์ ๋ํด ํ์ตํ๊ณ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค. ์ด ์ถ๊ฐ CV ๋ถํ ์ ์ํํ ์ง ์ฌ๋ถ๋ฅผ ๋
ผ์ํ๊ธฐ ์ํด #2144๋ฅผ ์ ์ถํ์ต๋๋ค.
์ฐ๋ฆฌ์ ์์๋ธ์ ํ์ฌ ๋ฐ๊ฒฌ๋ ๊ฐ ๋ชจ๋ธ ํจ๋ฐ๋ฆฌ์ ์ต์์ ํ์ดํ๋ผ์ธ์ ์ ํํ๊ณ ์ด๋ฅผ ์คํํ ์์๋ธ์ ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ผ๋ก ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ์ฑ๋ฅ์ด ๋งค์ฐ ์ ์กฐํ๋ฉด ์คํ ์์๋ธ๋ฌ๊ฐ ๊ณ ์ฑ๋ฅ ๊ฐ๋ณ ํ์ดํ๋ผ์ธ๋งํผ ์ฑ๋ฅ์ โโ๋ฐํํ์ง ๋ชปํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์์ ์ต์ข
์์ ํ
์ด๋ธ์
๋๋ค.
์ฐ๋ฆฌ๋ stacked ensemble์ด ์ค๊ฐ์ ์ฌ๋ฐ๋ฅธ smack์ ์ํํ๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋จ์ํํ๊ณ stacked ensemble์ด ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ์์ธก์ ํ๊ท ํํ๋ค๊ณ ๋งํ๋ฉด ์ด๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ด ๊ฐ์ค์ ํ ์คํธํ๊ธฐ ์ํด ๋ชจ๋ ๋ชจ๋ธ ํจ๋ฐ๋ฆฌ๊ฐ ์๋๋ผ ์คํํ ์์๋ธ๋ณด๋ค ์ฑ๋ฅ์ด ๋ ์ข์ ๋ชจ๋ธ ํจ๋ฐ๋ฆฌ๋ง ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๊ฒฐ๊ณผ ์ ์๊ฐ ๊ฐ๋ณ ํ์ดํ๋ผ์ธ๋ณด๋ค ํจ์ฌ ๋ ๋์ ์ฑ๋ฅ์ ๋ฐํํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด๊ฒ์ ์ ๋ก ํ์ฌ๊ธ ์ฑ๋ฅ์ด ์ข์ง ์์ ๊ฐ๋ณ ํ์ดํ๋ผ์ธ์ด ์คํ ์์๋ธ๋ฌ์ ์ฑ๋ฅ์ ์ ํ์์ผฐ๋ค๊ณ ๋ฏฟ๊ฒ ๋ง๋ญ๋๋ค.
์ด์ ๋ํ ์ฌํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์์:
import pandas as pd
import woodwork as ww
happiness_data_set = pd.read_csv("Happiness Data Full Set.csv")
y = happiness_data_set['Happiness']
X = happiness_data_set.drop(['Happiness'], axis=1)
X = ww.DataTable(X)
X_train, X_holdout, y_train, y_holdout = evalml.preprocessing.split_data(X, y, problem_type='regression', test_size=0.25, random_seed=0)
automl = AutoMLSearch(X, y, problem_type="regression", objective="MAE", error_callback=raise_error_callback, max_batches=10, ensembling=True)
automl.search()
import woodwork as ww
from evalml.automl.engine import train_and_score_pipeline
from evalml.automl.engine.engine_base import JobLogger
# Get the pipelines fed into the ensemble but only use the ones better than the stacked ensemble
input_pipelines = []
input_info = automl._automl_algorithm._best_pipeline_info
from evalml.model_family import ModelFamily
trimmed = dict()
trimmed.update({ModelFamily.RANDOM_FOREST: input_info[ModelFamily.RANDOM_FOREST]})
trimmed.update({ModelFamily.XGBOOST: input_info[ModelFamily.XGBOOST]})
trimmed.update({ModelFamily.DECISION_TREE: input_info[ModelFamily.EXTRA_TREES]})
for pipeline_dict in trimmed.values():
pipeline_class = pipeline_dict['pipeline_class']
pipeline_params = pipeline_dict['parameters']
input_pipelines.append(pipeline_class(parameters=automl._automl_algorithm._transform_parameters(pipeline_class, pipeline_params),
random_seed=automl._automl_algorithm.random_seed))
ensemble_pipeline = _make_stacked_ensemble_pipeline(input_pipelines, "regression")
X_train = X.iloc[automl.ensembling_indices]
y_train = ww.DataColumn(y.iloc[automl.ensembling_indices])
train_and_score_pipeline(ensemble_pipeline, automl.automl_config, X_train, y_train, JobLogger())
์ด ์ธ ๊ฐ์ง ๋ชจ๋ธ ์ ํ๊ตฐ์ ์ฌ์ฉํ๋ฉด ~0.22์ MAE ์ ์๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ ์ด๋ ๊ฐ๋ณ ํ์ดํ๋ผ์ธ๋ณด๋ค ํจ์ฌ ์ฐ์ํฉ๋๋ค.
#output of train_and_score_pipeline(ensemble_pipeline, automl.automl_config, X_train, y_train, JobLogger())
{'scores': {'cv_data': [{'all_objective_scores': OrderedDict([('MAE',
0.22281276417465426),
('ExpVariance', 0.9578811127332543),
('MaxError', 0.3858477236606914),
('MedianAE', 0.2790362808260225),
('MSE', 0.0642654425375983),
('R2', 0.9152119239698017),
('Root Mean Squared Error', 0.2535062968401343),
('# Training', 17),
('# Validation', 9)]),
'mean_cv_score': 0.22281276417465426,
'binary_classification_threshold': None}],
'training_time': 9.944366216659546,
'cv_scores': 0 0.222813
dtype: float64,
'cv_score_mean': 0.22281276417465426},
'pipeline': TemplatedPipeline(parameters={'Stacked Ensemble Regressor':{'input_pipelines': [GeneratedPipeline(parameters={'Imputer':{'categorical_impute_strategy': 'most_frequent', 'numeric_impute_strategy': 'most_frequent', 'categorical_fill_value': None, 'numeric_fill_value': None}, 'One Hot Encoder':{'top_n': 10, 'features_to_encode': None, 'categories': None, 'drop': 'if_binary', 'handle_unknown': 'ignore', 'handle_missing': 'error'}, 'Random Forest Regressor':{'n_estimators': 184, 'max_depth': 25, 'n_jobs': -1},}), GeneratedPipeline(parameters={'Imputer':{'categorical_impute_strategy': 'most_frequent', 'numeric_impute_strategy': 'mean', 'categorical_fill_value': None, 'numeric_fill_value': None}, 'One Hot Encoder':{'top_n': 10, 'features_to_encode': None, 'categories': None, 'drop': 'if_binary', 'handle_unknown': 'ignore', 'handle_missing': 'error'}, 'XGBoost Regressor':{'eta': 0.1, 'max_depth': 6, 'min_child_weight': 1, 'n_estimators': 100},}), GeneratedPipeline(parameters={'Imputer':{'categorical_impute_strategy': 'most_frequent', 'numeric_impute_strategy': 'mean', 'categorical_fill_value': None, 'numeric_fill_value': None}, 'One Hot Encoder':{'top_n': 10, 'features_to_encode': None, 'categories': None, 'drop': 'if_binary', 'handle_unknown': 'ignore', 'handle_missing': 'error'}, 'Extra Trees Regressor':{'n_estimators': 100, 'max_features': 'auto', 'max_depth': 6, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'n_jobs': -1},})], 'final_estimator': None, 'cv': None, 'n_jobs': -1},}),
์ด๊ฒ์ ์คํํ ์์๋ธ๋ฌ์ ์ด๋ค ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ๊ณต๊ธํด์ผ ํ๋์ง ๋ค์ ์๊ฐํด์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค.
stacking_test
๋ถ๊ธฐ๋ฅผ ํตํด ํ
์คํธํ์ผ๋ฉฐ ์์๋ธ๋ฌ๊ฐ ํจ์ฌ ๋ ์ ์ํ๋ฉ๋๋ค.@dsherry์์ ๋ ผ์ ํ ๋ค์ ๋จ๊ณ:
๋ค๋ฅธ ๋ฐ์ดํฐ ์ธํธ์์ #1 ๋ฐ #3(Elastic Net ์ฌ์ฉ)์ ์๋ํ๊ณ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์คํํ์ฌ ์ ๋ฐ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ์ ์ป์ ์ ์๋์ง ํ์ธํ์ญ์์ค.
@angela97lin ์์ ๋ฐ์ดํฐ ์ธํธ์ ๋ํ ๋ถํ ์ ๋ํ ๊ทํ์ ์์ ์ ๋ชฉํ์ ๋ง์ต๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ์์ ๋ฐ์ดํฐ์ ์ ๋ ํฐ ๋ฐ์ดํฐ์ ๊ณผ ์ ๋ง ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด LOOCV๋ฅผ ํฌํจํ ์ ์ฒด ๋ฐ์ดํฐ์ ์ ํด๋ ์๊ฐ ๋ง์ xval๋ง ์ฌ์ฉํ๊ณ ์์๋ธ ๊ธ์ ํ์ต๊ธฐ ํ๋ จ์ ์ํด ํด๋๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
๋๋ ๋ํ metalearner๊ฐ ๊ฐ๋ ฅํ ์ ๊ทํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ ๋ H2O-3 StackedEnsemble์์ Elastic Net์ ์ฌ์ฉํ๋๋ฐ ์์๋ธ์ด ๋ฆฌ๋๋ณด๋์์ 2์๋ฅผ ํ ๊ธฐ์ต์ด ๋ฑ ํ ๋ฒ ์์ต๋๋ค. ๋งค๋ฒ ํ ์คํธํ ๋๋ง๋ค 1์์์ต๋๋ค. ์ ๊ทํ๋ ์ด์ ํ ๋ชจ๋ธ์ด ์์๋ธ์ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ ๊ฒ์ ํ์ฉํด์๋ ์ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ฌ์ง์ด 50๊ฐ ๋ชจ๋ธ์ ์ ์ฒด ์์ํ๋ฅผ metalearner์ ๊ณต๊ธํ๊ณ ์์์ต๋๋ค. :-)
์ด๊ฒ์ ๋ํ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ์ญ์์ค.
๋ชจ๋ ํ๊ท ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ์์ ํ ์คํธํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค ์ฌ๊ธฐ ํ๊ฑฐ๋ ์ฐจํธ ์ฌ๊ธฐ .
์ด๊ฒ์ผ๋ก๋ถํฐ:
StackedEnsembler
๋ฅผ ํ๋ จํ ๋ ์ด ์์ ๋ฐ์ดํฐ ์ธํธ์ ๋ํด ์
๋ ฅ ํ์ดํ๋ผ์ธ๊ณผ metalearner๋ฅผ ํ๋ จํ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ ์ํํ์ง ๋ชปํ๋ ์ด์ ์ผ ์ ์์ต๋๋ค. ์
๋ ฅ ํ์ดํ๋ผ์ธ์ ๋งค๊ฐ๋ณ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ํ ๊ฒ์ด์ง๋ง ์ด๋ฌํ ํ์ดํ๋ผ์ธ์ ์ ํฉํ์ง ์์ต๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ์์ฒด ๊ตฌํ์ ๋กค๋งํ๋ฉด ํ๋ จ๋ ํ์ดํ๋ผ์ธ์ ์์๋ธ๋ฌ์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ์ํ๋ ๋์์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ํ์ฌ๋ก์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.๋ค์ ๋จ๊ณ: ์์๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ด ๊ฐ์ค์ ํ ์คํธํฉ๋๋ค. ๋ฐ์ดํฐ์ 80%์ ๋ํด ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ์๋์ผ๋ก ํ๋ จํ๊ณ , ์์๋ธ์ ์ํด ๋ฐ๋ก ์ค์ ํ ๋ฐ์ดํฐ์ ๋ํด ๊ต์ฐจ ๊ฒ์ฆ๋ ์์ธก์ ์์ฑํ๊ณ , ์์ธก์ ์ด๊ณผํ๋ ๊ธ์ ํ์ต๊ธฐ๋ฅผ ํ๋ จ์ํค์ญ์์ค.
์คํ ๊ฒฐ๊ณผ๊ฐ ์ข์ ๋ณด์ ๋๋ค: https://alteryx.quip.com/4hEyAaTBZDap/Ensembling-Performance-Using-More-Data
๋ค์ ๋จ๊ณ:
์กฐ์ฌํ ๊ฒฐ๊ณผ ๋ฌธ์ ๋ ์์๋ธ์ ์ฑ๋ฅ์ด ์๋๋ผ ์์๋ธ์ ์ฑ๋ฅ์ ๋ณด๊ณ ํ๋ ๋ฐฉ๋ฒ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ๋ฐ์ดํฐ์ 20%์ ํด๋นํ๋ ๋ณ๋์ ์์๋ธ ๋ถํ ์ ์ํํ ๋ค์ ๋ค๋ฅธ train-validation ๋ถํ ์ ์ํํ๊ณ ์์๋ธ์ ์ ์๋ฅผ validation ๋ฐ์ดํฐ๋ก ๋ณด๊ณ ํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์์๋ธ ์ ์๊ฐ ๋งค์ฐ ์ ์ ์์ ํ์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค(์์ ํ๋ณต ๋ฐ์ดํฐ ์ธํธ์ ๊ฐ์ด).
์์๋ธ ์ธ๋ฑ์ค ๋ถํ ์ ์ ๊ฑฐํ๊ณ ์์๋ธ์ ๋ํ cv ํ์ต ์ ์๋ฅผ ๊ณ์ฐํ๋ ์ด์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ(๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ณต, ํ์ต ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ๊ฒน์ผ๋ก ์ํ), ์์๋ธ์ด ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์์ ๋ ๋์ ์์์ ์์์ ์ ์ ์์ต๋๋ค. ๋ ๋ง์ ๊ฒฝ์ฐ์ 1์์ ๋๋ค. ํํธ, ๊ฒ์ฆ ์ ์๋ ๋์ผํ๊ฑฐ๋ ์ฝ๊ฐ ๋ ์ข์ต๋๋ค.
ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ํ๋ จ๋์ง ์๊ณ ์์๋ธ์ ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ์์ธก๊ฐ๋ง ์ ๋ ฅ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ๊ณผ์ ํฉ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์์ฒด ์์๋ธ ๊ตฌํ์ ๋ค์ ๋ฐฉ๋ฌธํ๊ณ ๋ถํ ์ ๋ต์ ์ ๋ฐ์ดํธํ ์ ์์ง๋ง ์ง๊ธ์ ๋ฐ์ดํฐ ๋ถํ ์ ๋ต๊ณผ scikit-learn์ ๊ตฌํ์ ๋ณ๊ฒฝํ์ฌ ๊ฐ์ ์ฌํญ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์์๋ธ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ ์ ํฉ ์๊ฐ์ ์ฆ๊ฐ์ํต๋๋ค. ๋ชจ๋ ํ์ดํ๋ผ์ธ์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ (์์ฝ๋ ์์๋ธ ์ธ๋ฑ์ค ์์) ์์๋ธ์ ๋ ๋ง์ ๋ฐ์ดํฐ์ ๋ํด ํ๋ จ๋ฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ๋ค.
๊ฒฐ๊ณผ ํ: https://alteryx.quip.com/jI2mArnWZfTU/Ensembling-vs-Best-Pipeline-Validation-Scores#MKWACADlCDt