๋ชฉํ
- ํ๋ จ/๊ฒ์ฆ/ํ ์คํธ(train/validate/test) ๋ฐ์ดํฐ์ ๋ํ ์ดํด
- ๋ถ๋ฅ(Classification)์ ํ๊ท(Regression)์ ์ฐจ์ด์ ์ ํ์ ํ๊ณ ๋ฌธ์ ์ ๋ง๋ ๋ชจ๋ธ ์ฌ์ฉ
- ๋ก์ง์คํฑํ๊ท(Logistic Regression)์ ๋ํ ์ดํด
Train/Validate/Test data
Kaggle 'Titanic: Machine Learning from Disaster' ์์
import pandas as pd
train = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/titanic/train.csv')
test = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/titanic/test.csv')
print("train features: ", train.shape[1])
print("test features: ", test.shape[1])
train features: 12
test features: 11
์ฆ, test data๋ target(label, ์ฐ๋ฆฌ๊ฐ ์๊ณ ์ถ์ ์ ๋ต) ๋ณ์๊ฐ ํ๋ ์ ์ต๋๋ค.
print("target col: ", train.columns.difference(test.columns)[0]) # ์ด๋ค ํน์ฑ์ด ๋น ์ ธ์๋์ง ํ์ธ
target col: Survived
์ผ๊ธ์์๋ ๋ณดํต train set ๊ณผ test set์ ๋๋ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ test set์๋ target์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ธํด์ ์ ๊ณตํฉ๋๋ค.
์ผ๋จ ๋ฌด์์ ์ฌ๋๋ค์ด test set์ ํตํด ์ ์๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ ๋ง๋ ๊ฒ๋ ์์ง๋ง, ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ชจ๋ธ์ ์ผ๋ฐํ ์ฑ๋ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ธก์ ํ๊ธฐ ์ํ์ ๋๋ค.(์ฌ์ค ๋น์ทํ ์ด์ )
๊ทธ๋ ๊ธฐ์ ์ฐ๋ฆฌ๋ train set์ ์ผ๋ถ๋ฅผ validate set์ผ๋ก ๋๋์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ฐ๋ก ๊ฒ์ฆํด์ผํฉ๋๋ค.
์ validate set์ด ํ์ํ ๊น?
train set์ผ๋ก๋ง ํ๋ฒ์ ์์ ํ๊ฒ ํ์ต์ํค๋ ๊ฒ์ ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. train set์ ํตํด ๋ค๋ฅด๊ฒ ํ๋๋ ์ฌ๋ฌ ๋ชจ๋ธ๋ค์ ํ์ตํ ํ ์ด๋ค ๋ชจ๋ธ์ด ํ์ต์ด ์ ๋์๋์ง validate set์ ์ฌ์ฉํ์ฌ ์ ํํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
์ฆ, train set์ผ๋ก ์ฌ๋ฌ ๋ชจ๋ธ๋ค์ ํ์ต(๋ชจ๋ธ์ ์ง์ ๊ด์ฌ)ํ๊ณ validate set์ผ๋ก ๋ชจ๋ธ์ ์ ํํ๊ณ , ์ข๋ ์กฐ์ ์ ํ ํ(๋ชจ๋ธ์ ๊ฐ์ ๊ด์ฌ) test set์ ๋ํด์ ๋จ ํ๋ฒ ๊ฒฐ๊ณผ๊ฐ์ ์ํํด๋ด ๋๋ค.
cf)๋ง์ฝ test set์ผ๋ก ๋ชจ๋ธ์ ์ ํํ๊ณ ์กฐ์ ํ๋ค๋ฉด, ๊ทธ๊ฑฐ ์์ฒด๊ฐ ์ด๋ฏธ test set์ ํนํ๋ ๋ชจ๋ธ์ ๊ณ ๋ฅด๋ ๊ฒ์ด๊ธฐ์ ๊ณผ์ ํฉ์ ๊ธฐ์ฌํ๊ฒ ๋๋ ๊ฑฐ๊ณ ์ผ๋ฐํ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ๊ฒ์ ๋๋ค.
- train data : ๋ชจ๋ธ์ fitํ๋ ์ฉ๋ == ๋ฌธ์ ์ง ํ์ต
- validate data : ์์ธก ๋ชจ๋ธ์ ์ ํํ๊ธฐ ์ํด ์ค๋ฅ๋ฅผ ์ธก์ ํ๋ ์ฉ๋ == ๋ชจ์๊ณ ์ฌ
- test data : ์ผ๋ฐํ ์ค๋ฅ๋ฅผ ํ๊ฐํ๊ธฐ ์ํจ์ผ๋ก ์ ํ๋ ๋ชจ๋ธ์ ๋ํด ๋ง์ง๋ง์ ํ ๋ฒ ์ฌ์ฉ, ํ๋ จ์ด๋ ๊ฒ์ฆ๊ณผ์ ์์ ์ ๋ ์ฌ์ฉX == ์๋ฅ
- ํ์ต ๋ชจ๋ธ์ ๊ฐ๋ฐ ์, ๋ชจ๋ธ ์ ํ(Model Selection) ๊ณผ์ ์ด ํ์
- ํ์ดํผํ๋ผ๋ฏธํฐ(Hyper parameter) ํ๋์ ํ๊ฒ ๋๋๋ฐ ํ๋์ ํจ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด val data(๊ฒ์ฆ ๋ฐ์ดํฐ)๊ฐ ํ์
- test data๋ก ์ ๋ ํ๋์ ํ๋ฉด ์๋จ
- ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ์ train/val/test ์ผ๋ก ๋๋ ์ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, ์๋์ ์ผ๋ก ๋ฐ์ดํฐ ์๊ฐ ์ ์ ๊ฒฝ์ฐ K-fold cross validation์ ์งํํ ์ ์์ต๋๋ค.(๋จ, ์ด ๋๋ test set๋ ๋ฏธ๋ฆฌ ๋ฐ๋ก ๋์ด์ผํฉ๋๋ค.)
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2, random_state=2) # random_state๋ ์ ํ
train, validation = train_test_split(train, test_size = 0.2, random_state=2) # ๋๋์ด์ง train์์ ํ๋ฒ ๋ ๋๋ ์ valdation ์์ฑ
# ์ดํ features์ target์ ์ ํด์ฃผ๊ณ X, y ๋ก ๋๋๋ค.
features =
target =
X_train = train[features]
X_val = validation[features]
X_test = test[features]
y_train = train[target]
y_val = validation[target]
y_test = test[target]
๋๋
features =
target =
X = df[features]
y = df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=2)
๋ถ๋ฅ(Classification)
- ๋ถ๋ฅ๋ฌธ์ ๋ ํ๊ท๋ฌธ์ ์ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ๊ธฐ์ค๋ชจ๋ธ์ ์ ์ ํฉ๋๋ค.
- ํ๊ท๋ฌธ์ : ๋ณดํต ํ๊ฒ ๋ณ์์ ํ๊ท ๊ฐ์ ๊ธฐ์ค๋ชจ๋ธ๋ก
- ๋ถ๋ฅ๋ฌธ์ : ๋ณดํต ํ๊ฒ ๋ณ์์ ์ต๋น๊ฐ์ ๊ธฐ์ค๋ชจ๋ธ๋ก
- ์๊ณ์ด(time-series) : ๋ณดํต ์ด๋ค ์์ ์ ๊ธฐ์ค์ผ๋ก ์ด์ ์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค๋ชจ๋ธ๋ก
๋ถ๋ฅ ๋ฌธ์ ์์ ์ต๋น๊ฐ์ ๊ธฐ์ค๋ชจ๋ธ๋ก ๋๋ ์ด์ ?
ํด๋์ค 1๊ณผ 0์ ๋น์จ์ด 9:1์ธ ํ์ต ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ชจ๋ธ์ ๋ง๋ ๋ค๋ฉด ๋ชจ๋ธ ๊ฒฐ๊ณผ๊ฐ์ 1๋ก ๊ณ ์ ํด๋ ์ ํ๋๊ฐ 90%๊ฐ ๋์ค๊ฒ ๋๋ค. ๊ทธ๋ผ ์ด ๋ชจ๋ธ์ ์ ํ๋๊ฐ 90% ์ด์์ด๋ ์๋ฏธ๊ฐ ์๋ ๋ชจ๋ธ์ผ๊น? X
๋ฐ๋ผ์, ์ฐ๋ฆฌ๋ ๋ชจ๋ 1๋ก ๋ฌ๋ 90%๊ฐ ๋์ค๋ ์ด 90%๋ณด๋ค ๋์ ๊ฐ์ ๊ฐ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด์ผ '์ ์๋ฏธ'ํ๋ค๊ณ ํ๋จํ ์ ์๋ค.(๋ง ๊ทธ๋๋ก ๊ธฐ์ค์ด ๋๋ ๊ฒ์ด๋ค.)
# ์ต๋น๊ธฐ์ค๋ชจ๋ธ ๋ง๋๋ ์์
target = 'Survived' # ํ์ดํ๋ ์
์ผ๋ก ์์
y_train = train[target]
y_tain.value_counts(normalize=True) # 0๊ณผ 1 ์ค ์ต๋น๊ฐ์ด ์ด๋ค๊ฑด์ง ์๊ธฐ ์ํจ
0 0.625749
1 0.374251
# mode(): Return the highest frequency value in a Series.
major = y_train.mode()[0]
# ํ๊ฒ ์ํ ์ ๋งํผ 0์ด ๋ด๊ธด ๋ฆฌ์คํธ๋ฅผ ๋ง๋ญ๋๋ค. ๊ธฐ์ค๋ชจ๋ธ๋ก ์์ธก
y_pred = [major] * len(y_train)
๋ถ๋ฅ์์์ ํ๊ฐ์งํ(ํ๊ท์๋ ๋ค๋ฅธ ํ๊ฐ์งํ ์ฌ์ฉ)
- ์ ๋๋ก ํ๊ทํ๊ฐ์งํ๋ฅผ ๋ถ๋ฅ ๋ชจ๋ธ์ ์ฌ์ฉํด์ ์๋ฉ๋๋ค. ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง
- ๋ถ๋ฅ๋ฌธ์ ์์์ ์ฌ์ฉํ๋ ํ๊ฐ์งํ : ์ ํ๋(Accuracy)
$$Accuracy = \frac{์ฌ๋ฐ๋ฅด๊ฒ ์์ธกํ ์} {์ ์ฒด ์์ธก ์} = \frac{TP + TN} {P + N}$$
# ์ด๋ฐ์์ผ๋ก accuracy ๊ตฌํ ์ ์์
from sklearn.metrics import accuracy_score
print("training accuracy: ", accuracy_score(y_train, y_pred))
๋ก์ง์คํฑ ํ๊ท(Logistic Regression)
๋ก์ง์คํฑ ํ๊ท๋ชจ๋ธ
$$\large P(X)={\frac {1}{1+e^{-(\beta_{0}+\beta_{1}X_{1}+\cdots +\beta_{p}X_{p})}}}$$
$$ 0 \leq P(X) \leq 1$$
๋ก์ง์คํฑํ๊ท๋ ํน์ฑ๋ณ์๋ฅผ ๋ก์ง์คํฑ ํจ์ ํํ๋ก ํํํฉ๋๋ค.(์์์ 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก 0 ๊ณผ 1๋ก ๋๋ฉ๋๋ค.)
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ด์ธก์น๊ฐ ํน์ ํด๋์ค์ ์ํ ํ๋ฅ ๊ฐ์ผ๋ก ๊ณ์ฐ์ด ๋ฉ๋๋ค. ๋ถ๋ฅ๋ฌธ์ ์์๋ ํ๋ฅ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ถ๋ฅ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
Logit Transformation
- ๋ก์ง์คํฑํ๊ท ๊ณ์๋ ๋น์ ํ ํจ์ ๋ด์ ์์ด ์ง๊ด์ ์ผ๋ก ํด์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
- ์ด ๋, ์ค์ฆ(Odds) ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๊ฒฐํฉ ํํ๋ก ๋ณํ์ด ๊ฐ๋ฅํด์ ๋ณด๋ค ์ฝ๊ฒ ํด์ ๊ฐ๋ฅ
- ์ค์ฆ(Odds) : ์คํจํ๋ฅ ์ ๋ํ ์ฑ๊ณตํ๋ฅ ์ ๋น == ์ฑ๊ณตํ๋ฅ /์คํจํ๋ฅ == ํด๋์ค1์ ์ํ ํ๋ฅ / ํด๋์ค0์ ์ํ ํ๋ฅ
$$Odds = \large \frac{p}{1-p}$$
p = ์ฑ๊ณตํ๋ฅ , 1-p = ์คํจํ๋ฅ
$$p = 1 ์ผ๋ odds = \infty ,p = 0 ์ผ๋ odds = 0$$
$$\large ln(Odds) = ln(\frac{p}{1-p}) = ln(\frac{\frac {1}{1+e^{-(\beta_{0}+\beta_{1}X_{1}+\cdots +\beta_{p}X_{p})}}}{1 - \frac {1}{1+e^{-(\beta_{0}+\beta_{1}X_{1}+\cdots +\beta_{p}X_{p})}}}) = \normalsize \beta_{0}+\beta_{1}X_{1}+\cdots +\beta_{p}X_{p}$$
- ๋ก์ง๋ณํ(Logit Transformation) : ์ค์ฆ์ ๋ก๊ทธ๋ฅผ ์ทจํด ๋ณํํ๋ ๊ฒ
- ์ด๋ฅผ ํตํด ๋น์ ํํํ์ธ ๋ก์ง์คํฑํจ์ํํ๋ฅผ ์ ํํํ๋ก ๋ง๋ค์ด ํ๊ท๊ณ์์ ์๋ฏธ๋ฅผ ์ข๋ ์ฝ๊ฒ ํด์ํ ์ ์์ต๋๋ค.
- ํน์ฑ X์ ์ฆ๊ฐ์ ๋ฐ๋ผ ๋ก์ง(ln(Odds))๊ฐ ์ผ๋ง๋ ์ฆ๊ฐํ๋ค๊ณ ํด์ ๊ฐ๋ฅ ; X(ํน์ฑ) 1๋จ์ ์ฆ๊ฐ ๋น Odds๋ exp(๊ณ์) ๋งํผ ์ฆ๊ฐํ๋ค ํด์ ๊ฐ๋ฅ)
๊ธฐ์กด ๋ก์ง์คํฑํํ์ y ๊ฐ์ 0 ~ 1์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค๋ฉด ๋ก์ง์ -โ ~ โ ์ ๋ฒ์๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๋ก์ง์คํฑ ํ๊ท ์ถ๊ฐ์ฌํญ
# ๋ค์๊ณผ ๊ฐ์ด fitting
from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression()
logistic.fit(X_train, y_train)
logistic.score(X_train, y_train) # ์ด๋ ๊ฒ ํ๋ฉด train set์ ๋ํ ์ ํ๋๋ฅผ ๊ตฌํ ์ ์์
logistic.score(X_val, y_val) # ์ด๋ ๊ฒ ํ๋ฉด val set์ ๋ํ ์ ํ๋๋ฅผ ๊ตฌํ ์ ์์
์ถ๊ฐ ํ(์ฌ๋ฌ ์ธ์ฝ๋ ์ฌ์ฉ ์์)
! pip install category_encoders
from category_encoders import OneHotEncoder # scikitlearn์๋ ์๊ธดํ๋ฐ, category_encoders๊บผ๊ฐ ๋ ์ ์ฉํ๊ณ ์ฌ์ฉํ๊ธฐ ์ข์
encoder = OneHotEncoder(use_cat_names=True) # ๊ฐ ๋ฒ์ฃผ์ ๋ช
์ ์ปฌ๋ผ์ ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป(cat== category)
X_train_encoded = encoder.fit_transform(X_train)
X_val_encoded = encoder.transform(X_val)
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean') # ๊ฒฐ์ธก์น๋ฅผ 'ํ๊ท '์ผ๋ก ์ฑ์์ฃผ๊ฒ ๋ค.
X_train_imputed = imputer.fit_transform(X_train_encoded)
X_val_imputed = imputer.transform(X_val_encoded)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() # ๊ฐ ์ปฌ๋ผ์ ๋จ์๋ฅผ ๋ง์ถ๋ ๊ฒ ; ํ์คํ(scailing)
X_train_scaled = scaler.fit_transform(X_train_imputed)
X_val_scaled = scaler.transform(X_val_imputed)
์ด๋ฐ ๊ณผ์ ์ train ๊ณผ val set์ ์ ์ฉ ํ ๋ชจ๋ธ์ fit(์ฌ๊ธฐ์๋ LogisticRegression)
๋ง์ง๋ง์ test set์ ํตํด ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ผ ๋๋ ์ ๊ณผ์ ์ X_test์ ํด์ค์ผํฉ๋๋ค.
X_test = test[features]
X_test_encoded = encoder.transform(X_test)
X_test_imputed = imputer.transform(X_test_encoded)
X_test_scaled = scaler.transform(X_test_imputed)
y_pred_test = model.predict(X_test_scaled)
# ์ด๋ฐ ์์ผ๋ก :)
'๐ฟ Data > ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL]28.Decision Tree(์์ฌ๊ฒฐ์ ๋๋ฌด) (0) | 2021.12.26 |
---|---|
[TIL]27.Section2_sprint1 challenge (0) | 2021.12.24 |
[TIL]25.Ridge Regression(๋ฅํ ํ๊ท) (0) | 2021.12.21 |
[TIL]24.๋ค์ค์ ํํ๊ท(Multiple Linear Regression) (0) | 2021.12.21 |
[TIL]23.Simple Regression(๋จ์ํ๊ท) (0) | 2021.12.18 |