๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ•˜๋ฃจ๊ณต๋ถ€

์ œ 21์žฅ๐Ÿ“•ML_RandomForest๐Ÿ“•

๐ŸŒฒ ์ •์˜  (RandomForest)

๊ฒฐ์ • ํŠธ๋ฆฌ์˜ ๋‹จ์ ์„(์˜ค๋ฒ„ํ”ผํŒ…) ๋ณด์™„์‹œ์ผœ์ค€ ์ƒ์œ„ ๋ชจ๋ธ

๋žœ๋ค์œผ๋กœ ์ƒ์„ฑํ•œ ๋งŽ์€ ๋‚˜๋ฌด๋กœ ์ด๋ฃจ์–ด์ ธ ์˜ˆ์ธก์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์น˜ ์ˆฒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—

์ด๋ฆ„์ด Random Forest๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.


๐ŸŽฏ ํ•ต์‹ฌ

โ€ป ์•™์ƒ๋ธ” ๊ธฐ๋ฒ•

๊ฐ•๋ ฅํ•œ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ณด๋‹ค ์•ฝํ•œ ๋ชจ๋ธ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ

๋” ์ •ํ™•ํ•œ ์˜ˆ์ธก์— ๋„์›€์„ ์ฃผ๋Š” ๋ฐฉ์‹

  • ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๋Š” ์•™์ƒ๋ธ” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ ํŠธ๋ฆฌ ๋ชจ๋ธ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๊ฐ€์žฅ ๋งŽ์€ ๋น„์ค‘์„ ์ฐจ์ง€ํ•œ๋‹ค
  • ๋ถ€์ŠคํŒ… ๋ชจ๋ธ๋ณด๋‹ค๋Š” ์†๋„, ์˜ˆ์ธก๋ ฅ ๋ฉด์—์„œ๋Š” ๋ชป ๋ฏธ์น˜์ง€๋งŒ ์‹œ๊ฐํ™”๊ฐ€ ๋งค์šฐ ๋›ฐ์–ด๋‚˜ ๋จผ์ € ์ดํ•ด๋„๋ฅผ ํ‚ค์›Œ์•ผ ํ•œ๋‹ค.
  •  ์ข…์†๋ณ€์ˆ˜๊ฐ€  ์—ฐ์†ํ˜•/๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ์ธ ๊ฒฝ์šฐ์—๋„ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์•„์›ƒ๋ผ์ด์–ด(์ด์ƒ์น˜)๊ฐ€ ๋ฌธ์ œ ๋  ์‹œ ์ข‹์€ ๋Œ€์•ˆ์ด ๋˜๋Š” ๋ชจ๋ธ์ด๋‹ค.
  • ๊ฒฐ์ • ํŠธ๋ฆฌ๋กœ ์˜ค๋ฒ„ ํ”ผํŒ…์ด ์ผ์–ด ๋‚ ์”จ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๋Œ€์•ˆ์ด ๋˜๋Š” ๋ชจ๋ธ์ด๋‹ค. 

๐Ÿ“š ๋‚ด๊ฐ€ ์“ฐ๋ ค๊ณ  ์ €์žฅํ•ด๋†“์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ•จ์ˆ˜

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

import pandas as pd 

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

 

ํ•จ์ˆ˜

-์ „์ฒ˜๋ฆฌ

df.engine.str.split(expend=True) =  ์—ด๋กœ ์ชผ๊ฐœ์ง  

str :๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ

 df.engine.str.split() # ๋ฆฌ์ŠคํŠธ๋กœ ์ชผ๊ฐœ์ง 

missing_value = df.isnull( ).sum( ) = ๊ฒฐ์ธก์น˜ ํ™•์ธ

pd.options.display.float_format = "{:,.2f}".format = ์†Œ์ˆ˜์  ๋‘ ๋ฒˆ์งธ ์ž๋ฆฌ๊นŒ์ง€ ํ‘œ์‹œ

df.์ปฌ๋Ÿผ.str.uppr( ) = ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜

df.์ปฌ๋Ÿผ.str.extract('([\d\.]+)').astype('float64') = ์ฒ˜์Œ ๊ฒ€์ƒ‰๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด๋งŒ ํƒ€์ž… ๋ณ€๊ฒฝ

                                                                              ๋ฆฌ์ŠคํŠธ(์—ฌ๋Ÿฌ ๊ฐœ) ๋ณ€๊ฒฝ ์‹œ extract_all

df = pd.get_dummies(df, columns=[' _ ' , ' _ ' ,' _ ' , ' _ ' , ' _ ' , ' _ ' ], drop_first=True

โžก _ , _ , _ , ๋“ฑ๋“ฑ ๋”๋ฏธํ™”

 

์ด๋ฆ„ ๋ณ€๊ฒฝ :  ex) df.name = df.name.replace('Land', 'Land Rovar') = ๋„ค์ž„ ์ปฌ๋Ÿผ์˜ Land๋ฅผ Land Rover๋กœ ๋ณ€๊ฒฝ

- ๐Ÿซ๋ชจ๋ธ๋ง, ํ•™์Šต

from sklearn.model_selection import KFold

 

df.reset_index(drop=True, inplace=True) = index๋กœ ๋ณ€ํ™˜ ์›๋ฌธ์— ์ ์šฉ

 

๐Ÿ“Œ ํ•˜์ดํผ ํŒจ๋Ÿฌ๋ฏธํ„ฐ ํŠœ๋‹

model = RandomForestRegressor()

train_rmse_total = []
test_rmse_total = []
for train_index, test_index in kf.split(X):  - ๋ฐ˜๋ณต <- 5 ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋‰œ K-Fold
    X_train, X_test = X.loc[train_index], X.loc[test_index]   - ๋…๋ฆฝ๋ณ€์ˆ˜๋“ค์˜ ํ›ˆ๋ จ ์…‹/์‹œํ—˜ ์…‹
    y_train, y_test = y[train_index], y[test_index]   - ์ข…์†๋ณ€์ˆ˜์˜ ํ›ˆ๋ จ ์…‹/์‹œํ—˜ ์…‹
    model = RandomForestRegressor(random_state=100)
    model.fit(X_train, y_train)   - ํ•™์Šต
    train_pred = model.predict(X_train)  -ํ›ˆ๋ จ์…‹ ์˜ˆ์ธก (์ž˜ ํ•™์Šต๋˜์—ˆ๋‚˜? ๊ณผ์ตœ์ ํ™”, ์˜ค๋ฒ„ํ”ผํŒ…?)
    test_pred = model.predict(X_test)  - ์‹œํ—˜ ์…‹ ์˜ˆ์ธก (์ž˜ ์˜ˆ์ธกํ•˜๋‚˜?, ์–ธ๋” ํ”ผํŒ…)
    train_rmse = mean_squared_error(y_train, train_pred, squared=False)
    test_rmse = mean_squared_error(y_test, test_pred) ** 0.5   - ** 1/2
    train_rmse_total.append(train_rmse)
    test_rmse_total.append(test_rmse)

train_rmse_total, test_rmse_total

 

- ์‹ค์ œ๊ฐ’, ์˜ˆ์ธก๊ฐ’ -> ์—๋Ÿฌ๋ฅผ ๋น„๊ต
print(
    "train_rmse : ", sum(train_rmse_total) / len(train_rmse_total),
    "test_rmse : ", sum(test_rmse_total) / len(test_rmse_total))


์žฅ์ , ๋‹จ์ 

๐Ÿ’ช์žฅ์ 

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

๐Ÿฉธ๋‹จ์ 

๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํŠน์„ฑ์ƒ ์ˆ˜๋ฐฑ~ ์ˆ˜์ฒœ ๊ฐœ์˜ ํŠธ๋ฆฌ๋ฅผ ํ˜•์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ

๋ชจ๋“  ํŠธ๋ฆฌ ๋ชจ๋ธ์„ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์„ ๊ธฐ๋Šฅ๋ฉด์—์„œ๋Š”  ๋–จ์–ด์ง„๋‹ค