A A
[ํ˜ผ๊ณต๋จธ์‹ ] Tree's Ensemble - Random Forest (๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ)

์ •ํ˜• ๋ฐ์ดํ„ฐ์™€ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ

๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃจ์—ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋˜๋Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๊ธธ์ด, ๋†’์ด, ๋ฌด๊ฒŒ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” CSV ํŒŒ์ผ์— ๊ฐ€์ง€๋Ÿฐํžˆ ์ •๋ฆฌ๋˜์–ด ์žˆ์—ˆ์ฃ .
  • ์ด๋ฒˆ์—๋„ ์‚ฌ์šฉํ•œ ์™€์ธ ๋ฐ์ดํ„ฐ๋„ CSV ํŒŒ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
# CSV ํŒŒ์ผ ์˜ˆ์‹œ

length, height, width
8.4, 2.11, 1.41
13.7, 3.53, 2.0
  • ์ด๋Ÿฐ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ˜• ๋ฐ์ดํ„ฐ(structured data)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, ์–ด๋–ค ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค๋Š” ๋œป์ด์ฃ .
    • ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋Š” CSV๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DataBase), ํ˜น์€ ์—‘์…€(Excel)์— ์ €์žฅํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
    • ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ์— ์ง„์—ด๋œ ์ƒํ’ˆ๊ณผ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ๋งคํ•œ ์‡ผํ•‘ ์ •๋ณด๋Š” ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ์ •ํ˜• ๋ฐ์ดํ„ฐ์— ์†ํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์‹ค ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ˜• ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ •ํ˜• ๋ฐ์ดํ„ฐ์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ(unstructured data)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
    • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์—‘์…€๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.
    • ์šฐ๋ฆฌ ์ฃผ๋ณ€์—์„œ ์ฐพ์•„๋ณด๋ฉด, ์ฑ…์˜ ๊ธ€๊ณผ ๊ฐ™์€ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ, ๋””์ง€ํ„ธ ์นด๋ฉ”๋ผ๋กœ ์ฐ์€ ์‚ฌ์ง„, ํ•ธ๋“œํฐ์œผ๋กœ ๋“ฃ๋Š” ๋””์ง€ํ„ธ ์Œ์•… ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ…์ŠคํŠธ๋‚˜ ์‚ฌ์ง„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๊ฐ€๋Šฅ?
๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐœ์ „ํ•ด์™”์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—‘์…€์ด๋‚˜ CSV์— ๋‹ด๊ธฐ ์–ด๋ ค์šด ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋‚˜ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค:
์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ: ์Šคํ‚ค๋งˆ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ™•์žฅ์„ฑ: ์ˆ˜ํ‰์  ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ง€์›: ๋ฌธ์„œ, ํ‚ค-๊ฐ’, ๊ทธ๋ž˜ํ”„ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ •ํ˜• ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•™์ƒ๋ธ” ํ•™์Šต(ensemble learning)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ๋กœ ๊ฒฐ์ • ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ชจ๋ธ์„ ์กฐํ•ฉํ•˜์—ฌ ๋” ๋‚˜์€ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์•™์ƒ๋ธ” ํ•™์Šต์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฐฐ๊น…(Bagging), ๋ถ€์ŠคํŒ…(Boosting), ์Šคํƒœํ‚น(Stacking) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ๋ฒ•๋“ค์€ ๊ฐ๊ฐ์˜ ๊ธฐ๋ณธ ๋ชจ๋ธ๋“ค์ด ๊ฐ€์ง„ ์•ฝ์ ์„ ๋ณด์™„ํ•˜์—ฌ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

 

  • ๋ฐ˜๋ฉด, ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ๊ฒฝ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ทœ์น™์„ฑ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ ์ „ํ†ต์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ธฐ ๊นŒ๋‹ค๋กญ์ง€๋งŒ, ์‹ ๊ฒฝ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณต์žกํ•œ ํŒจํ„ด์„ ํ•™์Šตํ•˜๊ณ , ์ด๋ฏธ์ง€ ์ธ์‹ ๋ฐ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋ถ„์•ผ์—์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ ๊ฒฝ๋ง์€ ์—ฌ๋Ÿฌ ์ธต์˜ ๋‰ด๋Ÿฐ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ ์ธต์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ตœ์ข… ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ์˜ ๋ฐœ์ „ ๋•๋ถ„์— ์‹ ๊ฒฝ๋ง์€ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Random Forest (๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ)

๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ(Random Forest)๋Š” ์•™์ƒ๋ธ” ํ•™์Šต์˜ ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ ๋•๋ถ„์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ์ • ํŠธ๋ฆฌ๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ ํŠธ๋ฆฌ์˜ ์˜ˆ์ธก์„ ์กฐํ•ฉํ•˜์—ฌ ์ตœ์ข… ์˜ˆ์ธก์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด Random Forest(๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ)๊ฐ€ ์–ด๋–ป๊ฒŒ ์ˆฒ์„ ๊ตฌ์„ฑํ•˜๋Š”์ง€ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Boostrap Sampling (๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ๋ง)

  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๋Š” ๊ฐ ํŠธ๋ฆฌ๋ฅผ ํ›ˆ๋ จํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ๋ง์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์—์„œ ๋žœ๋คํ•˜๊ฒŒ ์ƒ˜ํ”Œ์„ ์ถ”์ถœํ•˜๋ฉฐ, ์ค‘๋ณต๋œ ์ƒ˜ํ”Œ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, 1,000๊ฐœ์˜ ์ƒ˜ํ”Œ ์ค‘์—์„œ 100๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ, ํ•œ ๋ฒˆ ๋ฝ‘์€ ์ƒ˜ํ”Œ์„ ๋‹ค์‹œ ๊ฐ€๋ฐฉ์— ๋„ฃ๊ณ  ๊ณ„์†ํ•ด์„œ ์ƒ˜ํ”Œ์„ ๋ฝ‘์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์ƒ˜ํ”Œ์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 1000๊ฐœ์˜ ์ƒ˜ํ”Œ์—์„œ ์ค‘๋ณตํ•ด์„œ 1000๊ฐœ์˜ ์ƒ˜ํ”Œ์„ ๋ฝ‘๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ์€ ํ›ˆ๋ จ์„ธํŠธ์™€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ถ€์ŠคํŠธํŠธ๋žฉ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?
๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ฐฉ์‹์ด๋ž€ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์—ฌ ์ƒ˜ํ”Œ์„ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€๋ฐฉ์— 1,000๊ฐœ์˜ ์ƒ˜ํ”Œ์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋ฐฉ์‹์€ ๋จผ์ € ํ•œ ๊ฐœ์˜ ์ƒ˜ํ”Œ์„ ๋ฝ‘๊ณ  ์ด๋ฅผ ๋‹ค์‹œ ๊ฐ€๋ฐฉ์— ๋„ฃ์–ด ๋‹ค์Œ ์ƒ˜ํ”Œ์„ ๋ฝ‘๋Š” ๋ฐฉ์‹์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ถ”์ถœ๋œ ์ƒ˜ํ”Œ๋“ค์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

ํŠน์„ฑ ์„ ํƒ

  • ๊ฐ ๋…ธ๋“œ๋ฅผ ๋ถ„ํ• ํ•  ๋•Œ ์ „์ฒด ํŠน์„ฑ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•œ ํ›„, ์ด ์ค‘์—์„œ ์ตœ์„ ์˜ ๋ถ„ํ• ์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ RandomForestClassifier๋Š” ์ „์ฒด ํŠน์„ฑ ๊ฐœ์ˆ˜์˜ ์ œ๊ณฑ๊ทผ๋งŒํผ ํŠน์„ฑ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 4๊ฐœ์˜ ํŠน์„ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ ๋…ธ๋“œ๋งˆ๋‹ค 2๊ฐœ๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด, RandomForestRegressor๋Š” ์ „์ฒด ํŠน์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Scikit-learn์˜ RandomForest๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 100๊ฐœ์˜ Decision Tree(๊ฒฐ์ • ํŠธ๋ฆฌ)๋ฅผ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ›ˆ๋ จํ•ฉ๋‹ˆ๋‹ค.
  • Classification (๋ถ„๋ฅ˜)์ธ ๊ฒฝ์šฐ์—” ๊ฐ ํŠธ๋ฆฌ์˜ ํด๋ž˜์Šค๋ณ„ ํ™•๋ฅ ์„ ํ‰๊ท ํ•˜์—ฌ ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์˜ˆ์ธก์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค.
  • Regression (ํšŒ๊ท€)์ธ ๊ฒฝ์šฐ๋Š” ๋‹จ์ˆœํžˆ ๊ฐ ํŠธ๋ฆฌ์˜ ์˜ˆ์ธก์„ ํ‰๊ท ํ™” ํ•ฉ๋‹ˆ๋‹ค.
Classification(๋ถ„๋ฅ˜): ๊ฐ ํŠธ๋ฆฌ์˜ ํด๋ž˜์Šค๋ณ„ ํ™•๋ฅ ์„ ํ‰๊ท ํ•˜์—ฌ ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค.
Regression(ํšŒ๊ท€): ๋‹จ์ˆœํžˆ ๊ฐ ํŠธ๋ฆฌ์˜ ์˜ˆ์ธก์„ ํ‰๊ท ํ•˜์—ฌ ์ตœ์ข… ์˜ˆ์ธก ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๋Š” ๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•œ ์ƒ˜ํ”Œ๊ณผ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›ˆ๋ จ ์„ธํŠธ์— ๊ณผ๋Œ€์ ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฒ€์ฆ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ์—์„œ ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค์ •๋งŒ์œผ๋กœ๋„ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ ์‚ฌ์ดํ‚ท๋Ÿฐ์˜ RandomForestClassifier ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™”์ดํŠธ ์™€์ธ์„ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋จผ์ €, ์™€์ธ ๋ฐ์ดํ„ฐ์…‹์„ ํŒ๋‹ค์Šค(Pandas)๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ํ›ˆ๋ จ ์„ธํŠธ์™€ ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

wine = pd.read_csv('https://bit.ly/wine_csv_data')

data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

train_input, test_input, train_target, test_target = train_test_split(
	data, target, test_size=0.2, random_state=42)
  • ๊ต์ฐจ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ cross_validate() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • RandomForestClassifier๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 100๊ฐœ์˜ ๊ฒฐ์ • ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, n_jobs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“  CPU ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • cross_validate() ํ•จ์ˆ˜์˜ n_jobs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๋ณ‘๋ ฌ๋กœ ๊ต์ฐจ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, return_train_score ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ True๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฒ€์ฆ ์ ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ›ˆ๋ จ ์„ธํŠธ์— ๋Œ€ํ•œ ์ ์ˆ˜๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ํ›ˆ๋ จ ์„ธํŠธ์™€ ๊ฒ€์ฆ ์„ธํŠธ์˜ ์ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ณผ๋Œ€์ ํ•ฉ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (return_train_score ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ False์ž…๋‹ˆ๋‹ค).
from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(rf, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

# 0.9973541965122431 0.8905151032797809
  • ์ถœ๋ ฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํ›ˆ๋ จ์„ธํŠธ์— ๋‹ค์†Œ Overfitting(๊ณผ๋Œ€์ ํ•ฉ)๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฒฐ์ • ํŠธ๋ฆฌ์˜ ์•™์ƒ๋ธ” ๋ชจ๋ธ๋กœ, ๊ฐ ๊ฒฐ์ • ํŠธ๋ฆฌ ๋ชจ๋ธ์ด ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, criterion, max_depth, max_features, min_samples_split, min_impurity_decrease, min_samples_leaf ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๋Š” ๊ฒฐ์ • ํŠธ๋ฆฌ์˜ ์ค‘์š”ํ•œ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ธ ํŠน์„ฑ ์ค‘์š”๋„๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ์˜ ํŠน์„ฑ ์ค‘์š”๋„๋Š” ๊ฐ ๊ฒฐ์ • ํŠธ๋ฆฌ์˜ ํŠน์„ฑ ์ค‘์š”๋„๋ฅผ ์ข…ํ•ฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด์ œ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ๋ชจ๋ธ์„ ํ›ˆ๋ จ ์„ธํŠธ์— ํ›ˆ๋ จ์‹œํ‚ค๊ณ , ํ•ด๋‹น ๋ชจ๋ธ์˜ ํŠน์„ฑ ์ค‘์š”๋„๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ํŠน์„ฑ ์ค‘์š”๋„๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์ด ๊ฐ ํŠน์„ฑ์— ์–ผ๋งˆ๋‚˜ ์˜์กดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
rf.fit(train_input, train_target)
print(rf.feature_importances_)

# [0.23167441 0.50039841 0.26792718]

 

  • ํŠน์„ฑ ์ค‘์š”๋„ ๋ถ„์„ ๊ฒฐ๊ณผ, ๋‘ ๋ฒˆ์งธ ํŠน์„ฑ์ธ ๋‹น๋„์˜ ์ค‘์š”๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ  ์•Œ์ฝ”์˜ฌ ๋„์ˆ˜์™€ pH์˜ ์ค‘์š”๋„๊ฐ€ ์•ฝ๊ฐ„ ์ƒ์Šนํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๊ฐ€ ์ผ๋ถ€ ํŠน์„ฑ์„ ๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•˜์—ฌ ๊ฒฐ์ • ํŠธ๋ฆฌ๋ฅผ ํ›ˆ๋ จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ํŠน์ • ํŠน์„ฑ์— ๊ณผ๋„ํ•˜๊ฒŒ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋” ๋งŽ์€ ํŠน์„ฑ์ด ๋ชจ๋ธ ํ›ˆ๋ จ์— ๊ธฐ์—ฌํ•  ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ณผ๋Œ€์ ํ•ฉ์„ ์ค„์ด๊ณ  ๋ชจ๋ธ์˜ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ๋ชจ๋ธ์—์„œ ๊ฐ ํŠน์„ฑ์˜ ์ค‘์š”๋„๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ด์œ ๋Š”, ๋ชจ๋ธ์ด ๊ฒฐ์ • ํŠธ๋ฆฌ๋ฅผ ํ›ˆ๋ จํ•  ๋•Œ ์ผ๋ถ€ ํŠน์„ฑ์„ ๋žœ๋คํ•˜๊ฒŒ ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•œ ํŠน์„ฑ์— ๊ณผ๋„ํ•˜๊ฒŒ ์ง‘์ค‘ํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ํŠน์„ฑ์ด ํ›ˆ๋ จ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์–ด ๊ณผ๋Œ€์ ํ•ฉ์„ ์ค„์ด๊ณ  ๋ชจ๋ธ์˜ ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ์˜ ๋˜ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์€ OOB (Out-Of-Bag) ์ ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ๋ง ๊ณผ์ •์—์„œ ํ›ˆ๋ จ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ƒ˜ํ”Œ์„ OOB ์ƒ˜ํ”Œ์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OOB ์ ์ˆ˜๋Š” ๊ฒ€์ฆ ์„ธํŠธ์˜ ์—ญํ• ์„ ํ•˜๋ฉฐ, RandomForestClassifier ํด๋ž˜์Šค์—์„œ oob_score=True๋กœ ์„ค์ •ํ•˜๋ฉด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  OOB ์ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
rf = RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42)

rf.fit(train_input, train_target)
print(rf.oob_score_)

# 0.8934000384837406
  • ๊ต์ฐจ๊ฒ€์ฆ์—์„œ ์–ป์€ ์ ์ˆ˜์™€ ๋งค์šฐ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

 

OOB ์ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ต์ฐจ๊ฒ€์ฆ์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ›ˆ๋ จ์„ธํŠธ์— ๋” ๋งŽ์€ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Summary

์•™์ƒ๋ธ” ํ•™์Šต

  • ์•™์ƒ๋ธ” ํ•™์Šต: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋ธ์„ ํ›ˆ๋ จ์‹œ์ผœ ๋” ์ข‹์€ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ (Random Forest)

  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ: ๊ฒฐ์ •์„ ๋‚˜๋ฌด ๊ธฐ๋ฐ˜์˜ ์•™์ƒ๋ธ” ํ•™์Šต ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜๊ณ , ๋žœ๋คํ•˜๊ฒŒ ์ผ๋ถ€ ํŠน์„ฑ์„ ์„ ํƒํ•˜์—ฌ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์ฃผ์š” ๋งค๊ฐœ๋ณ€์ˆ˜:
    • n_estimators: ์•™์ƒ๋ธ”์„ ๊ตฌ์„ฑํ•  ํŠธ๋ฆฌ์˜ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 100)
    • criterion: ๋ถˆ์ˆœ๋„ ์ธก์ • ๋ฐฉ๋ฒ• (gini ๋˜๋Š” entropy)
    • max_depth: ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ๊นŠ์ด (๊ธฐ๋ณธ๊ฐ’: None)
    • min_samples_split: ๋…ธ๋“œ๋ฅผ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์ƒ˜ํ”Œ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 2)
    • max_features: ๋ถ„ํ•  ์‹œ ์‚ฌ์šฉํ•  ํŠน์„ฑ์˜ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: auto, ํŠน์„ฑ ๊ฐœ์ˆ˜์˜ ์ œ๊ณฑ๊ทผ)
    • bootstrap: ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ƒ˜ํ”Œ ์‚ฌ์šฉ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: True)
    • oob_score: OOB ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ํ‰๊ฐ€ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: False)
    • n_jobs: ๋ณ‘๋ ฌ ์‹คํ–‰์— ์‚ฌ์šฉํ•  CPU ์ฝ”์–ด ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 1)