๐ค ๋ชจ๋ธ์ ๋ง๋ค๊ณ ์๋ก์ด ๋ฐ์ดํฐ์ ์ ์ฉํด ๋ณด๊ธฐ ์ ์ ๊ทธ ๋ชจ๋ธ์ด ์ผ๋ง๋ ์ ๋ขฐํ ์ ์๋ ๋ชจ๋ธ์ธ์ง๋ฅผ ๋ฌผ์ด๋ณธ๋ค๋ฉด ๋ฌด์์ด๋ผ ๋ตํ ์ ์์๊น์?
# cross_val_predict๋ ์์ธกํ predict๊ฐ์ ๋ฐํํ์ฌ ์ง์ ๊ณ์ฐํด ๋ณผ ์ ์์ต๋๋ค.
# ๋ค๋ฅธ cross_val_score, cross_validate๋ ์ค์ฝ์ด๋ฅผ ์กฐ๊ฐ๋ง๋ค ์ง์ ๊ณ์ฐํด์ ๋ฐํํด ์ค๋๋ค.
from sklearn.model_selection import cross_val_predict
y_val_pred = cross_val_predict(model, X_train, y_train,
cv=5, n_jobs=-1, verbose=2)
๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉ ํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
1. one-hot-encoding (pd.get_dummies()
) ๐๐ป ์์๊ฐ ์๋ ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ
2. ordinal-encoding ๐๐ป ์์๊ฐ ์๋ ๋ฐ์ดํฐ์ ์ธ์ฝ๋ฉ
category ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ordinal encoding์ ํ ์ ์๋ค.
# ordinal-encoding์ ์ฌ์ฉํด์ year_month_code ํ์๋ณ์ ์์ฑ
# cat.codes: categorical accessor; ์์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ๋ณ๊ฒฝํด์ค๋ค.
train["year_month_code"] = train["datetime"].astype("category").cat.codes
test["year_month_code"] = test["datetime"].astype("category").cat.codes
๊ทธ๋ฅ ๋จธ๋ฆฌ์ ์ง์ด ๋ฃ์..๐ฅบ
๋ก๊ทธ(log)๋ ์ง์ ํจ์์ ์ญํจ์์ด๋ค. ์ด๋ค ์๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ๊ณ ์ ๋ ๋ฐ์ ๋ช ๋ฒ ๊ณฑํ์ฌ์ผ ํ๋์ง๋ฅผ ๋ํ๋ธ๋ค๊ณ ๋ณผ ์ ์๋ค.
# count, log1p, expm1
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 5))
# count - kdeplot
sns.kdeplot(train["count"], ax=axes[0])
# count log1p - kdeplot
sns.kdeplot(train["count_log1p"], ax=axes[1])
# expm1
sns.kdeplot(train["count_expm1"], ax=axes[2])
- log๋ฅผ count๊ฐ์ ์ ์ฉํ๊ฒ ๋๋ฉด ํ ์ชฝ์ ๋๋ฌด ๋พฐ์กฑํ๊ฒ ์๋ ๋ถํฌ๊ฐ ์ข ๋ ์๋งํ ๋ถํฌ๊ฐ ๋๋ค.
- ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์น์ฐ์น๊ณ (skewed) ๋พฐ์กฑํ ๋ถํฌ๊ฐ ์ ๊ท๋ถํฌ์ ๊ฐ๊น์ ์ง๊ธฐ๋ ํ๋ค.
- log๋ฅผ ์ทจํ ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด์์น์๋ ๋ ๋ฏผ๊ฐํ๊ฒ ๋๋ค.
# count expm1(exponential) - kdeplot
# np.exp๋ ์ง์ํจ์ ์
๋๋ค. np.log๋ก ์ทจํ๋ ๊ฐ์ ๋ค์ ์๋์ ๊ฐ์ผ๋ก ๋ณต์ํ ์ ์์ต๋๋ค.
# count == np.expm1(np.log1p(count)) ๊ฐ์ ๊ฐ์
๋๋ค.
# log๋ฅผ ์ทจํ ๋๋ 1์ ๋ํ๊ณ log๋ฅผ ์ทจํ๋๋ฐ
# ์ง์ํจ์๋ฅผ ์ ์ฉํ ๋๋ ๋ฐ๋์ ์์๋๋ก ๋ณต์ํด์ผ ์์๊ฐ ๋ง์ต๋๋ค.
# np.exp๋ก ์ง์ํจ์๋ฅผ ์ ์ฉํ๊ณ -1์ ํด์ฃผ์ด์ผ log๋ฅผ ์ทจํ๋ ์์๋ฅผ ๋ณต์ํด ์ฃผ๊ฒ ๋ฉ๋๋ค.
# np.expm1์ ์ง์ํจ์๋ฅผ ์ ์ฉํ๊ณ -1์ ํด์ฃผ๋ ์์๋ก ๋์ด์์ต๋๋ค.
train["count_expm1"] = np.exp(train["count_log1p"]) - 1
train[["count", "count_log1p", "count_expm1"]]
exponential == log๋ฅผ ์ ๊ฑฐํด์ ์๋๊ฐ์ผ๋ก ๋ณํ
๐ค ์๋์ count ์ปฌ๋ผ์ ๋ค์์ฐ๋๊ฑฐ๋ np.exp๋ก ๋ณต์ํด์ ์ฐ๋๊ฑฐ๋ ์ฐจ์ด๋ ์๋๊ฒ ๋ง์๊น์?
๐๐ป count == np.expm1(np.log1p(count))
# count, log1p, expm1
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(20, 5))
# count - kdeplot
sns.kdeplot(train["count"], ax=axes[0])
# count log1p - kdeplot
sns.kdeplot(train["count_log1p"], ax=axes[1])
# expm1
sns.kdeplot(train["count_expm1"], ax=axes[2])
์ด๋ค ์ฑ ๋ณด๋ค๋ ์ฌ๊ธฐ์ ์๋ ๊ถ์ฅ ํํ ๋ฆฌ์ผ์ ๋ฐ๋ผํด ๋ณด๋ ๊ฒ ์์ต๊ณผ ๋ณต์ต์ ๋์์ด ๋๋ค.
์ ๊ณตํ๋ ๋ฐ์ดํฐ์
์ ์๋ ์ฃผํ๊ฐ๊ฒฉ์ ์์ธกํ๊ธฐ ์ํ ๋ณ์๋ก๋ ๋ด์ธ๊ด ํ์ง, ํ์ฅ์ค์ ์, ๋ฐฉ์ ๊ฐ์, ์์์ฅ ์ฌ๋ถ, ์ง๋ถ, ์ธ์ ๊ฑด์ถ์ด ๋์๋์ง ๋ฑ์ ๋ฐ์ดํฐ๊ฐ ์๋ค.
์ด ๋ฐ์ดํฐ์
์ ํตํด EDA๋ฅผ ํด๋ณด๊ณ ํผ์ฒ์์ง๋์ด๋ง์ ํตํด ์ด๋ค๊ฒ ์ ํธ๊ฐ ๋๊ณ ์ด๋ค๊ฒ ์์์ด ๋ ์ง ์์๋ณผ ์์ .
sns.scatterplot(data=train, x=train.index, y="SalePrice");
plt.axhline(500000, c="k", ls=":")
- ํฌ์ํ ๊ฐ์ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด
1) ์์ ํฌ์๊ฐ์ ๊ฒฐ์ธก์น ์ฒ๋ฆฌํ๋ฉด ์ํซ์ธ์ฝ๋ฉ ํ์ง ์๋๋ค.
2) ํฌ์ํ ๊ฐ์ "๊ธฐํ" ๋ฑ์ผ๋ก ๋ฌถ์ด์ค ์๋ ์๋ค.
Q: train.groupby("season")["month"]. ์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋ฉด season์ ํด๋นํ๋ ์์ ์ ์์ฝํด์ ๋ณผ ์ ์์๊น์?
A: describe()
๋ unique()
Q: ์ ์ ๊ท๋ถํฌ๊ฐ ๋๋ฉด ๋จธ์ ๋ฌ๋์ด๋ ๋ฅ๋ฌ๋์์ ์ข์ ์ฑ๋ฅ์ ๋ผ๊น์?
A: ๊ฐ์ ๋ณผ ๋ ํ์ชฝ์ ๋๋ฌด ์น์ฐ์ณ์ ธ ์๊ณ ๋พฐ์กฑํ๋ค๋ฉด ํน์ฑ์ ์ ๋๋ก ํ์ตํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ ๊ท๋ถํฌ๋ก ๋์ด ์๋ค๋ฉด ํน์ฑ์ ๊ณ ๋ฅด๊ฒ ํ์ตํ ์ ์๋ค.
Q: ์ count์ log๋ฅผ ์ทจํ๊ณ ๋ค์ ์ง์ํจ์๋ก ๋ณต์์ ํ์๊น์?
A: log ๊ฐ์ผ๋ก ์์ธกํ๊ณ ์์ธก๊ฐ์ ๋ณต์ํ๊ธฐ ์ํด.
Q: ๋ณ์์ ๋ถํฌ๊ฐ ํธํฅ์ด ๋์๋ค๋ ์ด๋ค ํํ์ผ๊น์?
A: ์ ๊ท๋ถํฌ์ ํํ๊ฐ ์๋ ํํ (์๋๊ฐ ๋์ ํํ)
Q: ์ด์์น๊ฐ ํ์ต์ ๋ฐฉํดํ๋ค๋ ์๋ฏธ๊ฐ ๋ฌด์์ผ๊น์?
A: ์ด์์น๊น์ง ํ์ต๋์ด ์ผ๋ฐํ๊ฐ ์ด๋ ค์์ง๊ณ ๊ณผ๋์ ํฉ์ ์ฐ๋ ค๊ฐ ์๋ค.
Q: train ์ ์ ๋ต์ ์ด์์น๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๊ฒ ์ข์๊น์?
A: ๋๋ฌด ํฐ ๊ฐ์ ํ๊ท ์ด๋ ์ค์๊ฐ์ผ๋ก ๋์ฒดํ๋ค๋ฉด ์ค์ ๊ฐ์ด ๋ง์ด ์๊ณก์ด ๋ ์ ์๋ค. ์ ๋ต๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์๋ ์ค์ต์์ ์ค์ผ์ผ๋ง์ ํด์ค ์์ ์
๋๋ค. ์ค์ผ์ผ๋ง์ ํ๊ฒ ๋๋ฉด log๋ฅผ ์ทจํ๋ ๊ฒ์ฒ๋ผ ๋ค์ ๋ณต์๋ ๊ฐ๋ฅํฉ๋๋ค.
Q: category๋ object(string)๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์
์ธ๊ฐ์?
A: ๋ค๋ฅด๋ค.
Q: ํผ์ฒ ์ค์๋๋ ๋๋ค๊ณ ๋์ค๋๋ฐ ์ฑ๋ฅ ์์ฒด๊ฐ ๋จ์ด์ก์ผ๋ฉด ์ธ๋งํ ํผ์ฒ๊ฐ ์๋๋ผ๋ ๊ฑด๊ฐ์?
A: ํด๋น ๋ชจ๋ธ์ด ํ์ต์ ํ ๋ ์ค์ํ ์ญํ ์ ํ๋ค๊ณ ์๋ ค์ฃผ์ง๋ง ํผ์ฒ ์ค์๋๊ฐ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ค๋ช
ํ์ง๋ ์์ต๋๋ค. ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ชจ์๊ณ ์ฌ๋ฅผ ๋ณด๋ ๊ณผ์ ๊ณผ ์ ์ฌํ cross validation ์ ์๊ฐ ์ฌ๋ผ๊ฐ๋์ง ๋ด๋ ค๊ฐ๋์ง๋ฅผ ํ์ธํด ๋ด
๋๋ค. (score ์ธก์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ ์๊ฐ ์ฌ๋ผ๊ฐ์ผ์ง ์ข์ ์ฑ๋ฅ์ ๋ธ๋ค๊ณ ํ๋จํ๋ ์ธก์ ์งํ๋ (r2 score) ์๊ณ , ๋ด๋ ค๊ฐ์ผ ์ข์ ์ธก์ ์งํ๋ ์์ผ๋ ๊ตฌ๋ถํด์ ๋ณด์ธ์).
Q: ๊ทธ๋ผ ์ค์ํ ์ญํ ์ ํ๋ค๋๊ฒ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๋ถ๋ถ์ ๋ํด์ ์ค์ํ ์ญํ ์ ํ๊ฑด๊ฐ์?
A: ํผ์ฒ ์ค์๋๋ ์ด๋ ๋ฐ์ดํฐ ์์๊ฐ ํ๋ฅ ๊ฐ ๊ณ์ฐ์ ์ค์ํ๊ฒ ์์ฉ์ ํ๋๋ ํ๋ ์ ๋๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด์ง ์ค์๋๊ฐ ๋๋ค๊ณ ์ ์์ ์ข์ ์ํฅ(์ฑ๋ฅ)์ ๋ฏธ์น๋ค๋ ๊ฒ์ ์๋๋๋ค!
Q: ์ ์๊ฐ ๋์์ผ ์ข์ ์ธก์ ์งํ์ ๋ฎ์์ผ ์ข์ ์ธก์ ์งํ์ ์์๋ ์ ์ ์์๊น์?
A: R square score ๋ 1์ ๊ฐ๊น์ธ์๋ก ๋ ์ข์ ์ฑ๋ฅ์ ์๋ฏธํฉ๋๋ค. ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ด ๊ฐ์ผ๋ฉด 1์ด ๋ฉ๋๋ค. ์ต๋๊ฐ์ด 1์ธ๋ฐ ํด์๋ก ์ข์ต๋๋ค. ๋๋จธ์ง ํ๊ท์ ์ธก์ ๊ณต์์ ์ค์ฐจ๋ฅผ ์ธก์ ํ๊ธฐ ๋๋ฌธ์ ๋ฎ์์ผ ์ข์ต๋๋ค.
- ์ ์๊ฐ ๋์์ผ ์ข์ ์ธก์ ์งํ์ ์์๋ ์ ํ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ถ๋ฅ์ ์ธก์ ์งํ์ธ Accuracy์ ํ๊ท ๋ชจ๋ธ์์ ๋ ๋ฆฝ๋ณ์๊ฐ ์ข ์๋ณ์๋ฅผ ์ผ๋ง๋ ์ ์ค๋ช ํ๋์ง ๋ณด์ฌ์ฃผ๋ ๊ฒฐ์ ๊ณ์ (r2 score)๋ฑ์ด ์์ต๋๋ค.
- ์ ์๊ฐ ๋ฎ์์ผ ์ข์ ์ธก์ ์งํ๋ ์๋ฌ ๊ธฐ๋ฐ์ ์ธก์ ์งํ์ธ MAE, MSE, RMSE ๋ฑ์ด ์์ต๋๋ค.
Q: ์ฃผํผํฐ ๋
ธํธ๋ถ base path ์ค์ ํ๋ ๊ฒฝ์ฐ "/ํ์ผ๋ช
"์ผ๋ก ์ค์ ํ๋์?
A: ์๋๊ฒฝ๋ก์ธ์ง ์ ๋๊ฒฝ๋ก์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
- ์๋๊ฒฝ๋ก๋ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ๊ฒฝ๋ก. eg) ./ == ํ์ฌ๊ฒฝ๋ก
../ == ์์๊ฒฝ๋ก- ์ ๋๊ฒฝ๋ก๋ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๋ค ์ง์ ํ๋ ๊ฒฝ๋ก eg) ์๋์ฐ C: ๋ถํฐ ์์ํ๋ ๊ฒฝ๋ก
- ์ ๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ฌ๋์ ์ปดํจํฐ์์ ๋์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋๋ก์ด๋ฉด ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Q: ipynbํ์ผ๊ณผ ๋ฐ์ดํฐ์
์ด ์ฅฌํผํฐ๋
ธํธ๋ถ ์ ๊ฐ์ ํ์ผ ๋ด ์์ผ๋ฉด base_path = "./" ์ผ๋ก ํ๋ฉด ๋๋์?
A: .ipynb ์ csv ํ์ผ์ด ๊ฐ์ด ์๋ค๋ฉด csv ํ์ผ์ด๋ฆ๋ง ์ง์ ํด๋ ๋ฉ๋๋ค. data ํด๋ ์ ์์ ์๋ค๋ฉด ํด๋๋ฅผ ์ง์ ํด ์ฃผ์ธ์! ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ .ipynb ํ์ผ๊ณผ data ํด๋๋ฅผ ๊ฐ์ ์์น์ ๋๋ ๊ฒ์
๋๋ค.
์๋๊ฒฝ๋ก๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ์์น๋ฅผ ๋ปํ๋ ํค์๋๋ . ์ ๋๋ค.
Q: dt.dayofweek๊ฐ ์์์ ์์ผ ๊ณ์ฐ์ ํด์ฃผ๋๊ฑด๊ฐ์?
A: dt ์ ๊ทผ์์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์
๋๋ค.
The day of the week with Monday=0, Sunday=6.
Q: ์ค๋ฅธ์ชฝ์ผ๋ก ๋ง์ด ์น์ฐ์น ๊ทธ๋ํ๋ ๋ก๊ทธ๋ฅผ ์ทจํ๋ฉด ์ ๊ท๋ถํฌ์ ๊ฐ๊น์ ์ง๋์?
A: ์ด๋ค ์ชฝ์ผ๋ก ์น์ฐ์ณ์ ธ ์๋ ๋๋ฌด ์น์ฐ์น๊ฑฐ๋ ๋พฐ์กฑํ ๋ฐ์ดํฐ๊ฐ ์๋งํ๊ฒ ๋๋๋ฐ ์์ ํ ์ ๊ท๋ถํฌ๊ฐ ๋์ง๋ ์๋๋ผ๋ ์ ๊ท๋ถํฌ์ ์ข ๋ ๊ฐ๊น์ด ํํ๊ฐ ๋ฉ๋๋ค.
Q: ์ค๋ฌด์์๋ ์ด๋ค ํ๊ฐ์งํ๋ฅผ ์ฌ์ฉํด์ผํ ์ง ์ค์ค๋ก ๊ฒฐ์ ์ ํด์ผํ ํ
๋ฐ ์ด๋ ์ฌ๋ฌ๊ฐ์ง ํ๊ฐ์งํ๋ฅผ ์ฌ์ฉํ๋์ ์๋๋ฉด ์ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์ฒ์์ ๊ฒฐ์ ํ๋์?
A: ์ค๋ฌด์์๋ ๋ณดํต ๋น์ฆ๋์ค ํ๊ฐ์งํ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๊ฒฝ์ง๋ํ๋ ์ค์ต์์ ์ฌ์ฉํ๋ ํ๊ฐ์งํ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ธก์ ํด์ ๊ฐ๊ดํ ํด๋ณด๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ธ์ ๋ง๋๋ ๋ชฉ์ ์ ๋น์ฆ๋์ค ๋ฌธ์ ํด๊ฒฐ์ ์ํด์ ์
๋๋ค. ๊ทธ ๋ชจ๋ธ์ ๋ชฉ์ ์ด DAU(Daily Active User)๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ด๋ผ๋ฉด DAU๋ฅผ ์ธก์ ํ๊ณ ๋งค์ถ์ ๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด ๋งค์ถ์ก์ด ๋์ด๋ฌ๋์ง, ๊ตฌ๋งค์์๊ฐ ๋์ด๋ฌ๋์ง ๋ฑ์ ํ๊ฐํ๊ฒ ๋ฉ๋๋ค.
Q: ์ ๋ rmsle ๊ตฌํ ๊ฒ๊ณผ rmse ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ต๋๋ค.
A: ์์์ ๊ตฌํ best_model ๋ก ๋ค์ cross_val_predict ๋ฅผ ํ๋ฉด์ cv๋ฅผ ๋ค์ ๋๋ ์ ํ์ตํ๊ณ ์์ธกํ๊ธฐ ๋๋ฌธ์ ์ ์๊ฐ ๋ค๋ฅด๊ฒ ๋์ฌ ์ ์์ต๋๋ค.