8 Tue

ํ˜„์—… ์‹ค๋ฌด์ž์—๊ฒŒ ๋ฐฐ์šฐ๋Š” Kaggle ๋จธ์‹ ๋Ÿฌ๋‹ ์ž…๋ฌธ

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

๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ

  • ๋ถ„๋ฅ˜, ํšŒ๊ตฌ ๋ถ„์„๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์•™์ƒ๋ธ” ํ•™์Šต ๋ฐฉ๋ฒ•์˜ ์ผ์ข…

    • ์•™์ƒ๋ธ”์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์•…๊ธฐ๊ฐ€ ํ•ฉ์ฃผํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ(์•„๋ž˜ ์„ค๋ช… ์ฐธ์กฐ)

  • ํ›ˆ๋ จ ๊ณผ์ •์—์„œ ๊ตฌ์„ฑํ•œ ๋‹ค์ˆ˜์˜ ๊ฒฐ์ • ํŠธ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋ถ€๋ฅ˜(๋ถ„๋ฅ˜) ๋˜๋Š” ํ‰๊ท  ์˜ˆ์ธก์น˜(ํšŒ๊ท€ ๋ถ„์„)๋ฅผ ์ถœ๋ ฅํ•จ์œผ๋กœ์จ ๋™์ž‘ํ•œ๋‹ค

  • ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ์ƒ˜ํ”Œ๋งํ•œ ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ํ•™์Šต์‹œํ‚จ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฒฐ์ •ํŠธ๋ฆฌ์˜ ์˜ˆ์ธก๊ฐ’๋“ค๊ฐ„์— ๋ณดํŒ…์„ ํ†ตํ•ด์„œ ์ตœ์ข… ์ถœ๋ ฅ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ธฐ๋ฒ•

์•™์ƒ๋ธ” ๋Ÿฌ๋‹

  • ์•™์ƒ๋ธ” ๋Ÿฌ๋‹์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ถ„๋ฅ˜๊ธฐ์˜ ์˜ˆ์ธก ๊ฒฐ๊ณผ๊ฐ’ ๊ฐ„์˜ ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด์„œ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ธฐ๋ฒ•

  • ์•™์ƒ๋ธ” ๋Ÿฌ๋‹์„ ์ด์šฉํ•˜๋ฉด ๋”์šฑ ์ข‹์€ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ถ„๋ฅ˜๊ธฐ๋Š” ๊ฐ™์€ ๋ชจ๋ธ๋กœ, ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ํ•ด๋„ ์ƒ๊ด€์ด ์—†๋‹ค

  • ํˆฌํ‘œ ๋ฐฉ์‹์€ ๋‹ค์ˆ˜๊ฒฐ ํˆฌํ‘œ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ‰๊ท ๊ฐ’์„ ์ทจํ•  ์ˆ˜๋„ ์žˆ๋‹ค

๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ 

    • ๋งŽ์€ ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹์„ ๊ฑฐ์น˜์ง€ ์•Š์•„๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ์ •์ ์ธ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค

    • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŠธ๋ฆฌ๋ฅผ ํ•œ๋ฒˆ์— ํ•™์Šต์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค

  • ๋‹จ์ 

    • ํ•™์Šต ์‹œ๊ฐ„์ด ์ƒ๋Œ€์ ์œผ๋กœ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค

Estimaotr

  • sklearn.ensemble.RandomForestClassifer

  • sklearn.ensemble.RandomForestRegressor

DataFrame์˜ .replace() ํ•จ์ˆ˜

df.replace()

  • ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜

  • ex

    • df['RainToday'].replace({'No':0, 'Yes':1}, inplace=True)

๋ฒ”์ฃผํ˜•(Categorical) ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ - One-hot Encoding

Integer Encoding

  • ๋ฒ”์ฃผํ˜• ๊ฐ’์„ ์ก์ˆ˜ํ˜• ๊ฐ’์œผ๋กœ ๋งค์นญํ•ด ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ

  • ex

    • dog : 1

    • cat : 2

One-hot Encoding

  • ๋ฒ”์ฃผํ˜• ๊ฐ’์„ ํŠน์ • ์ธ๋ฑ์Šค๊ฐ€ 1์ด๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ 0์˜ ๊ฐ’์„ ๊ฐ€์ง„ Binary value๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ

    • dog : [1, 0]

    • cat : [0, 1]

  • pd.get_dummies(df, prefix=) ๋ฅผ ํ†ตํ•ด ์›ํ•ซ ์ธ์ฝ”๋”ฉ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

์ •์ˆ˜ ์ธ์ฝ”๋”ฉ์€ ์˜๋ฏธ ์—†๋Š” ์ •์ˆ˜ ๊ฐ’์— ๋Œ€ํ•ด ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ•ด์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Œ

Rain in Australia ๋ฐ์ดํ„ฐ์…‹ ์†Œ๊ฐœ

  • ํ˜ธ์ฃผ ๊ธฐ์ƒ์ฒญ์—์„œ 2010๋…„์— ๋ฐœํ‘œํ•œ ๋ฐ์ดํ„ฐ์…‹

  • Target Value : Yes(tommorow rain) or No(tommorow don't rain)

  • Binary Classification

  • Number of data : 145,460

Random Forest Classifier๋กœ ๋‚ด์ผ ๋น„๊ฐ€ ์˜ฌ์ง€ ์•ˆ์˜ฌ์ง€ ์˜ˆ์ธกํ•ด๋ณด์ž - Rain in Australia ๋ฐ์ดํ„ฐ์…‹

  • Input data : 22 Dimension (Rain Tommorow ์ปฌ๋Ÿผ ์ œ์™ธ)

  • Target data : RainTommorow ์ปฌ๋Ÿผ

    • YES : ๋‚ด์ผ ๋น„์˜ด

    • NO : ๋‚ด์ผ ๋น„ ์•ˆ์˜ด

  • Estimator

    • DecisionTreeClassifier

    • RandomforestClassifier

  • ์ถ”๊ฐ€์ ์ธ ์ ์šฉ๊ธฐ๋ฒ•

    • Data Cleansing : ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ

๊ฒฐ์ธก์น˜์˜ ์กด์žฌ ์—ฌ๋ถ€

  • df.info() ๋ฅผ ํ†ตํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์™€ ์ปฌ๋Ÿผ ๋ณ„ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ != ์ปฌ๋Ÿผ ๋ณ„ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ์ผ ๊ฒฝ์šฐ ๊ฒฐ์ธก์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    • ์™œ๋ƒํ•˜๋ฉด ๊ฒฐ์ธก์น˜๋Š” ๊ฐœ์ˆ˜๋กœ ์„ธ์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

  • ๋˜ํ•œ, df.isnull().mean().sort_values() ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ

  • df.dtypes == 'object' ์ด๋ฉด categorical data์ด๋‹ค.

    • ๊ฒฐ์ธก์น˜๋ฅผ ์ฃผ๋กœ ์ตœ๋นˆ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ค€๋‹ค.

  • df.dtypes != 'object' ์ด๋ฉด numerical data์ด๋‹ค.

    • ๊ฒฐ์ธก์น˜๋ฅผ ์ฃผ๋กœ ํ‰๊ท ์ด๋‚˜ ์ค‘์•™๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ค€๋‹ค.

  • ๋˜ํ•œ label ๊ฐ’, ์ฆ‰ RainTommorrow ๊ฐ€ ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ž„์˜๋กœ ์ฑ„์šฐ๊ธฐ๊ฐ€ ์–ด๋ ค์šฐ๋ฏ€๋กœ drop ํ•œ๋‹ค

    • df.dropna(how='any', inplace=True)

    • ์ด ๋•Œ how='any' ๋Š” ๊ฒฐ์ธก์น˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ๋กœ์šฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด์ƒ์น˜(Outlier) ์ œ๊ฑฐ ๊ธฐ๋ฒ•

  • ์ด์ƒ์น˜๋ž€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ex) ํ‚ค๊ฐ€ ํฌ๋ฉด ์ฃผ๋กœ ๋ชธ๋ฌด๊ฒŒ๋„ ํฌ๋‹ค. ์ด ๋•Œ์˜ ์ด์ƒ์น˜๋Š” ํ‚ค๋Š” ์ž‘์€๋ฐ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ ํฌ๋‹ค.

  • ์ด์ƒ์น˜๋Š” ๋ชจ๋ธ์˜ ํ•™์Šต์— ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒ์น˜ ์ œ๊ฑฐ๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅํ–ฅ์ƒ์— ๋„์›€์ด ๋œ๋‹ค.

์ด์ƒ์น˜ ์ œ๊ฑฐ ๊ธฐ๋ฒ• - IQR

  • Inter Quantile Range

  • IQR = Q3 - Q1

  • data < Q1 - 1.5*IQR or data > Q3 + 1.5*IQR ์ผ ๊ฒฝ์šฐ์— ์ด์ƒ์น˜๋กœ ํŒ๋‹จํ•˜๊ณ  ์ œ๊ฑฐํ•œ๋‹ค.

  • Seaborn์˜ boxpot()์ด IQR๋ฅผ ๊ทธ๋ ค์ค€๋‹ค.

์ด์ƒ์น˜ ์ œ๊ฑฐ ์ปฌ๋Ÿผ ์„ ํƒ

  • ์ด์ƒ์น˜๋ฅผ ์ œ๊ฑฐํ•ด์ค˜๋„ ๊ฒฐ๊ณผ๊ฐ’์ด๋ž‘ ํฌ๊ฒŒ ๊ด€๋ จ์ด ์—†์œผ๋ฉด ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ํฐ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.

  • ๋”ฐ๋ผ์„œ, ๊ฒฐ๊ณผ๊ฐ’๊ณผ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์ปฌ๋Ÿผ์˜ ์ด์ƒ์น˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค

๊ตฌํ˜„

def outler(data, columns):
    for column in columns:
        Q1 = data[column].quantile(0.25)
        Q3 = data[column].quantile(0.75)
        IQR = Q3 - Q1
        
        ...
        
    return outlier_index

Outlier ์ œ๊ฑฐ๋ฅผ ํ†ตํ•ด Random Forest Classifier ์„ฑ๋Šฅ ํ–ฅ์ƒ ์‹œ์ผœ๋ณด๊ธฐ - Rain in Australia ๋ฐ์ดํ„ฐ์…‹

์ด์ „๊ณผ ๋™์ผํ•˜๋ฉฐ, ์œ„์˜ ๊ตฌํ˜„ ์ฒ˜๋Ÿผ ์•„์›ƒ๋ผ์ด์–ด ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค๋งŒ ๋ฐ›์•„์„œ dropํ•ด์ค€๋‹ค.

์„ฑ๋Šฅ์ด ์ข‹์•„์ง€๋Š” ๊ฒฐ๊ณผ.

Last updated

Was this helpful?