# ๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ์ ๊ต๊ณผ์, ํ์ดํ๋
6์ฃผ์ฐจ (์ฌ์ค 5์ฃผ์ฐจ ๋ง์ง๋ง ๋ + 6์ฃผ์ฐจ ์ฒซ ๋ ) ์๋ ๋จธ์ ๋ฌ๋์ ๋ฐฐ์ฐ๋ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ์ ๋ฌธํ๊ฒ ๋๋ '์บ๊ธ ํ์ดํ๋ ํ๋ก์ ํธ' ๋ฅผ ์งํํ๊ฒ ๋์๋ค. (์บ๊ธ ๋ฐ์ดํฐ์ : www.kaggle.com/c/titanic)
์ดํ์ด๋ผ๋ ์งง์ ์๊ฐ ๋์ ์งํ๋์๊ธฐ์, 'ํ๋ก์ ํธ'๋ผ๊ณ ๋ถ๋ฅด๊ธฐ์ ์ฝ๊ฐ์ ์ดํ๊ฐ ์๋ ๊ฒ ๊ฐ๊ณ '์ค์ตํ๋' ์ ๋๊ฐ ์ ๋นํ ๊ฒ ๊ฐ๋ค. ๋ณธ ์ค์ต์ ๋ชฉ์ ์ ์ ํ๋ฐ์ดํฐ์ ์ ํ์ฉํ์ฌ ์ผ์ฃผ์ผ ๊ฐ ๋ฐฐ์ด ๋จธ์ ๋ฌ๋ ์ด๋ก ๋ค์ ์ฝ๋๋ก ์ง์ ๊ตฌํํด๋ณด๋ ๋ฐ ์์๊ธฐ์, ๋ฐ๋ก ์ฃผ์ ๋ฅผ ์ ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋๋ฐ ๋ถํ์ํ ์๋์ง๋ฅผ ๋ค์ด์ง ์์๋ ๋์๋ค.
ํ์๋ค๊ณผ ์ธ์ฌ๋ฅผ ๋๋๊ณ ๋ฐ๋ก ์์ ์ ์์ํ๋๋ฐ, ์์ ์์๋ ๋ค์๊ณผ ๊ฐ์๋ค:
- ๋ฐ์ดํฐ ์ดํด๋ณด๊ธฐ (EDA)
- ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ (๋ถํ์ํ ๋ฐ์ดํฐ ์ ๊ฑฐ, ๊ฒฐ์ธก์น ์ฑ์ฐ๊ธฐ)
- ํ ์คํธ/๊ฒ์ฆ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ์ค๊ณ
- ๋ชจ๋ธ ๊ฒ์ฆ ๋ฐ hyperparameter tuning
# ํ์ดํ๋ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ์๊ฒผ๋๊ฐ
๋ณธ๊ฒฉ์ ์ผ๋ก ์ค์ต์ ๋ค์ด๊ฐ๊ธฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋๋ฐ, ๋จ์ํ ์๋์ ์ธ ์ฐ์ด์ ๋ฐ์ง๊ธฐ๋ณด๋ค ์ค์ ๋ก ์์กดํ ์๋ค๊ณผ (survived) ์ฃฝ์ ์๋ค(dead)์ ํน์ง์ด ์กด์ฌํ๋์ง ์์๋ณด๊ณ ์ ํ๋ค.
์ด ๋น์์ ์กฐ์๋ค ๊ฐ์ ๋ช ๋ช ์นดํ ๊ณ ๋ฆฌ์ฉ ๋งก์ ์์กด์ ๋น์จ๊ณผ ์ฌ๋ง์ ๋น์จ์ ๊ตฌํด๋ณด์๋๋ฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค์ฃผ๋ ํจ์ ํ๋๋ก ๋ชจ๋ ์๊ฐํ๊ฐ ๊ฐ๋จํ ํด๊ฒฐ๋์๋ค.
def survived_graph(value):
survived = data_df[data_df['Survived']==1][value].value_counts()
dead = data_df[data_df['Survived']==0][value].value_counts()
df = pd.DataFrame([survived, dead])
df.index = ['Survived', 'Dead']
df.plot(kind='bar', stacked=True, figsize=(5,5))
์์กด์๋ 1, ์ฌ๋ง์๋ 0์ผ๋ก ๊ธฐ๋ก๋์๊ธฐ ๋๋ฌธ์ ์๋ณธ ๋ฐ์ดํฐ์์ ํด๋น ๊ธฐ๋ก์ ๋ง๋ ํ๋ค์ ์ ํํด ์ถ์ถํ๋ค, ์ผ์ ํ ๊ธฐ์ค์ ๋ง์ถ์ด ๋ฐ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋๋ก ํ๋ค.
๊ฒฐ๊ณผ๋ฅผ 1์ฐจ์์ ์ผ๋ก ํด์ํด ๋ณด์์ ๋, ๋จ์ฑ๋ณด๋ค๋ ์ฌ์ฑ์ด, ์ฒญ๋ ์ธต๋ณด๋ค๋ ์ ๋ ์ธต์ด, C ์ง์ญ์์ ํ์นํ ์น๊ฐ๋ค์ด ์์กด์จ์ด ๋ ๋๋ค๋ ์ฌ์ค์ ์ ์ถํด๋ณผ ์ ์์๋ค.
# ๋นผ๊ณ ์ฑ์๋ฃ๊ธฐ
ํ์ดํ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ ๋ ๋ง๋ฅ๋จ๋ฆฐ ์ด๋ ค์ ์ค ํ๋๋ ๋ฐ์ดํฐ์ ๊ฒฐ์ธก์น์๋ค. ํ์น๊ฐ๋ค์ ์ฐ๋ น, ํ์น์ง, ํฐ์ผ๊ฐ, ๊ฐ์ค ์์น ๋ฑ๋ฑ์ ์ด๋ค์์ ๊ฒฐ์ธก์น๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๊ณ ์์์ ํ์ธํ ์ดํ, ๋น ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฑ์๋ฃ์์ง ๊ณ ๋ฏผํด๋ณด์๋ค.
์ฐ์ , ์ฐ๋ น์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ ์กฐ๊ฐ ์ ํํ ๋ฐฉ๋ฒ์ ๊ธฐ์กด ๋ฐ์ดํฐ์์ ๊ฒฐ์ธก๊ฐ์ด ์๋ ์ฐ๋ น์ ํ๋์ ๋ฐ์ดํฐ์ ์ผ๋ก ํ์ฉํ์ฌ ๊ฒฐ์ธก์น๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํด๋น ๋ฐ์ดํฐ์ ์์ ๋ฌด์์๋ก ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
# ๊ธฐ์กด ๋ฐ์ดํฐ์ Age ๋ฅผ ํ๋์ pool ๋ก ๋ง๋ค์ด ๋๋ค ์ถ์ถํ ๊ฐ ์ง์
age_list = [ x for x in x_data['Age'].dropna()]
for idx, x in enumerate(x_data['Age'].isnull()):
new_x = random.choice(age_list)
if x == True:
x_data.at[idx, 'Age'] = new_x
๊ฐ์ค ์์น์ ๊ฒฝ์ฐ, ๋ ๋ค๋ฅธ ์ด์ด์๋ 'Pclass' ์ ๋ฐ๋ผ ๋ฐฐ์ ๋ ๊ฐ์ค ์์น๊ฐ ๋ฌ๋ผ์ง๋ค๋ ์ ์ ํ์ฉํ์ฌ, ํด๋น ์น๊ฐ์ Pclass ์ด ๊ฐ๋ ๊ฐ์ค ์์น์ ๋ฐ์ดํฐ์ ์์ ๋ฌด์์๋ก ์ถ์ถํ๋๋ก ํ๋ค.
# ์ ์ค์ ํ์ null๊ฐ์ Pclass์ ๋ฐ๋ผ randomํ๊ฒ ๋ฐฐ์ ํด์ค ํจ์ ์ ์ธ
def fillnull(df):
colList = []
P1_CabinList = ["A", "B", "C", "D", "E"]
P2_CabinList = ["D", "E", "F"]
P3_CabinList = ["E", "F", "G"]
for row in df.index:
CabinName = df["Cabin"][row]
PclassName = df["Pclass"][row]
if CabinName == "N":
if PclassName == 1:
colList.append(random.choice(P1_CabinList))
elif PclassName == 2:
colList.append(random.choice(P2_CabinList))
else:
colList.append(random.choice(P3_CabinList))
else:
colList.append(CabinName)
return colList
x_data["Cabin"] = fillnull(x_data)
์ด์ธ์๋ ํ์น์ง์ ๊ฒฝ์ฐ ํ์น๊ฐ์ด ๊ฐ์ฅ ๋ง์๋ 'S'๋ก, ํฐ์ผ ๊ฐ๊ฒฉ์ ์ค๊ฐ๊ฐ์ผ๋ก ๊ฒฐ์ธก์น๋ฅผ ์ ๋ถ ์ฑ์๋ฃ์๋ค.
# ์ต์ ์ ๋ชจ๋ธ ์ฐพ๊ธฐ
๋ฐ์ดํฐ๋ฅผ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ ๋ ฅํ๊ธฐ ์ด์ ์ ๋น์ ํ ๋ฐ์ดํฐ์ธ ์๋ฃ๋ค์ ์ ํ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ์ฃผ๋ ์์ ์ ์ฐ์ ์ ์ผ๋ก ๊ฑฐ์น๊ณ , ์ ํ๋ฐ์ดํฐ๋ ํ์คํํด์ฃผ๋ ์์ ์ ์งํํ๋ค. Age ์ Fare ์ด์๋ ๊ฐ๊ฐ Standard Scalar ๋ฅผ ํ์ฉํด ๋ชจ๋ ์๊ฐ -1 ๊ณผ 1 ์ ๋ฒ์์ ํฌํจ๋๋๋ก ํ๊ณ , ๋๋จธ์ง ์ด๋ค์ ๋ํด์๋ one-hot encoding ์ ์งํํ๋ค. (Label encoding ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํ์ผ๋, label encoding ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๊ฐ์ ์ฐ์ด์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ด ์ฌ์ฉํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.)
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ค๊ณํ ๋ชฉ์ ์ '์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ ๋, ์ด ์ฌ๋์ด ์ด ํ๋ฅ ์ด ๋์์ง, ์ฃฝ์ ํ๋ฅ ์ด ๋์์ง ์์๋ด๊ธฐ' ์ํจ์ด์๋ค. ๊ฒฐ๊ณผ๊ฐ์ ๊ณง '์์กด' ํน์ '์ฌ๋ง' ์ผ๋ก ๋๋๊ฒ ๋ ๊ฒ์ด์๊ธฐ์, ์ด์ง๋ถ๋ฅ ๋ชจ๋ธ์ ์ฃผ๋ก ํ์ฉํ๋ค.
์ฐ๋ฆฌ๋ Gradient Boosting Classifier, XGBoost, Support Vector Machine, Logistic Regression, K-Nearest Neighbor ๋ฑ์ ๋ชจ๋ธ์ ํ์ฉํ์ผ๋ฉฐ, ๊ฐ์ฅ ์ฑ๋ฅ์ด ๋์๋ Gradient Boosting Classifier ์ ํํด GridSearchCV ๋ฅผ ์ ์ฉํ๋ค. ๊ทธ ๊ฒฐ๊ณผ, ์ต์ ์ ์ฑ๋ฅ์ ๋์ถํด๋ผ ์ ์์๊ณ , ์ต์ข ์ ์ผ๋ก
Accuracy on Training set: 0.884
Accuracy on Test set: 0.840
์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์๋ค.
๊ฒฐ๊ณผ์ ๊ฐ์ฅ ์๊ด๊ด๊ณ๊ฐ ๋์ ๋ณ์๋ฅผ ๋ฝ์์ฃผ๋ Feature Importance ๊ทธ๋ํ๋ฅผ ์ถ๋ ฅํด๋ณด์๋๋ฐ 'Mr' ํธ์นญ์ ๊ฐ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์์กด/์ฌ๋ง ์ฌ๋ถ๊ฐ ๊ฐ๋ฆด ํ๋ฅ ์ด ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
# ์ด๋ฒ ์ค์ต์ KPT (Keep, Problem, Try)
- Keep: ์์ผ๋ก๋ ์ ์งํ๋ฉด ์ข์ ์ ๋ค์?- EDA ๋ฅผ ํํํ๊ฒ ์งํํ ๊ฒ. ๋ฐ์ดํฐ๋ฅผ ๋ฉด๋ฐํ๊ฒ ์ดํด๋ณด๋ฉด ํฅํ ๋ถ์์ ์ํ ์ ์ ํ ๊ฐ์ค์ ์ธ์ธ ์ ์๊ฒ ๋จ.
- Problem: ๊ฐ์ ํ๋ฉด ์ข์ ์ ๋ค์?- ์ด๋ ต๋ค๊ณ ์๊ฐ๋๋ ๋ฐฉ๋ฒ๋ก ์ ๋๋ฌด ๋นจ๋ฆฌ ํฌ๊ธฐํ์ง ๋ง ๊ฒ. ๊ฐ๋ น, ๊ฒฐ์ธก์น๋ฅผ ์ฑ์ธ ๋ ์ฐ๋ น์ด๋ ํฐ์ผ ๊ฐ๊ฒฉ์ ๊ทธ๋ฃนํ์ ์๋ํด๋ณด์์ผ๋ฉด ๋์ฑ ์ข์์ ๊ฒ์ด๋ฉฐ ํน์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋ฏธ๋ฆฌ ์ ์ฉํด๋ ๊ด์ฐฎ์์ ๊ฒ์ด๋ค. ๋ค ๋จธ๋ฆฌ๋ฅผ ์ค์ณ๊ฐ๋ ๋ฐฉ๋ฒ๋ค์ธ๋ฐ ์๊ฐ ๋ถ์กฑ๊ณผ ๊ฒฝํ ๋ถ์กฑ์ผ๋ก ๋๋ฌด ๋นจ๋ฆฌ ํฌ๊ธฐํ๋ ๊ฒ์ด ์์ฝ๋ค.
- Try: ์์ผ๋ก ์๋ํด๋ณผ ๋ฐฉ๋ฒ๋ค์?- ์๋ฌด ๋ชจ๋ธ์ด๋ ์ ์ฉํ ๊ฒ์ด ์๋๋ผ, ์ด๋ก ์ ๊ธฐ์ด๋ก ์ ํํ ๋ชจ๋ธ์ ๋ํ ๊ทผ๊ฑฐ๋ฅผ ์ ๊ณตํ ๊ฒ.
* KPT ๋ Design Thinking ์์ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ Agile ๋ฐฉ๋ฒ๋ก ์ผ๋ก์จ, ํ๋ก์ ํธ ์์ ์ดํ ์ง๋์จ ๊ณผ์ ์ ํบ์๋ณด๋ฉฐ ํ๊ณ ํ๊ธฐ์ ์ ์ ํ๋ค๊ณ ํ์ฌ ์๋ํด๋ณด์๋ค.
๋๊ธ