[์ดํƒ] ์•™์ƒ๋ธ” ๊ธฐ๋ฐ˜ ์ด์ƒํƒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

Posted by Euisuk's Dev Log on May 14, 2024

[์ดํƒ] ์•™์ƒ๋ธ” ๊ธฐ๋ฐ˜ ์ด์ƒํƒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์›๋ณธ ๊ฒŒ์‹œ๊ธ€: https://velog.io/@euisuk-chung/์•™์ƒ๋ธ”-๊ธฐ๋ฐ˜-์ด์ƒํƒ์ง€-์•Œ๊ณ ๋ฆฌ์ฆ˜-zdwnxkcu

์•™์ƒ๋ธ” ๊ธฐ๋ฐ˜ ์ด์ƒํƒ์ง€

์•™์ƒ๋ธ” ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์กฐํ•ฉํ•˜์—ฌ ์ด์ƒ์น˜๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋†’์€ ์ •ํ™•๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Isolation Forest

  • ๋งํฌ: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html
  • ์ •์˜: Isolation Forest๋Š” ์˜์‚ฌ๊ฒฐ์ • ํŠธ๋ฆฌ์˜ ์•™์ƒ๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ , ์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ณด๋‹ค ์ด์ƒ์น˜๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ โ€˜๊ณ ๋ฆฝโ€™์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ ์ƒ˜ํ”Œ์ด ๊ณ ๋ฆฝ๋˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ถ„ํ•  ํšŸ์ˆ˜(๊ฒฝ๋กœ ๊ธธ์ด)๋ฅผ ์ธก์ •ํ•˜์—ฌ ์ด์ƒ์น˜ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ: ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ด์ƒ์น˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์–ด ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ ํšจ๊ณผ์ ์ด๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๊ฐ€ ๋ถˆ๊ท ์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค์ฐจ์›์ผ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • sklearn ํ•จ์ˆ˜: sklearn.ensemble.IsolationForest

    • ํ•จ์ˆ˜ ์„ค๋ช…:

      • Isolation Forest๋Š” ๋ฌด์ž‘์œ„๋กœ ํŠน์„ฑ์„ ์„ ํƒํ•˜๊ณ  ๊ทธ ํŠน์„ฑ์˜ ์ž„์˜์˜ ๋ถ„ํ•  ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ„ํ•  ๊ณผ์ •์€ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒ˜ํ”Œ์„ ๊ณ ๋ฆฝ์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ถ„ํ•  ํšŸ์ˆ˜๋Š” ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ๋‹จ๋ง ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฒฝ๋กœ ๊ธธ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฒฝ๋กœ ๊ธธ์ด๋Š” ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์˜ ์ •์ƒ์„ฑ์„ ์ธก์ •ํ•˜๋Š” ์ฒ™๋„๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์งง์€ ๊ฒฝ๋กœ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๋Š” ์ƒ˜ํ”Œ์€ ์ด์ƒ์น˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜:

      • n_estimators (int, default=100): ์•™์ƒ๋ธ”์— ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ ์ถ”์ •๊ธฐ(ํŠธ๋ฆฌ)์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • max_samples (str, int or float, default=โ€™autoโ€™): ๊ฐ ๊ธฐ๋ณธ ์ถ”์ •๊ธฐ๋ฅผ ํ•™์Šตํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ƒ˜ํ”Œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค. โ€˜autoโ€™๋Š” min(256, n_samples)๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
      • contamination (str or float, default=โ€™autoโ€™): ๋ฐ์ดํ„ฐ์…‹์˜ ์ด์ƒ์น˜ ๋น„์œจ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. โ€˜autoโ€™๋Š” ์› ๋…ผ๋ฌธ์—์„œ ์ œ์•ˆ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • max_features (int or float, default=1.0): ๊ฐ ๊ธฐ๋ณธ ์ถ”์ •๊ธฐ๋ฅผ ํ•™์Šตํ•  ๋•Œ ์‚ฌ์šฉํ•  ํŠน์„ฑ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • bootstrap (bool, default=False): True๋กœ ์„ค์ •ํ•˜๋ฉด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ๋ง์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • n_jobs (int, default=None): ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ž‘์—…์˜ ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. -1๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • random_state (int, RandomState instance or None, default=None): ๋‚œ์ˆ˜ ์ƒ์„ฑ์„ ์ œ์–ดํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
      • verbose (int, default=0): ํ•™์Šต ๊ณผ์ •์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
      • warm_start (bool, default=False): True๋กœ ์„ค์ •ํ•˜๋ฉด ์ด์ „ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๊ธฐํ™”์— ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์€ ์ถ”์ •๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์†์„ฑ:

      • estimators_: ํ•™์Šต๋œ ์ถ”์ •๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
      • estimators_features_: ๊ฐ ์ถ”์ •๊ธฐ์— ๋Œ€ํ•ด ์„ ํƒ๋œ ํŠน์„ฑ์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
      • estimators_samples_: ๊ฐ ์ถ”์ •๊ธฐ์— ๋Œ€ํ•ด ์„ ํƒ๋œ ์ƒ˜ํ”Œ์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
      • max_samples_: ์‹ค์ œ ์‚ฌ์šฉ๋œ ์ƒ˜ํ”Œ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • offset_: ์› ์ ์ˆ˜์—์„œ ๊ฒฐ์ • ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”„์…‹์ž…๋‹ˆ๋‹ค.
      • n_features_in_: fit ๋™์•ˆ ๋ณธ ํŠน์„ฑ์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.
      • feature_names_in_: fit ๋™์•ˆ ๋ณธ ํŠน์„ฑ ์ด๋ฆ„ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
    • ๋ฉ”์„œ๋“œ:

      • decision_function(X): ๊ธฐ๋ณธ ๋ถ„๋ฅ˜๊ธฐ์˜ ํ‰๊ท  ์ด์ƒ์น˜ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
      • fit(X[, y, sample_weight]): ์ถ”์ •๊ธฐ๋ฅผ ํ•™์Šต์‹œํ‚ต๋‹ˆ๋‹ค.
      • fit_predict(X[, y]): ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ ˆ์ด๋ธ”์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
      • get_metadata_routing(): ์ด ๊ฐ์ฒด์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ผ์šฐํŒ…์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
      • get_params([deep]): ์ด ์ถ”์ •๊ธฐ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
      • predict(X): ํŠน์ • ์ƒ˜ํ”Œ์ด ์ด์ƒ์น˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค.
      • score_samples(X): ์› ๋…ผ๋ฌธ์—์„œ ์ •์˜๋œ ์ด์ƒ์น˜ ์ ์ˆ˜์˜ ๋ฐ˜๋Œ€๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
      • set_fit_request(*[, sample_weight]): fit ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • set_params(**params): ์ด ์ถ”์ •๊ธฐ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ์‹œ:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
      from sklearn.ensemble import IsolationForest
      import numpy as np
          
      # ์˜ˆ์ œ ๋ฐ์ดํ„ฐ
      X = [[-1.1], [0.3], [0.5], [100]]
          
      # Isolation Forest ๋ชจ๋ธ ์ƒ์„ฑ ๋ฐ ์ ํ•ฉ
      clf = IsolationForest(random_state=0).fit(X)
          
      # ์˜ˆ์ธก ๋ผ๋ฒจ ์ถœ๋ ฅ
      print(clf.predict([[0.1], [0], [90]]))
          
      # ๊ฐ ์ƒ˜ํ”Œ์˜ ์ ์ˆ˜ ์ถœ๋ ฅ
      print(clf.score_samples(X))
      

โœ๏ธ ์ด ์˜ˆ์ œ๋Š” Isolation Forest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•œ ์ด์ƒ์น˜ ํƒ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Isolation Forest๋Š” ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์ด์ƒ์น˜๋ฅผ ํƒ์ง€ํ•˜๋ฉฐ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.



-->