Scikit-learn: λ³€ν™˜κΈ° 단계에 λŒ€ν•΄ μ—†μŒμ΄ μžˆλŠ” νŒŒμ΄ν”„λΌμΈμ—μ„œ κ·Έλ¦¬λ“œ 검색 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2020λ…„ 11μ›” 12일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: scikit-learn/scikit-learn

버그 μ„€λͺ…

λ³€ν™˜κΈ° 단계에 λŒ€ν•΄ None κ°€ μžˆλŠ” νŒŒμ΄ν”„λΌμΈμ—μ„œ κ·Έλ¦¬λ“œ 검색을 μˆ˜ν–‰ν•˜λ©΄ AttributeError κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ•„λž˜μ˜ 이 μŠ€λ‹ˆνŽ«μ€ 이전에 scikit-learn==0.23.2 μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰λ˜μ—ˆμ§€λ§Œ 더 이상 0.24.dev0 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž¬ν˜„ν•  단계/μ½”λ“œ

from sklearn.datasets import load_iris
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

iris = load_iris()
X, y = iris.data, iris.target

pipe = Pipeline([("setup", None), ("svc", SVC(kernel="linear", random_state=0))])

param_grid = [
    {"svc__C": [0.1, 0.1]},
    {"setup": [StandardScaler()]},
]

gs = GridSearchCV(pipe, param_grid=param_grid, return_train_score=True, cv=3)
gs.fit(X, y)

μ˜ˆμƒ κ²°κ³Ό

예: 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ˜ˆμƒ κ²°κ³Όλ₯Ό λΆ™μ—¬λ„£κ±°λ‚˜ μ„€λͺ…ν•˜μ‹­μ‹œμ˜€.

GridSearchCV.fit ν˜ΈμΆœμ„ μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œ κ²°κ³Ό

μ‹€μ œ 좜λ ₯ λ˜λŠ” 역좔적을 λΆ™μ—¬λ„£κ±°λ‚˜ ꡬ체적으둜 μ„€λͺ…ν•˜μ‹­μ‹œμ˜€.

λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€(μ•„λž˜μ— 전체 역좔적을 ν¬ν•¨ν–ˆμŠ΅λ‹ˆλ‹€).

  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/base.py", line 863, in _is_pairwise
    pairwise_tag = estimator._get_tags().get('pairwise', False)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/base.py", line 348, in _get_tags
    more_tags = base_class._more_tags(self)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/pipeline.py", line 626, in _more_tags
    estimator_tags = self.steps[0][1]._get_tags()
AttributeError: 'NoneType' object has no attribute '_get_tags'

_is_pairwise 검사가 단계 λ³€ν™˜κΈ°μ— λŒ€ν•΄ None κ°€ μžˆλŠ” νŒŒμ΄ν”„λΌμΈμ— 적용될 λ•Œ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.


전체 역좔적:

Traceback (most recent call last):
  File "test-pipeline.py", line 18, in <module>
    gs.fit(X, y)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/utils/validation.py", line 60, in inner_f
    return f(*args, **kwargs)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/model_selection/_search.py", line 841, in fit
    self._run_search(evaluate_candidates)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/model_selection/_search.py", line 1288, in _run_search
    evaluate_candidates(ParameterGrid(self.param_grid))
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/model_selection/_search.py", line 795, in evaluate_candidates
    out = parallel(delayed(_fit_and_score)(clone(base_estimator),
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/parallel.py", line 1048, in __call__
    if self.dispatch_one_batch(iterator):
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/parallel.py", line 866, in dispatch_one_batch
    self._dispatch(tasks)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/parallel.py", line 784, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/_parallel_backends.py", line 208, in apply_async
    result = ImmediateResult(func)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/_parallel_backends.py", line 572, in __init__
    self.results = batch()
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/parallel.py", line 262, in __call__
    return [func(*args, **kwargs)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/joblib/parallel.py", line 262, in <listcomp>
    return [func(*args, **kwargs)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/utils/fixes.py", line 222, in __call__
    return self.function(*args, **kwargs)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/model_selection/_validation.py", line 585, in _fit_and_score
    X_train, y_train = _safe_split(estimator, X, y, train)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/utils/metaestimators.py", line 198, in _safe_split
    if _is_pairwise(estimator):
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/base.py", line 863, in _is_pairwise
    pairwise_tag = estimator._get_tags().get('pairwise', False)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/base.py", line 348, in _get_tags
    more_tags = base_class._more_tags(self)
  File "/Users/james/miniforge3/envs/dask-ml/lib/python3.8/site-packages/sklearn/pipeline.py", line 626, in _more_tags
    estimator_tags = self.steps[0][1]._get_tags()
AttributeError: 'NoneType' object has no attribute '_get_tags'

버전

System:
    python: 3.8.6 | packaged by conda-forge | (default, Oct  7 2020, 18:42:56)  [Clang 10.0.1 ]
executable: /Users/james/miniforge3/envs/dask-ml/bin/python3.8
   machine: macOS-10.15.5-x86_64-i386-64bit

Python dependencies:
          pip: 20.2.4
   setuptools: 49.6.0.post20201009
      sklearn: 0.24.dev0
        numpy: 1.19.4
        scipy: 1.5.3
       Cython: None
       pandas: 1.1.4
   matplotlib: None
       joblib: 0.17.0
threadpoolctl: 2.1.0

Built with OpenMP: True
Blocker Bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

None μ‚¬μš©ν•  λ•Œ 였λ₯˜κ°€ λ‚˜νƒ€λ‚  뿐만 μ•„λ‹ˆλΌ _get_tags 속성이 μ—†λŠ” 단계λ₯Ό μ‚¬μš©ν•  λ•Œ 였λ₯˜κ°€ ν‘œμ‹œλ˜κΈ° λ•Œλ¬Έμ— μ°¨λ‹¨κΈ°λ‘œ ν‘œμ‹œν•˜κ² μŠ΅λ‹ˆλ‹€ None BaseEstimator )

λͺ¨λ“  3 λŒ“κΈ€

@jrbourbeau 보고

None μ‚¬μš©ν•  λ•Œ 였λ₯˜κ°€ λ‚˜νƒ€λ‚  뿐만 μ•„λ‹ˆλΌ _get_tags 속성이 μ—†λŠ” 단계λ₯Ό μ‚¬μš©ν•  λ•Œ 였λ₯˜κ°€ ν‘œμ‹œλ˜κΈ° λ•Œλ¬Έμ— μ°¨λ‹¨κΈ°λ‘œ ν‘œμ‹œν•˜κ² μŠ΅λ‹ˆλ‹€ None BaseEstimator )

#18797에 μ˜ν•΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ‹œκΈ° μ μ ˆν•œ 버그 λ³΄κ³ μ„œ @jrbourbeau에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰