
ํ์ฌ ์ฐธ์ฌ์ค์ธ ๋ถํธ์บ ํ์์ ์งํ์ค์ธ(5/1~5/15) House Price Prediction ๊ฒฝ์ง๋ํ๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์์ธ์ ์ํํธ ์ค๊ฑฐ๋๊ฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ธกํ๋ ๋ชจ๋ธ์ ๊ฐ๋ฐํ๋ ๋ํ
๋จธ์ ๋ฌ๋์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ๋ถ๋ฅํ๋ ๊ฒ์ด ์ฒซ ๋จ๊ณ๋ก์, ์ ๋ฐ์ ์ธ ๋ฐ์ดํฐ์ ํํ์ ์ ๋ณด, ๊ทธ๋ฆฌ๊ณ 'target'๊ฐ์ ํ์ธํ๊ธฐ ์ํด ๊ฐ๋จํ ์๊ฐํ ์ฝ๋๋ฅผ ์ฌ์ฉ
import pandas as pd
df = pd.read_csv('../data/train.csv')
df.head()
df.info()
import matplotlib.pyplot as plt
plt.hist(df['target'], bins=50)
plt.title('Target Distribution')
plt.xlabel('Price')
plt.ylabel('Frequency')
plt.show()

์ดํ, ์ซ์ํ์ธ์ง ๋ฒ์ฃผํ์ธ์ง์ ๋ฐ๋ผ ์ ์ฒ๋ฆฌ์ ๋ชจ๋ธ๋ง ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค๊ณ ๋ฐฐ์์ ์ด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ถ๋ฅํด๋ณด์์
# ๋ฐ์ดํฐ ํ์
ํ์ธ
print(df.dtypes)
# ์ซ์ํ / ๋ฒ์ฃผํ ๋ณ์ ๋ถ๋ฆฌ
num_cols = df.select_dtypes(include=['int64', 'float64']).columns
cat_cols = df.select_dtypes(include=['object']).columns
print(f"์ซ์ํ ์ปฌ๋ผ: {list(num_cols)}")
print(f"๋ฒ์ฃผํ ์ปฌ๋ผ: {list(cat_cols)}")
dtypes๋ก ๋ฐ์ดํฐ ํ์ ์ ํ์ธํ๊ณ , select_dtypes๋ก ์ซ์ํ/๋ฒ์ฃผํ์ ๋ถ๋ฆฌ
- ์ด๋ฒ ๋ํ์์๋ ์๋ฅผ ๋ค์ด ์ ์ฉ๋ฉด์ , ์ธต์๋ ์ซ์ํ, ๊ฑฐ๋์ ํ, ๊ฑด๋ฌผ์ฉ๋ ๋ฑ์ ๋ฒ์ฃผํ์ผ๋ก ๋ถ๋ฅํด๋ด
์ดํ, ๋ฐ์ดํฐ์ ์ ๊ณผํ ๊ฒฐ์ธก๊ฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ๊ฒฐ์ธก์น ํ์ธ ์ฝ๋๋ฅผ ์์ฑ ํ ๋น ๊ฐ์ ์ค์๊ฐ์ผ๋ก ์ฐ์ ์ ์ผ๋ก ์ฑ์๋ณด๊ธฐ๋ก ํจ
#๊ฒฐ์ธก์น ์๊ฐํ
import seaborn as sns
sns.heatmap(df.isnull(), cbar=False)

# ๊ฒฐ์ธก์น ํํฉ
print(df.isnull().sum())
# '์๋๋ณด์ฆ๊ธ' ์ปฌ๋ผ ๊ฒฐ์ธก์น๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ
df['์๋๋ณด์ฆ๊ธ'].fillna(df['์๋๋ณด์ฆ๊ธ'].median(), inplace=True)
'target'๋ณ์์ ๊ด๋ จ์๋ ๋ณ์ ์๊ฐํ - ์๊ด๊ด๊ณ๋ฅผ ์ฐพ์ ์ถํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด ๋ ์ฉ์ดํ ์ง ํ๋จํ๋ ์งํ๊ฐ ๋จ
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 10))
corr = df.corr(numeric_only=True)
sns.heatmap(corr, annot=True, fmt=".2f", cmap='coolwarm')
plt.title('Correlation Matrix with target')
plt.show()

๋ถ์์(1.00)์ ๊ฐ๊น์์ง์๋ก x, y์ถ์ ์ ํ ๋ณ์๋ค ๊ฐ์ ์๊ด๊ด๊ณ๊ฐ ๊ฐํ๋ค๋๊ฒ์ ํ์ธ๊ฐ๋ฅ
์ดํ, ์๋ณธ ๋ฐ์ดํฐ๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฏธ ์๋ ํ์๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ๋ฐฐ์(์๋ฅผ ๋ค์ด ๋ถ๋์ฐ์์๋ ๊ฑด์ถ์ฐ๋๋ง ๋ณด๊ณ ๋ ํ๊ณ๊ฐ ์์ผ๋ฏ๋ก, '๊ฑด๋ฌผ ๋์ด'๋ผ๋ ํ์๋ณ์๋ฅผ ์ ์) ์ด๋ฅผ ์ถ๊ฐํจ
# ๊ฒฐ์ธก์น ํํฉ
print(df.isnull().sum())
# '์๋๋ณด์ฆ๊ธ' ์ปฌ๋ผ ๊ฒฐ์ธก์น๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฑ์ฐ๊ธฐ
df['์๋๋ณด์ฆ๊ธ'].fillna(df['์๋๋ณด์ฆ๊ธ'].median(), inplace=True)
#๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ธก์น๊ฐ ๋ค ์ ์์ ์ผ๋ก ์ ๋ฆฌ๋์๋์ง ํ์ธ
print("๋จ์ ๊ฒฐ์ธก์น ์:", df.isnull().sum().sum())
๋ถ๋์ฐ ๋ฐ์ดํฐ์์๋ ๋น์ ์์ ์ผ๋ก ๋์ ๊ฑฐ๋๊ฐ๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ ๋ฐ์ดํฐ์ ์์ ํ์ธํ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์นํ๋ฉด ๋ชจ๋ธ์ด ์๊ณก๋๋ฏ๋ก IQR ๋ฐฉ์์ ํ์ฉํ์ฌ ์ด์์น๋ค์ ๊ณ ๋ฃจ ์ ๋ฆฌํด๋ณด์์
# ์ด์์น ์ฒ๋ฆฌ (๊ฑฐ๋๊ธ์ก)
Q1 = df['๊ฑฐ๋๊ธ์ก'].quantile(0.25)
Q3 = df['๊ฑฐ๋๊ธ์ก'].quantile(0.75)
IQR = Q3 - Q1
df = df[(df['๊ฑฐ๋๊ธ์ก'] >= Q1 - 1.5 * IQR) & (df['๊ฑฐ๋๊ธ์ก'] <= Q3 + 1.5 * IQR)]
์ํ์ 25% ์ง์ ์ ๊ธฐ๋ฐ์ผ๋ก IQR ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐ (๋ํ ๋ฐ์ดํฐ์ ์์๋ ์ด๊ณ ๊ฐ ๊ฑฐ๋๊ฐ ์ข ์ข ์ด์์น๋ก ํ๋จ)
๋ถ๋์ฐ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ ์ฉ๋ฉด์ , ๊ฑด๋ฌผ ๋์ด ๋ฑ ๋ณ์๋ค์ ๋จ์๊ฐ ๊ฐ๊ฐ ์์ดํ๊ณ ๋๋ฌด ํฐ๊ฒ๋ค์ด ์์ด ์ด๋ฅผ ์ ๋ฆฌํด์ค
# ํ์คํ
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['์ ์ฉ๋ฉด์ ', 'building_age']] = scaler.fit_transform(df[['์ ์ฉ๋ฉด์ ', 'building_age']])
StandardScaler๋ก ํ์คํํด์ ๋ชจ๋ ๋ณ์๋ฅผ ํ๊ท 0, ํ์คํธ์ฐจ 1๋ก ๋ง์ถค
๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ธ์ฝ๋ฉ์ ์งํ
# ๋ ์ด๋ธ ์ธ์ฝ๋ฉ (๊ฑฐ๋์ ํ)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['๊ฑฐ๋์ ํ_encoded'] = le.fit_transform(df['๊ฑฐ๋์ ํ'])
# ์-ํซ ์ธ์ฝ๋ฉ (๊ฑด๋ฌผ์ฉ๋)
df = pd.get_dummies(df, columns=['๊ฑด๋ฌผ์ฉ๋'])
๋ํ๋ฅผ ์ค๋นํ๋ฉฐ ๋ค์ ํ๋ฒ ๋๋ ๊ฒ์ '๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ์ ์ค์์ฑ'์ด๋ผ๋ ๋ง์ด ์ ๋ง๋ก ์ฌ์ค์ด๋ผ๋ ๊ฒ์ ๋๋๊ฒ ๊ฐ์.(ํ์์๋ ๋ก์ฐ๋ฐ์ดํฐ์
๊ฐ์๊ฑฐ๋ฅผ ๋ณด๋ฉด ๊ทธ๋ฅ ๋ญ ์ด๋ ๊ฒ ์ ๋ ๊ฒ ํ๋ฉด ์๋ ๊ฒ ๋์จ๋ค ๋ญ ๊ทธ๋ฐ ๋๋์ผ๋ก๋ค๊ฐ ์๊ฐํ๊ณ ์์๋๋ฐ, ํ์๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ ๋ฐฐ์ด๋๋ก ์์๋๋ก ํด๋ ์์ง ๋ญ์ ์ด์คํ ๋ถ๋ถ๊ณผ ์๋ฒฝํ๊ฒ ์ ๋๋์ง ์์ ๋ถ๋ถ๋ค์ด ๋ณด์ด๋๊ฒ ๊ฐ์์ ์์งํ ์์ฝ๊ธฐ๋ ํ๊ณ ๊ทธ๋ฌ๋์ค...)
ํนํ ๊ฒฐ์ธก์น ์ฒ๋ฆฌ, ์ด์์น ์ ๊ฑฐ, ํ์๋ณ์ ์์ฑ์ ์ค์์ฑ์ ์ง์ ์ฒด๊ฐํ ์ ์์๊ณ , ๋ค์์๋ ๊ทธ๋ฅ ์๋ฌด๋ฐ ์ฒ๋ฆฌ ์ํ๊ณ ์ ๋ก์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ๋ง ํ ๊ฒฐ๊ณผ๊ฐ์ ํ๋ฒ ๋ถ์ํด๋ณผ ์ ์๋ ๊ฒ๋ ์ข์๊ฒ ๊ฐ๋ค...์๊ฐ์ด ๋๋ค๋ฉด...
1๏ธโฃ ๊ธฐ๋ณธ ํ๊ท๋ชจ๋ธ ํ์ต
์ฐ์ ์ ํํ๊ท, ๊ฒฐ์ ํธ๋ฆฌ ํ๊ท ๋ฑ ๋จ์ํ ๋ชจ๋ธ๋ก ๋ฒ ์ด์ค๋ผ์ธ ์ฑ๋ฅ์ ํ์ธํ ์์
2๏ธโฃ ์์๋ธ ๋ชจ๋ธ ์ ์ฉ(ํ์ฌ ์งํ์ค...!)
๋๋คํฌ๋ ์คํธ, ๊ทธ๋ผ๋์ธํธ ๋ถ์คํ
, XGBoost ๋ฑ ์์๋ธ ๊ณ์ด์ ๊ฐ๋ ฅํ ํ๊ท๋ชจ๋ธ์ ์ ์ฉํ ์์
3๏ธโฃ ๊ต์ฐจ๊ฒ์ฆ ๋ฐ ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
๋ชจ๋ธ์ ๊ณผ์ ํฉ ์ฌ๋ถ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด K-ํด๋ ๊ต์ฐจ๊ฒ์ฆ์ ๋์
ํ๊ณ , GridSearchCV ๋ฑ์ผ๋ก ํ์ดํผํ๋ผ๋ฏธํฐ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ํ์
4๏ธโฃ ํผ์ฒ ์์ง๋์ด๋ง ๊ณ ๋ํ
๋ชจ๋ธ ์ฑ๋ฅ์ ์ต๋ํ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํด ์ค๋ ์์ฑํ ํ์๋ณ์๋ฅผ ๋ ํ์ฅํ๊ฑฐ๋, ๋ค์ค๊ณต์ ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ณ์ ์ ํ ๊ธฐ๋ฒ(RFE ๋ฑ)์ ์ ์ฉํด๋ณผ ์์
5๏ธโฃ ๋ชจ๋ธ ํด์ ๋ฐ ์๊ฐํ
์ดํ ๋ค๋ฅธ๊ฒ ์ผ์ถ ๋์๋ค ์ถ์ผ๋ฉด ์๊ฐํํด์ ํ๋ฒ 1์ฐจ์ ์ผ๋ก ๋ถ์ํด๋ณด๊ณ ...ํ์๋ค๊ณผ ๊ณต์ ๋ฐ ํ ์ ํ ๋ ๋์ ๋ฐฉ์์ ๋ชจ์