Evalml: ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ์ง€์› InvalidTargetDataCheck๊ฐ€ problem_type์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ์„ ํ™•์ธํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 07์›” 15์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: alteryx/evalml

์ˆ˜์ • #970 .

#929์—์„œ @freddyaboulton ๊ณผ์˜ ํ† ๋ก ์— ๋”ฐ๋ฅด๋ฉด DataCheck์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. DataChecks ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์ง€ ์•Š๊ณ  DataChecks ํด๋ž˜์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ search() ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— DataCheck API๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  AutoML๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@angela97lin @freddyaboulton ์ด ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a) ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด automl ๋ฐ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ API๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  b) ๋ชจ๋“  ๋Œ€์ƒ์— ๋Œ€ํ•ด ๋Œ€์ƒ์„ ํ™•์ธํ•˜๊ณ  ์ง€๋Šฅํ˜• ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด InvalidTargetDataCheck ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ๋‘ ์ถ”์ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ์œ ํ˜•.

๋ฐฉ๊ธˆ ๋ฒ„๊ทธ #970์„ ์ œ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๊ธ‰ํ•˜๊ณ  ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋ฌธ์ œ๊ฐ€ ์œ„์—์„œ ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ #970์„ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  6 ๋Œ“๊ธ€

@angela97lin ์ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@dsherry ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค! #929์—์„œ @freddyaboulton ๊ณผ ๋‚˜๋Š” InvalidTargetDataCheck ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์˜ ์œ ํ˜•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹์„์ง€ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ œ๊ฐ€ ์ด์ง„ ๋ถ„๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ์ž…๋ ฅ์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ /์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ์— ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ˜„์žฌ ๋””์ž์ธ์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” BinaryClassificationInvalidTargetDataCheck์™€ ๊ฐ™์€ ๊ฐ ๋ฌธ์ œ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” DefaultDataChecks์— ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ํ•ญ๋ชฉ์„ ๊ฒฐ์ •ํ•  ๋•Œ(๋˜๋Š” DefaultBinaryClassificationDataChecks๋กœ ๋ถ„๋ฅ˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ) ๋งค์šฐ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@angela97lin @freddyaboulton ๊ณผ ๋ฐฉ๊ธˆ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํŒŒ์ดํ”„๋ผ์ธ์—์„œ component_graph ์— ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์„ ๋ฏธ๋Ÿฌ๋งํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ ๋ชฉ๋ก์€ ์ฒ˜์Œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ DataCheck ํ•˜์œ„ ํด๋ž˜์Šค(๋˜๋Š” ๋™์ผํ•˜์ง€๋งŒ DataChecks ๋‚ด๋ถ€) ๋ชฉ๋ก์œผ๋กœ automl ๊ฒ€์ƒ‰ํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • automl ๊ฒ€์ƒ‰์ด ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด DataChecks ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ์‹œ์ ์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ์„ ํƒ์  ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ parameters ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์œ ์‚ฌํ•œ data_check_parameters dict๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ DataChecks ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์œ ์‚ฌํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • data_check_parameters ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ None $์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ์—์„œ ํ•„์ˆ˜ ์ธ์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ(์˜ˆ problem_type ) ์ดˆ๊ธฐํ™” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด automl ๊ฒ€์ƒ‰์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์Šค์ผ€์น˜์ž…๋‹ˆ๋‹ค:

# today this helper standardizes the input to a list of `DataCheck` instances, and wraps that in a `DataChecks` instance
# after this work, this would standardize the input to a `DataChecks` class.
# if `data_checks` was already a `DataChecks` class, do nothing. else if `data_checks` is a list of `DataCheck` classes, define a `AutoMLDataChecks` class to wrap and return that
data_checks_class = self._validate_data_checks(data_checks)
# next we create the `DataChecks` instance by passing in data checks parameters
data_check_parameters = {'Target Datatype Data Check': {'problem_type': self.problem_type}}
data_checks = data_checks_class(data_check_parameters)
data_check_results = data_checks.validate(X, y)

์ง์ ‘์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ๋น„์Šทํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„

  • @angela97lin @freddyaboulton ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์œ„์˜ ์Šค์ผ€์น˜๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ์˜จ์ „ํ•œ ํ™•์ธ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • @angela97lin ์€ #960์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ TargetDatatype ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ(์ด๋ฆ„ ๋ฏธ์ •) ์ถ”๊ฐ€๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ์—๋Š” problem_type ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ด์Šˆ๋ฅผ ์ง‘์–ด๋“  ์‚ฌ๋žŒ์€ ๊ทธ TargetDatatype ์ด์Šˆ๋„ ๋™์‹œ์— ์ง‘์–ด ๋“ค๊ณ  ์ด๊ฒƒ์„ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ› ๏ธ ๐Ÿ˜

@dsherry ๊ณ„ํš์ด ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค! ๋‚ด๊ฐ€ ์ถ”๊ฐ€ํ•  ์œ ์ผํ•œ ๊ฒƒ์€ ์ƒˆ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋ฏธ ์กด์žฌํ•˜๋Š” InvalidTargetDataCheck ๋ฅผ ๋ณด๊ฐ•ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ ์ €์—๊ฒŒ ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์„ ํƒํ•˜๋Š” ์‚ฌ๋žŒ์€ problem_type ๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ์ผ ๋•Œ ํƒ€๊ฒŸ์ด ๊ณ ์œ ํ•œ ๊ฐ’์„ 2๊ฐœ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ #929์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ์—์„œ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

if problem_type == "binary" and len(set(y)) != 2:
    # Warn that we do not have two unique values in y

@angela97lin @freddyaboulton ์ด ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a) ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด automl ๋ฐ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ API๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  b) ๋ชจ๋“  ๋Œ€์ƒ์— ๋Œ€ํ•ด ๋Œ€์ƒ์„ ํ™•์ธํ•˜๊ณ  ์ง€๋Šฅํ˜• ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด InvalidTargetDataCheck ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ๋‘ ์ถ”์ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ์œ ํ˜•.

๋ฐฉ๊ธˆ ๋ฒ„๊ทธ #970์„ ์ œ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๊ธ‰ํ•˜๊ณ  ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋ฌธ์ œ๊ฐ€ ์œ„์—์„œ ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ #970์„ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dsherry ์–ผ๋งˆ๋‚˜ ์‹œ์˜์ ์ ˆํ•œ๊ฐ€! ๋‚˜์—๊ฒŒ ์ข‹์€ ์†Œ๋ฆฌ์ž…๋‹ˆ๋‹ค ๐Ÿ˜Š

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰