Evalml: One Hot Encoder: 두 개의 λ²”μ£Όκ°€ μžˆλŠ” κΈ°λŠ₯에 λŒ€ν•΄ 기본적으둜 ν•˜λ‚˜μ˜ 쀑볡 κΈ°λŠ₯을 μ‚­μ œν•©λ‹ˆλ‹€.

에 λ§Œλ“  2021λ…„ 03μ›” 05일  Β·  14μ½”λ©˜νŠΈ  Β·  좜처: alteryx/evalml

ν•˜λ‚˜μ˜ ν•« μΈμ½”λ”λŠ” μ›λž˜ λ²”μ£Όν˜• κΈ°λŠ₯의 λͺ¨λ“  μˆ˜μ€€μ— λŒ€ν•œ κΈ°λŠ₯을 μƒμ„±ν•©λ‹ˆλ‹€.

from evalml.pipelines import OneHotEncoder
import pandas as pd
df = pd.DataFrame({"category": ["a", "b"], "number": [4,5 ]})
OneHotEncoder().fit_transform(df).to_dataframe()

image

category_a 및 category_b 열은 μ™„μ „νžˆ 동일선상에 μžˆμœΌλ―€λ‘œ ν•˜λ‚˜κ°€ μ€‘λ³΅λ©λ‹ˆλ‹€. μ΄λŠ” μΆ”μ •κΈ° ν”ΌνŒ…μ— 뢀정적인 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 ν•˜λ‚˜λ₯Ό μ‚­μ œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

참고둜 @rpeck

enhancement

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

μ½”λ“œμ˜ 제3법칙: Thou Shalt Not Make == 뢀동 μ†Œμˆ˜μ  비ꡐ

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

πŸ’― % 뢀정적인 경우 열을 μ‚­μ œν•΄μ•Ό ν•©λ‹ˆλ‹€.

μš°λ¦¬κ°€ λ¨Όμ € OHEλ₯Ό μˆ˜ν–‰ν•˜λ©΄ sklearn이 이λ₯Ό ν™•μž₯ν•˜μ§€ μ•ŠκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€. Freddyκ°€ λ§ν–ˆλ“―μ΄ μ™„λ²½ν•œ 곡선성을 κ°–λŠ” 두 개의 열을 μƒμ„±ν•˜λŠ” κ²ƒμœΌλ‘œ 생각할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°”μ΄λ„ˆλ¦¬λ₯Ό ν•˜λ‚˜κ°€ μ•„λ‹Œ 두 개의 μ—΄λ‘œ ν™•μž₯ν•˜λŠ” 데 두 가지 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

  1. λ‹€λ₯Έ ν˜•νƒœμ˜ νŠΉμ§• 곡선성과 λ§ˆμ°¬κ°€μ§€λ‘œ ν•˜λ‚˜μ˜ 원본 μ†ŒμŠ€ μ—΄μ˜ νš¨κ³Όκ°€ 두 개의 OHE μ—΄λ‘œ λ‚˜λˆ„μ–΄μ§€κΈ° λ•Œλ¬Έμ— 해석 κ°€λŠ₯μ„±μ—μ„œ λ§Žμ€ 것을 μ—‰λ§μœΌλ‘œ λ§Œλ“­λ‹ˆλ‹€. Freddy의 μƒˆλ‘œμš΄ SHAP 둀업은 λΆ„λͺ…νžˆ 이 문제λ₯Ό ν•΄κ²°ν•˜μ§€λ§Œ κΈ°λŠ₯ μ€‘μš”λ„ 및 λΆ€λΆ„ 쒅속성 ν”Œλ‘―κ³Ό 같은 ν•­λͺ©μ—λŠ” μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
  2. Random Forest 및 GBMκ³Ό 같은 트리 λͺ¨λΈμ€ μž…λ ₯ κΈ°λŠ₯을 λ¬΄μž‘μœ„λ‘œ μƒ˜ν”Œλ§ν•©λ‹ˆλ‹€. 이 경우 μ†ŒμŠ€ 열은 μ‹€μ œλ³΄λ‹€ 2λ°° 더 자주 λ¬΄μž‘μœ„λ‘œ μƒ˜ν”Œλ§λ˜λ―€λ‘œ λͺ¨λΈμ— 큰 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€.

@freddyaboulton Q: OHE 열에 λŒ€ν•œ μœ„μ˜ 데이터 ν”„λ ˆμž„μ€ 열을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€. 이게 정말 μ‚¬μ‹€μΈκ°€μš”?

@rpeck λ„€!

@freddyaboulton 뭔데? 이상 ν•˜λ„€. λ‚˜λŠ” μ§„μ •ν•œ λΆ€μšΈ λ˜λŠ” 0/1 μ •μˆ˜ μ™Έμ—λŠ” λ³Έ 적이 μ—†μŠ΅λ‹ˆλ‹€. 트리 λͺ¨λΈμ΄ μ‹€μ œλ‘œ 이것을 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. 그것은 λ‚˜μ—κ²Œ λ‚˜μœ λƒ„μƒˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œμ˜ 제3법칙: Thou Shalt Not Make == 뢀동 μ†Œμˆ˜μ  비ꡐ

(OK, Math.NaN μ•„λ‹Œ ν•œ)

흠, λ‚˜λŠ” μš°λ¦¬κ°€ μ΄κ²ƒμ„ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€!

λ™μ˜ν•©λ‹ˆλ‹€. κΈ°λ³Έ impl에 μ„€μ •ν•΄μ•Ό ν•˜λŠ” ν”Œλž˜κ·ΈμΌ 뿐이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

@dsherry @freddyaboulton drop λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 μ§€μ›ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ‚¬μš©μž μž…λ ₯만 κ³ λ €ν•˜κ³  implμ—μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 이 λ¬Έμ œλŠ” drop λŒ€ν•œ κΈ°λ³Έκ°’ 섀정을 μΆ”μ ν•©λ‹ˆλ‹€. μ—†μŒ μ΄μ™Έμ˜ λ‹€λ₯Έ κ²ƒμœΌλ‘œ?

https://github.com/alteryx/evalml/blob/91775ffc26c47205adc0fb255832d828ead6e7c9/evalml/pipelines/components/transformers/encoders/onehot_encoder.py#L28

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

μš°λ¦¬λŠ” first λ˜λŠ” if_binary 둜 갈 수 있으며, μ˜¬λ°”λ₯Έ 호좜이 무엇인지 ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@angela97lin 기본값을 λ³€κ²½ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•˜λ‹€λŠ” 것이 λ§žμŠ΅λ‹ˆλ‹€! first λŠ” λ²”μ£Ό μˆ˜κ°€ > 2인 κ²½μš°μ—λ„ μ™„λ²½ν•˜κ²Œ 곡선 νŠΉμ„±μ„ ν”Όν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— κ°€μ•Ό ν•  길이라고 μƒκ°ν•©λ‹ˆλ‹€. @rpeck 은 무엇이라고 생각

이것을 쑰금 읽고 이 링크λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€: https://inmachineswetrust.com/posts/drop-first-columns/

μ£Όμš” λ‚΄μš©:

  • μ—΄ μ‚­μ œλŠ” μ •κ·œν™” 없이 OLS λͺ¨λΈμ„ 생성할 λ•Œλ§Œ ν•„μš”ν•©λ‹ˆλ‹€(μ„ ν˜• νšŒκ·€κ°€ 이 범주에 μ†ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€: https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html, https:// scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares)
  • 원-ν•« 인코딩 열을 μ‚­μ œν•˜λ©΄ μ„ ν˜• νšŒκ·€ λͺ¨λΈμ˜ λ§€κ°œλ³€μˆ˜μ™€ 예츑이 λ³€κ²½λ˜μ–΄ λ°˜ν™˜λœ λͺ¨λΈμ— 영ν–₯을 μ€λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것이 더 λ‚˜μ€μ§€ μ•„λ‹Œμ§€ νŒλ‹¨ν•˜κΈ°λŠ” μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

RE @rpeck 의 첫 번째 의견: "λ‹€λ₯Έ ν˜•νƒœμ˜ κΈ°λŠ₯ 곡선

이것은 이진 사둀에 μ ν•©ν•˜μ§€λ§Œ μ—¬λŸ¬ λ²”μ£Όκ°€ μžˆλŠ” 경우 ν•˜λ‚˜μ˜ 열을 μ‚­μ œν•΄λ„ 이 λ¬Έμ œκ°€ 계속 λ°œμƒν•©λ‹ˆλ‹€.

μ•„λ§ˆλ„ 기본적으둜 이 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ„œλŠ” μ•ˆ λ˜μ§€λ§Œ μΆ”μ •κΈ°κ°€ μ„ ν˜• νšŒκ·€μΈ 경우 λ§€κ°œλ³€μˆ˜λ‘œ first λ₯Ό μ‚¬μš©ν•˜μ—¬ OHEλ₯Ό μƒμ„±ν•˜λ„λ‘ make_pipeline λ₯Ό μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆκΉŒ?

μ•„μ•„, μ €λŠ” νŒλ‹¨μ„ 내리기 μœ„ν•œ κΈ°λ³Έ μˆ˜ν•™μ„ 잘 μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ μ—¬λŸ¬λΆ„μ˜ 생각을 λ“£κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. @freddyaboulton @rpeck @dsherry

@freddyaboulton @rpeck @dsherry @chukarsten @jeremyliweishih μ™€μ˜ ν† λ‘  ν›„

  • λ°”μ΄λ„ˆλ¦¬ κ²½μš°μ—λ§Œ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • "있으면 쒋은 것"은 μ΄μ§„λ²•μ˜ 경우 μ†Œμˆ˜ 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 두 λ²”μ£Ό 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•©λ‹ˆλ‹€.

@angela97lin은 쒋은 RE κΈ°λ³Έ λ™μž‘μœΌλ‘œ λ“€λ¦½λ‹ˆλ‹€. 또 λ‹€λ₯Έ 쒋은 점: ꡬ성 μš”μ†Œ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 κΈ°λ³Έ λ™μž‘μ„ μž¬μ •μ˜ν•˜λŠ” κΈ°λŠ₯

@dsherry λ‚΄κ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜κ³  μžˆλ‹€λ©΄ drop (λ§€κ°œλ³€μˆ˜)의 기본값을 μ—…λ°μ΄νŠΈν•˜κ³  μžˆμœΌλ―€λ‘œ μ‚¬μš©μžλŠ” κ΅¬μ„±μš”μ†Œ λ§€κ°œλ³€μˆ˜λ₯Ό μˆ˜λ™μœΌλ‘œ μ„€μ •ν•˜μ—¬ 이λ₯Ό λ¬΄μ‹œν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

이것을 κ΅¬ν˜„ν•˜λŠ” 데 ν•„μš”ν•œ 것이 무엇인지 μ•Œμ•„λ³΄κΈ° μœ„ν•΄ 주변을 νŒŒν—€μ³€μŠ΅λ‹ˆλ‹€. 특히 λ°”μ΄λ„ˆλ¦¬μ˜ 경우 항상 μ†Œμˆ˜ 클래슀λ₯Ό μ œκ±°ν•˜λŠ” 것이 μ–Όλ§ˆλ‚˜ μ–΄λ €μš΄μ§€ κΆκΈˆν–ˆμŠ΅λ‹ˆλ‹€.

νŒŒν—€μΉœ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • scikit-learn을 μ‚¬μš©ν•˜λ©΄ μ œκ±°ν•  λ²”μ£Όλ₯Ό μ„ νƒν•˜κΈ°κ°€ 맀우 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. λ¬Έμ„œμ—μ„œ 이것은 drop λ§€κ°œλ³€μˆ˜μ— λŒ€ν•œ λ°°μ—΄ μ˜΅μ…˜μ„ 톡해 μ‹€ν˜„ κ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€(https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html). κ·ΈλŸ¬λ‚˜ μ‹œλ„ν•œ ν›„μ—λŠ” λͺ¨λ“  열에 λŒ€ν•΄ 인덱슀 값을 지정해야 ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒμ€ μ—΄ 0에 λŒ€ν•΄ 인덱슀 0에 μ§€μ •λœ λ²”μ£Όλ₯Ό μ œκ±°ν•˜κ³  μ—΄ 1 및 2에 λŒ€ν•΄ λ‹€λ₯Έ 값이 μ—†λŠ” 였λ₯˜λ₯Ό μ œκ±°ν•˜λ €κ³  ν•©λ‹ˆλ‹€.
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder

X = pd.DataFrame({'col_1': ["a", "b", "b", "a", "b"],
                      'col_2': ["a", "b", "a", "c", "b"],
                      'col_3': ["a", "a", "a", "a", "a"]})

indices_to_drop = np.array([0, None, None])

ohe = OneHotEncoder(drop=indices_to_drop)
ohe.fit(X)
ValueError                                Traceback (most recent call last)
<ipython-input-4-a099fa2fc4a7> in <module>
----> 1 ohe.fit(X)

~/Desktop/venv/lib/python3.7/site-packages/sklearn/preprocessing/_encoders.py in fit(self, X, y)
    417         self._fit(X, handle_unknown=self.handle_unknown,
    418                   force_all_finite='allow-nan')
--> 419         self.drop_idx_ = self._compute_drop_idx()
    420         return self
    421 

~/Desktop/venv/lib/python3.7/site-packages/sklearn/preprocessing/_encoders.py in _compute_drop_idx(self)
    394                                 ["Category: {}, Feature: {}".format(c, v)
    395                                     for c, v in missing_drops])))
--> 396                 raise ValueError(msg)
    397             return np.array(drop_indices, dtype=object)
    398 

ValueError: The following categories were supposed to be dropped, but were not found in the training data.
Category: 0, Feature: 0
Category: 1, Feature: None
Category: 2, Feature: None

λ‚˜λŠ” 이것이 λ˜ν•œ 이 λ¬Έμ œκ°€ μ§€μ ν•˜λŠ” κ²ƒμ˜ 절반이라고 μƒκ°ν•©λ‹ˆλ‹€: https://github.com/scikit-learn/scikit-learn/issues/16511

이λ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄ μš°λ¦¬κ°€ ν•  수 μžˆλŠ” λŒ€μ•ˆμ€ ν”ΌνŒ… 쀑에 μ‚­μ œν•˜λ €λŠ” μ—΄κ³Ό 값을 μˆ˜λ™μœΌλ‘œ μΆ”μ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. scikit-learn에 데이터λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ μ €μž₯ν•˜κ³  μ‚­μ œν•˜λ €λŠ” 열을 μ œκ±°ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것은 λ³€ν™˜λœ μ—΄ μ΄λ¦„μ—μ„œ μ›λž˜(κΈ°λŠ₯, κ°’)λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄ μ•½κ°„μ˜ 논리 μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€. ( get_feature_names 에 이 논리가 μžˆμ§€λ§Œ μ‚­μ œν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€κ³  κ°€μ •ν•˜κ³  μ—΄ 이름을 μ—°κ²°ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€...)

이 λͺ¨λ“  것이 μ§€κΈˆμ€ κΈ°λ³Έ scikit-learn if_binary 을 μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•  수 있으며 항상 μ†Œμˆ˜ 클래슀λ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ³„λ„μ˜ 문제λ₯Ό μ œμΆœν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ†”μ§νžˆ λ§ν•΄μ„œ μš°λ¦¬κ°€ ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” 일을 κ°μ•ˆν•  λ•Œ scikit-learn의 OHE κ΅¬ν˜„μ—μ„œ λ©€μ–΄μ§€λŠ” 것에 μ°¬μ„±ν•©λ‹ˆλ‹€.

μœ μš©ν•œ λ¦¬μ†ŒμŠ€:
OHE λ¬Έμ„œ: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
μœ μ—°μ„±μ„ μœ λ°œν•˜λŠ” scikit-learn의 μ½”λ“œ: https://github.com/scikit-learn/scikit-learn/blob/95119c13af77c76e150b753485c662b7c52a41a2/sklearn/preprocessing/_encoders.py#L338
κ΄€λ ¨ 문제: https://github.com/scikit-learn/scikit-learn/issues/16511


if_binary : scikit-learn은 handle_unknown κ°€ error 이어야 ν•©λ‹ˆλ‹€. 이것은 top_n λ§€κ°œλ³€μˆ˜μ™€ 잘 μ–΄μšΈλ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 λ§€κ°œλ³€μˆ˜λŠ” μƒμœ„ N개 λ²”μ£Όλ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν•­λͺ©μ„ μ‚­μ œν•©λ‹ˆλ‹€. λ³€ν™˜ν•  데이터가 μƒˆ λ²”μ£Όλ‘œ 무엇을 할지 λͺ¨λ₯΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. Beccaκ°€ https://github.com/alteryx/evalml/pull/830 μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ 이 λ§€κ°œλ³€μˆ˜κ°€ μž‘λ™ν•˜λ €λ©΄ top_n λ₯Ό None으둜 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이λ₯Ό 염두에 두고 우리만의 μž„ν”Œμ„ κ΅΄λ¦¬λŠ” 것이 κ°€μž₯ μ’‹μŠ΅λ‹ˆλ‹€ πŸ€”

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