๋จธ์ ๋ฌ๋ end-to-end process

1. ๋ฌธ์ ์ ์ : ๋ญ ํด์ผ ๊ฒ ๋ค! -> ๋ถ๋ฅ, ํ๊ท ๋ฑ ์ด๋ค ๊ฒ์ธ์ง
2. ๋ฐ์ดํฐ ์ค๋น
< ์ ํต์ ์ธ ํ๋ก๊ทธ๋๋ฐ์์์ ๋ฐ์ดํฐ ์ค๋น >
a. ์ ์ ์ ์๊ตฌ์ฌํญ, ๋น์ฆ๋์ค ๋ฃฐ, ํ๋ก๊ทธ๋จ ์คํฉ, ์ค๊ณ์ ์ ๋ฆฌ
b. ์ ํต์ ์ธ ํ๋ก๊ทธ๋๋ฐ์์ ํ๋ก๊ทธ๋จ์ ์ด๋ค ๊ท์น์ ๋ฃ์์ง ์กฐ์ฌ
< ๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ์์์ ๋ฐ์ดํฐ ์ค๋น >
⇒ ์์ ๊ฐ์ ์ ํต์ ์ธ ํ๋ก๊ทธ๋๋ฐ์์์ ๋จ๊ณ ํ์ ์์
a. ์ ๋ฌ๋ฐ์ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ ํ์ธ
b. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง, ์ด๋ป๊ฒ ์ค๋นํ ๊ฒ์ธ์ง, ์ด๋์ ๋ชจ์๊ฒ์ธ์ง ์ฐ๊ตฌ
c. ํ๋ณดํ ๋ฐ์ดํฐ ์ ์ (80%์ ์๊ฐ์ ์ฃผ๋ก ์ฌ๊ธฐ์ ์ฌ์ฉ)
3. ๋ชจ๋ธ ์ ํ : ๋ฐ์ดํฐ์ ๋ฌธ์ ์ ์์ ๋ง๋ ์ฌ๋ฌ ๋ชจ๋ธ ์ค ํ๋ ์ ํ
4. ๋ชจ๋ธ ์์ฑ : ์ ํํ ๋ชจ๋ธ์ ์์ฑ
5. ๋ชจ๋ธ ํ๊ฐ : ์์ฑํ ๋ชจ๋ธ ํ๊ฐ
6. ๋ชจ๋ธ ๊ฐ์ : ํ๊ฐ ๊ฒฐ๊ณผ๊ฐ ๊ธฐ๋์น์ ๋ฏธ์น๋์ง ํ์ธ
a. ๊ธฐ๋์น์ ๋ฏธ์นจ ⇒ ๊ฒฐ๊ณผ ๋ณด๊ณ
b. ๊ธฐ๋์น์ ๋ฏธ์น์ง ๋ชปํจ ⇒ ๋ชจ๋ธ ์ ํ ๋จ๊ณ๋ถํฐ ๋ค์ ์ฌ์ดํด ์์
๋ชจ๋ธ ์์ฑ ์์
: ํ๋ก๊ทธ๋จ ์์์ ํ๋ก๊ทธ๋จ์ด ์์ฑ๋๋ ์์ (ํฐํผ์ปฌํจ, ํ์ด ๋ฐํ์์)


- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
- ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : sklearn, numpy, pandas, matplotlib ๋ฑ
- ๋ฐ์ดํฐ ๋ก๋
- ์ฌ์ ์ ์ค๋น๋ csv ํ์ผ ์ฌ์ฉ
- Sklearn์ ๋ด์ฅ๋ ๋ฐ์ดํฐ ๋ก๋ฉํด ์ฌ์ฉ
- ๋ฐ์ดํฐ ๋ด์ฉ ํ์
- ๋ชฉ์ : ์ง๊ด์ ์ป๊ธฐ ์ํด & ๋ด๊ฐ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ธ์ input ์ฌ์๊ณผ ๋ฐ์ดํฐ๊ฐ ๋์ผํ์ง ํ์ธํ๊ธฐ ์ํด
- Shape : input ์ฌ์ ํ์ธ
- Pandas์ describe(), ๊ธฐ์ ํต๊ณ : ๋ฐ์ดํฐ ๋ด์ฉ ํ์
- Matplotlib ๋ฑ : ์๊ฐํ๋ฅผ ํตํ ๋ฐ์ดํฐ ํ์
- Train, test set ๋ถํ
- ๋ฐฉ๋ฒ : sklearn.train_test_split ํจ์ / numpy ์ฌ๋ผ์ด์ฑ ๋ฑ
- Train set : ๋ชจ๋ธ ํ๋ จ์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์
- Test set : ํ๋ จ๋ ๋ชจ๋ธ์ ํ ์คํธํ๋๋ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์
- Feature Scaling (= ๋ฐ์ดํฐ ์ ๊ทํ)
- : ์ ์ฒด ๋ฐ์ดํฐ๋ค์ด ํฐ ์ซ์, ์์ ์ซ์ ๋ค์ด ํผ์ฒ๋ณ๋ก ์์ฌ ์๋ ๊ฒ์ ์ ๋ถ ๋น์ทํ ํฌ๊ธฐ๋ก ๋ง์ถฐ์ฃผ๋ ์์
- Model object creation⇒ ๋ชจ๋ธ ์์ ์ด๋ ค์ด ์๊ณ ๋ฆฌ์ฆ์ด ๋ด์ฅ๋์ด ์์ด ํจ์์ฒ๋ผ ๋ชจ๋ธ์ ๋ถ๋ฌ์ ์ฌ์ฉํ ๊ฒ
- : ๋ชจ๋ธ ์ค๋ธ์ ํธ (๋ชจ๋ธ ์ธ์คํด์ค) ํ๋ ์์ฑ
- Model train
- : sklearn์ fit()์ด๋ผ๋ ๋ฉ์๋๋ก ํ๋ จ ์งํ
- Model ํ๊ฐ
- : ํ๊ฐ ์งํ ์ถ๋ ฅ ๋ฐ ์๊ฐํ
- Best model ์ ํ
- : ํ๋ฅญํ ๋ชจ๋ธ, ๊ฐ์ฅ ๋ฐ์ดํฐ์ ์ ํฉํ ๋ชจ๋ธ ์ ํํ๋ ๊ณผ์ ์ ๋ฐ๋ณต ์งํ
์ ํ ํ๊ท ๋ชจ๋ธ ์ค๋ช
๋จ๋ณ์ ์ ํํ๊ท (Univariate Linear Regression)
: ํ ๊ฐ์ ๋ณ์๋ก ๊ฒฐ๊ณผ ์์ธก
- ํ๋๋ง ๊ฐ์ง๊ณ ํ๋ ์ด์ ๋ ?
- ์๊ฐํ๋ฅผ ํ๊ธฐ ์ํด (๋ณ์๊ฐ ์ฌ๋ฌ๊ฐ ๋๋ฉด ์๊ฐํ ๋ถ๊ฐ)
- ⇒ ๋ณ์๊ฐ ์๋ฌด๋ฆฌ ๋ง์์ ธ๋, ๋ณ์ ํ๋๊ฐ ์ฆ๋ช ๋๋ฉด ๋๊ฐ์ด ๊ณต์ ์ ์ฉ ๊ฐ๋ฅ
- ⇒ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณ์ ํ๋๋ง์ผ๋ก ์๋ฆฌ๋ฅผ ํ์ ํ, ํ์ฅํด๋๊ฐ๋ฉด ๋จ
- ๋ฐฉ๋ฒ
- $y=wx+b$
- X, y (์ ๋ ฅ๋ฐ์ดํฐ, ๋ ์ด๋ธ)๊ฐ ์ฃผ์ด์ง + w, b๋ ๋ฏธ์ง์
- W, b ๋ฅผ ์ถ์ ํด์ผํจ
- Linear regression ๊ณผ์ : ๋ฐ์ดํฐ ํฌ์ธํธ๋ค์ ์๊ฐํํ์ฌ ๊ทธ ํฌ์ธํธ๋ค์ ๊ฐ์ฅ ์ ํํํ๋ ์ ์ ์ฐพ์๋ด๊ธฐ
- $y=wx+b$
⇒ ๋ฌด์ํ ๋ผ์ธ์ ๊ทธ์ ์ ์๋๋ฐ ์ด ์ค์์ ์ต์ ์ ๋ผ์ธ์ ์ฐพ์์ผํ๋ ๊ฒ
3. ๋น์ฉํจ์ (cost Function)
: ์ต์ ์ ๋ผ์ธ์ด ๋ฌด์์ธ์ง ์ธก์ ํ๋ ๋ฐฉ๋ฒ
- ๋ชฉ์ : ๊ฐ์ค(= ๋ชจ๋ธ)์ ์์ํ์ด ์ผ๋ง๋ ํ๋ ธ๋์ง ์ธก์ ํ๋ ๊ฒ (=์ค์ฐจ์ต์ํํ๋ ์ ์ฐพ๊ธฐ)
- Example
- X1์ผ๋, ๋ชจ๋ธ ์์ธก = ๋ชจ๋ธ ์์ x1์ ๋ฃ์ด ๋์จ ๊ฐ, ์ค์ ๋ฐ์ดํฐ = y1
- ์ค์ฐจ = ์ค์ ๋ฐ์ดํฐ y1 - ๋ชจ๋ธ์ x1์ ๋ฃ์ด ๋์จ ์์ธกํ ๊ฐ = $y-\\hat{y}$
- ๊ณต์
- $$ Minimize \sum_{i=1}^n{(true-prediction)^2} $$
- ์ ๊ณฑ์ ํ๋ ์ด์ ๋ ? : +, - ๋ก ์ค์ฐจ๊ฐ ๋์ค๊ฒ ๋๋ฏ๋ก ์ด๋ฅผ ์์ ๊ธฐ ์ํด
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ? : ์ ๋๊ฐ์ผ๋ก ๋ง๋ค๊ธฐ ⇒ ์ ๊ณฑ๋ณด๋ค ์ ์ฐ๋ ์ด์ ๋ ? : ๋ฏธ๋ถ์ด ์ ์๋๊ธฐ ๋๋ฌธ
- MSE (Mean squared Error) (ํ๊ท ์ ๊ณฑ ์ค์ฐจ)
- $$ MSE = \frac{1}{n} \sum_{i=1}^n(\hat{Y_i} - Y_i) $$
- ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ์์ธกํ ๊ฐ, ์ค์ ๊ฐ์ ์ฐจ์ด ๋ชจ๋๋ฅผ ์ ๊ณฑํ์ฌ ํ๊ท ๋ธ๊ฒ
- MSE๋ฅผ ์ต์ํํ๋ w, b๋ฅผ ์ฐพ๊ธฐ ⇒ w, b๊ฐ ๋์์ ์ต์ํ๊ฐ ๋๋ ์ง์ ์ด MSE๋ฅผ ์ต์ํํ๋ ์ง์ ์
4. ์ ํ ํ๊ท์ ์ ํ๋ ์ธก์ : R2 score (๊ฒฐ์ ๊ณ์)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ : sklearn.metrics.r2_score
- 0 (๋ถ์ ํํจ) ≤ R2 ≤ 1 (์ ํํจ) ⇒ ๋ถ๋ชจ์ ๋ถ์๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ 0
- $$1-\frac{SSE}{SST}$$
- $$= 1 - \frac{์์ธก๊ฐ์ ๋ํ ๋ถ์ฐ์ ํฉ}{๋ถ์ฐ์ ํฉ}$$
- (SST : ํ๊ท ์ผ๋ก ๋ถํฐ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง ⇒ ๋ถ์ฐ)
๋ค๋ณ์ ์ ํํ๊ท (Multivariate Linear Regression)
: ๋ณ์๊ฐ ์ฌ๋ฌ๊ฐ (X1, X2, X3 … )
1. ์ฐจ์
⇒ ๋ฉด ์ฃผ์์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ค์ด ๊ณต๊ฐ์ ์ฒ์ ธ ์๋๋ฐ ๊ทธ ์ฌ์ด์ MSE๊ฐ ์ต์๊ฐ ๋๋ ๋ฉด์ ์ฐพ์๋ด๋ ๊ฒ
⇒ 3์ฐจ์ ์ด์์ด ๋๋ฏ๋ก ์ ์ด ์๋ ๋ฉด์ผ๋ก ํํ
์ค์ต - ์ ํ ํ๊ท ๋ชจ๋ธ : ๋น๋จ๋ณ ์งํ๋ฅ ์์ธก
๋จ๋ณ์ ์ ํํ๊ท
dia = datasets.load_diabetes() # ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ์ค๊ธฐ
print(dia.DESCR) # ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง ์ถ๋ ฅ
dia.feature_names # ํผ์ฒ ์ด๋ฆ๋ค ์ถ๋ ฅ
dia.data.shape # shape ํ์ธ : (442, 10)
dia.target.shape # ํ๊ฒ shape ํ์ธ : (442,) 442๊ฐ์ ๊ฐ ๋ ์ฝ๋์ ๋ํ ์ ๋ต์ด ๋งคํ๋จ
# ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๋ฐ๊พธ์ด ํ์ธ
df = pd.DataFrame(dia.data, columns=dia.feature_names) # ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ํ์ธ
df.head() # 5๊ฐ์ ํ, ์ ์ฒด ์ด ๊ฐ๋จํ ํ์ธ ๊ฐ๋ฅ
๋ฐ์ดํฐ ์์ฑ
# ์๊ฐํ๋ฅผ ์ํด ๋จ๋ณ์ ์ ํํ๊ท๋ฅผ ํด์ผํ๋๋ฐ, ๊ทธ๋ฌ๋ ค๋ฉด ํผ์ฒ๋ฅผ ํ๋๋ง ๊ณ ๋ฆ
# bmi๋ก ์ค์ต
dia_X = df["bmi"].values
dia_X.shape # (442,) : ๋ฒกํฐ ํํ์ => ์ฌ์ดํท๋ฐ์ ๋ฐ์ดํฐ๋ 2์ฐจ์ ๋ฐฐ์ด ํํ๋ก ๋ง๋ค์ด์ค์ผํจ => reshape
# reshape : 2์ฐจ์ ๋ฐฐ์ด ํํ๋ก ์์ฑ
dia_X = df["bmi"].values.reshape(-1,1) #reshape(442,1) (o)
# ํ๋ จ์
, ๊ฒ์ฆ์
๋ถํ : ์ฌ๋ผ์ด์ฑ ์ด์ฉ
dia_X_train = dia_X[:-20] # ๋ค์์ 20๋ฒ์งธ ๊น์ง,
dia_X_test = dia_X[-20:] # ๋ค์์ ๋ถํฐ 20๋ฒ์งธ
dia_X_train.shape, dia_X_test.shape # (422,1),(20,1)
dia_y_train = dia.target[:-20] # (422,)
dia_y_test = dia.target[20:] #(20,)
Sklearn model ์ด์ฉ
regr = linear_model.LinearRegression() # ๊ดํธ ํ์!, ์๋๋ฉด ์ธ์คํด์ค ์์ฑ์ด ์๋๋๊ฒ
regr.fit(dia_X_train, dia_y_train) # ๋ชจ๋ธ ํ์ต
regr.coef_ # ๊ธฐ์ธ๊ธฐ
regr.intercept_ # ์ ํธ
y_pred = regr.predict(dia_X_test) # ๊ฒ์ฆ ์
์ ๋ํ ์์ธก๊ฐ
# ์์ธก๊ฐ, ์ ๋ต๊ฐ ์ฌ์ด์ ์๊ฐํ๋ก ์์ธก์ด ์๋์๋์ง ํ์ธ
plt.scatter(dia_X_test, dia_y_test, label = "True Value")
plt.plot(dia_X_test, y_pred, color='r', label = "Predict")
plt.xlabel("bmi")
plt.ylabel("Progress")
plt.legend()
# R2 ๊ณ์ฐ
r2_score(dia_y_test, y_pred) # 0.4725... : ๋์ง ์์
# MSE
mean_squared_error(dia_y_test, y_pred)
๋ค๋ณ์ ์ ํํ๊ท : bmi, bp ๋๊ฐ์ง ๋ณ์ ์ด์ฉ
# bmi, bp ๋ ํผ์ฒ๋ง ๊ฐ์ ธ์ค๊ธฐ
dia_X = df[["bmi", "bp"]].values # reshape ํ์์์ 2๊ฐ์ ํผ์ฒ์ด๋ฏ๋ก ์ด๋ฏธ ํ๋ ฌ์
dia_X.shape #(442,2)
# ํ๋ จ์
, ๊ฒ์ฆ์
๋ถํ : ์ฌ๋ผ์ด์ฑ ์ด์ฉ -> ์์ ๋์ผ
dia_X_train = dia_X[:-20] # ๋ค์์ 20๋ฒ์งธ ๊น์ง,
dia_X_test = dia_X[-20:] # ๋ค์์ ๋ถํฐ 20๋ฒ์งธ
dia_X_train.shape, dia_X_test.shape # (422,2),(20,2)
dia_y_train = dia.target[:-20] # (422,)
dia_y_test = dia.target[20:] #(20,)
# ๋ชจ๋ธ ํ๋ จ ๋ฐ ์์ธก
regr = linear_model.LinearRegression() # ๊ดํธ ํ์!, ์๋๋ฉด ์ธ์คํด์ค ์์ฑ์ด ์๋๋๊ฒ
regr.fit(dia_X_train, dia_y_train) # ๋ชจ๋ธ ํ์ต
regr.coef_ # ๊ธฐ์ธ๊ธฐ
regr.intercept_ # ์ ํธ
y_pred = regr.predict(dia_X_test) # ๊ฒ์ฆ ์
์ ๋ํ ์์ธก๊ฐ
# R2 ๊ณ์ฐ
r2_score(dia_y_test, y_pred) # 0.465... : ๋ ์์ข์์ง
# MSE
mean_squared_error(dia_y_test, y_pred)
๋ค๋ณ์ ์ ํํ๊ท : ์ ์ฒด ํผ์ฒ๋ฅผ ์ด์ฉ
# bmi, bp ๋ ํผ์ฒ๋ง ๊ฐ์ ธ์ค๊ธฐ
dia_X = df.values
dia_X.shape # (442,10) : reshape ํ์์์
# ํ๋ จ์
, ๊ฒ์ฆ์
๋ถํ : ์ฌ๋ผ์ด์ฑ ์ด์ฉ -> ์์ ๋์ผ
dia_X_train = dia_X[:-20] # ๋ค์์ 20๋ฒ์งธ ๊น์ง,
dia_X_test = dia_X[-20:] # ๋ค์์ ๋ถํฐ 20๋ฒ์งธ
dia_X_train.shape, dia_X_test.shape # (422,10),(20,10)
dia_y_train = dia.target[:-20] # (422,)
dia_y_test = dia.target[20:] #(20,)
# ๋ชจ๋ธ ํ๋ จ ๋ฐ ์์ธก
regr = linear_model.LinearRegression() # ๊ดํธ ํ์!, ์๋๋ฉด ์ธ์คํด์ค ์์ฑ์ด ์๋๋๊ฒ
regr.fit(dia_X_train, dia_y_train) # ๋ชจ๋ธ ํ์ต
regr.coef_ # ๊ธฐ์ธ๊ธฐ
regr.intercept_ # ์ ํธ
y_pred = regr.predict(dia_X_test) # ๊ฒ์ฆ ์
์ ๋ํ ์์ธก๊ฐ
# R2 ๊ณ์ฐ
r2_score(dia_y_test, y_pred) # 0.58.... : ๊ทธ๋ฅ ์๊น๋ณด๋จ ์ข์์ง
# MSE
mean_squared_error(dia_y_test, y_pred)
KNN ์๊ณ ๋ฆฌ์ฆ ์ค๋ช
KNN (K-Nearest Neighbors, K ์ต๊ทผ์ ์ด์)
- ์๋ ๋ฐฉ๋ฒ
- k๊ฐ์ ์ ํ
- ์์ธกํ๊ณ ์ํ๋ ๋ฐ์ดํฐํฌ์ธํธ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
- ํธ๋ ์ด๋์ ์์ ์์ธกํ ํฌ์ธํธ์ ๊ฐ๊น์ด์๋ K๊ฐ์ ๋ฐ์ดํฐํฌ์ธํธ ์ ํ
- ๋ถ๋ฅ, ํ๊ท์ ๋ฐ๋ผ ๊ฐ ์์ธก
- ๋ถ๋ฅ : ๋จ์ํ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์๋ค์ ๋ ์ด๋ธ ์ค ๊ฐ์ฅ ๋ง์ ๋ ์ด๋ธ๋ก ๋ถ๋ฅ
- ํ๊ท : ์ด์ ๊ฐ๋ค์ ํ๊ท
- ํน์ง
- ์ฅ์ : ์ฌํ / ์ดํดํ๊ธฐ ์ฌ์ด ๋ชจ๋ธ
- ๋จ์
- ๋ฐ์ดํฐ๊ฐ ์ปค์ง ์๋ก ๋๋ ค์ง
- ⇒ ์ด์ : ๋ค์ฐจ์์ผ๋ก ๊ฐ ์๋ก ๋ชจ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ค ๊ณ์ฐํ๊ณ ๋ถ๋ฅํ๋ ์์ด ๋๋ ค์ง๊ธฐ ๋๋ฌธ์
- ์ด์์น์ ๊ฒฐ์ธก์น์ ์ํฅ์ด ํฌ๋ค (= ์๋ฑํ๊ฒ ๋ถ๋ฅ๋ ํ๋ฅ ์ด ํฌ๋ค)
- K ๊ฐ์ด ๋งค์ฐ ์ค์ํ๊ฒ ์์ฉ๋จ
- ๊ฑฐ๋ฆฌ ๊ณ์ฐ ๋ฐฉ๋ฒ : ํผํ๊ณ ๋ผ์ค ์ ๋ฆฌ์ ์ํ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
$$ d(p,q) =d(q,p)\\ = \sqrt{(q_1-p_1)^2 + (q_2-p_2)^2 + ... +(q_n-p_n)^2 }\\= \sqrt{\sum_{i=1}^n (q_i - p_i)^2} $$
์ค์ต - KNN : ๋ถ๊ฝ ๋ฐ์ดํฐ ๋ถ๋ฅ
๋ถ๊ฝ ๋ฐ์ดํฐ ์๊ฐ
- Dataset : sklearn์ iris dataset
- ํผ์ฒ : ๊ฝ๋ฐ์นจ ๊ธธ์ด, ๊ฝ๋ฐ์นจ ๋๋น, ๊ฝ์ ๊ธธ์ด, ๊ฝ์ ๋๋น
- ํ : 150
- ํ๊ฒ : ๊ฝ์ ์ข ๋ฅ (Setosa, verslcolor, virginica 3์ข ๋ฅ)
๋ชจ๋ธ ์ฝ๋
neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
- N_neighbors : ์ด์ ๊ฐ์
- Weights : ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ ๊ฒ์ธ๊ฐ
- Uniform : ๋ชจ๋ ์ด์์ ๊ฐ์ค์น๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธ → ๊ฑฐ๋ฆฌ๋ ์๊ดํ์ง ์๋๊ฒ
- Distance : ์ด์์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋น๋กํ๊ฒ ๊ฐ์ค์น ์กฐ์ → ๋จผ ๊ฒ์ ๊ฐ์ค์น ์ ์
๋ฐ์ดํฐ ์
from sklearn.datasets import load_iris
iris = load_iris() # ๋์
๋๋ฆฌ ํํ๋ก ํค์ ๊ฐ ๋ฐ์ดํฐ๋ค์ด ์์
# ์ฃผ์ : ํ๊ฒ ๋ฐ์ดํฐ๊ฐ 0 1 2 ์์ผ๋ก ์์ด์ง ์๊ณ ๋์ด์์ -> ์์ด์ผํจ
# ์์์ผ๋ฉด ๊ฒ์ฆ์ 2๋ฒ๋ง ํ๊ณ ํ๋ จ์ 0 1๋ก๋ง ํ๋ จ๋จ
iris.data.shape #(150,4)
iris.feature_names # ํผ์ฒ ์ด๋ฆ
iris.target_names # ํ๊ฒ ์ข
๋ฅ
X = iris.data[:,:2] # sepal length, sepal width ๋๊ฐ๋ง ์ฌ์ฉ
y = iris.target
X.shape, y.shape #(150,2) (150,)
# train, test ์
์ผ๋ก ๋ถ๋ฅ
from sklearn.model_selection import train_test_split
# test set : 20% / random state : 0
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size =0.2, random_state = 0)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
# (120,2) (30,2) (120,) (30,)
# ์ฌ์ดํท๋ฐ์ ๋ฐ์ดํฐ์
์ ์ ์ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ ์ผ์ด ์๋๋ฐ
# ์๋ฌ๊ฐ ๋๋ค๋ฉด ๊ฑฐ์ ๋ฌด์กฐ๊ฑด shape๊ฐ ์๋ชป ๋์ด์์ด์์ด๋ฏ๋ก shape๋ฅผ ์ ํ์ธํ์
KNN object ์์ฑ ๋ฐ ํ๋ จ
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=15, weights='uniforn')
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
์์ธก์ ์ ํ๋ ํ๊ฐ
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred) #0.666666
์๊ฐํ
# ๋ถ๋ฅ๋๊ฒ์ ์์ผ๋ก ํ์ํ์ฌ 2์ฐจ์ ๊ณต๊ฐ์์ 3๊ฐ๋ฅผ ํ์ธํ ์ ์์
import matplotlib.pyplot as plt
X_train[y_train==0] # ํ๊ฒ์ด 0์ธ๊ฒ๋ง ๊ณจ๋ผ์ค
# ๋ฐฉ๋ฒ 1
plt.scatter(X_train[y_train==0,0], X_train[y_train==0,1])
plt.scatter(X_train[y_train==1,0], X_train[y_train==1,1])
plt.scatter(X_train[y_train==2,0], X_train[y_train==2,1])
# ๋ฐฉ๋ฒ 2
for i in range(3):
plt.scatter(X_train[y_train==i,0], X_train[y_train==i,1])
plt.legend()
# ํ๋ ์ ํํด์ ์ด๊ฒ ์ฌ๋ฐ๋ฅด๊ฒ ์์ธก์ด ๋๋๊ฑด์ง ํ์ธํ๋ ์๊ฐํ
# 20๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๊ณจ๋ผ์ ํด๋น ์์น์ x ํ์๋ก ๊ทธ๋ ค์ค
# 20๋ฒ์งธ ๋ฐ์ดํฐ ์ฃผ์์ ์ด๋ค ๋ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง ํ์ธ ๊ฐ๋ฅ => 2๋ฒ
plt.plot(X_test[20,0], X_test[20,1], cr='r', marker='x', markersize = 20)
clf.predict(X_test[20:21]) # ์์ธกํ ๊ฐ์ด ์ถ๋ ฅ๋จ => 2๋ฒ
Confusion Matrix (ํผ๋ํ๋ ฌ)
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
import seaborn as sns
plt.figure(figsize=(5,4))
ax = sns.headmap(cm, annot=True, fmt='d')
ax.set_title("confusion matrix)
ax.set_ylable("True")
ax.set_xlable("Predicted")
# ์ด๋ค ์ข
์ผ๋ก ๋ช๊ฐ๋ฅผ ๋ง์ท๋์ง, ์ด๋ค ์ข
์ผ๋ก ๋ช๊ฐ๋ฅผ ํ๋ ธ๋์ง ๋ฑ์ ํ์ธ ๊ฐ๋ฅ
๊ฒฐ์ ๋๋ฌด (Decision Tree) ์๊ณ ๋ฆฌ์ฆ ์ค๋ช
์ด ๋ชจ๋ธ์ด ์ค์ํ ์ด์
: ์ด ๋ชจ๋ธ ๊ธฐ๋ฐ์ผ๋ก ์ข์ ๋ชจ๋ธ๋ค์ด ๋ง์ด ๋ง๋ค์ด์ง๊ณ ์๊ธฐ ๋๋ฌธ
๊ฒฐ์ ๋๋ฌด ํ์ ๋ฐ ํน์ง
- ํ์ : ์ด์งํธ๋ฆฌ ํ์
- Tree ์ธ ์ด์ : ๋๋ฌด๋ฅผ ๋ฝ์ ๋ฟ๋ฆฌ๋ฅผ ์์ชฝ์ผ๋ก ํด๋์ ํํ
- ๊ตฌ์ฑ
- ๋งจ ์์ชฝ : root
- ๋งจ ์๋์ชฝ(๋ถ๋ฅ๊ฐ) : leaf node
- ์ง๋ฌธ๋ค(test) : node
- Test ๊ฒฐ๊ณผ : branch
- ์ฅ์
- ํ์ดํธ ๋ฐ์ค ๋ชจ๋ธ : ์ ์ด ๋ชจ๋ธ์ด ์ด๋ ๊ฒ ์์ธกํ๋์ง ํ์ธํ ์ ์์
- → ๋ณดํต ๋ค๋ฅธ ๋ชจ๋ธ์ ๊ฒฝ์ฐ์๋ ์ ๊ทธ๋ ๊ฒ ๋์๋ ์ง ์ค๋ช ํ๊ธฐ ํ๋ค๋ค.
- ๋ฐ์ดํฐ ํ๋ฆฌํ๋ก์ธ์ฑํ ํ์ ์์
- ๋จ์
- ๊ณผ์ ํฉ ๋๊ธฐ ์ฌ์ (: ์์ธก์ ์๋๋ ๊ฒ์ฆ, ์ค์ ๋ฐ์ดํฐ์ ์์ ์ ๋ง์ง ์์)
- ํ๋ จ ๋ฐ์ดํฐ์ ์์ ๋ณํ์๋ ๋งค์ฐ ๋ฏผ๊ฐํจ
๊ฒฐ์ ๋๋ฌด ๋ฐฉ๋ฒ
: ์ํธ๋กํผ๊ฐ ๋์ ์ํ → ๋ฎ์ ์ํ๊ฐ ๋๋๋ก ๋ฐ์ดํฐ๋ฅผ ํน์ ์กฐ๊ฑด์ ์ฐพ์ ๋๋ฌด ๋ชจ์์ผ๋ก ๊ตฌ๋ถํด ๋๊ฐ
- ์ด๋ค ์กฐ๊ฑด ๋ฐ ๋ฒ์์ ๋ํ ๋ต์ผ๋ก yes, no๋ฅผ ์ ํด๊ฐ
- ์กฐ๊ฑด ๋ฐ ๋ฒ์๋ฅผ ์ค์ฌ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅ
์ง๋ฌธ ๊ธฐ์ค
- If else๋ก ๋ง๋ค ์ ์์ง๋ง ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฉ ํ์ง ์์
- ์ต์ ์ ์กฐ๊ฑด๋ค์ด ๋ฐฐ์น๋๋๋ก ์ ์ ํ ํ์ตํ์ฌ ์ค์ค๋ก ๋ฐฐ์น
์ข์ ๊ฒฐ์ ๋๋ฌด ๋ชจ๋ธ
: ๊ฐ์ฅ ์ต์ ์ ์กฐ๊ฑด๋ค์ด ๋ฐฐ์น๊ฐ ๋ ๊ฒ
์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ
→ ๋ณ์ข ์ด ๋ง์
- ID3
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ
- ์ ๋ณด์ด๋ ์ด์ฉํด ํธ๋ฆฌ ๊ตฌ์ฑ
- ์ฌ์ดํท๋ฐ์ ๋ด์ฅ๋จ
- CART
- ID3์ ๊ฑฐ์ ๋น์ทํ ์๊ณ ๋ฆฌ์ฆ
- ์ง๋๋ถ์๋๋ฅผ ์ด์ฉํ ํธ๋ฆฌ ๊ตฌ์ฑ
- ์ฌ์ดํท๋ฐ์ ๋ด์ฅ๋จ
- C4.5, C5.0
- ID3๋ฅผ ๊ฐ์ ํ ์๊ณ ๋ฆฌ์ฆ
- CHAID, MARS
์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ค
[ ์ํธ๋กํผ (Entropy)]
- ์๋ฏธ : ์ฃผ์ด์ง ๋ฐ์ดํฐ ์งํฉ์ ํผ์ก๋, ์ผ๋ง๋ ๋ถ๋ฅ๋์ง ์๊ณ ์์ฌ์๋์ง ⇒ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์์ง ์์ ์ ๋ณด์ ์
- ํน์ง
- ์ํธ๋กํผ๊ฐ ๋๋ค : ๋ฐ์ดํฐ ์งํฉ์ ์๋ก ๋ค๋ฅธ ์ข ๋ฅ์ ๋ ์ฝ๋๋ค์ด ์์ฌ์์ (= ๋ถ๋ฅ๊ฐ ์๋จ)
- ์ํธ๋กํผ๊ฐ ๋ฎ๋ค : ๊ฐ์ ์ข ๋ฅ์ ๋ ์ฝ๋๋ค์ด ์์ฌ์์
- ๋ฒ์ : 0 (๊ฐ์ฅ ํผํฉ๋๊ฐ ๋ฎ์ ์ํ) ~ 1 (๊ฐ์ฅ ํผํฉ๋๊ฐ ๋์ ์ํ)
- ํผ์ก๋, ์ ๋ณด์ ์์ ๋น๋กํจ : ๊น๋ํ๊ฒ ๋ถ๋ฅ๋์ด์์ผ๋ฉด ๋ฐฐ์ธ๊ฒ ์์
- ๊ณต์ : $$ Entropy = -\sum_{i=1}^{m} p_ilog_2^{(p_i)}\\ p_i = \frac{freq(c_i, s)}{|s|} $$
(S: ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ค์ ์งํฉ, C: ๋ ์ฝ๋(ํด๋์ค) ๊ฐ๋ค์ ์งํฉ, freq(Ci,S): S์์ Ci์ ์ํ๋ ๋ ์ฝ๋์ ์, |S|: ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ค์ ์งํฉ์ ๋ฐ์ดํฐ ๊ฐ์)
4. ์ ๋ณด ์ด๋(information gain) : ์ฐ๋ฆฌ๊ฐ ์์คํ ์ ํต๊ณ๋ฅผ ์๊ฒ๋์ด ๊ฐ์ํ๋ ์ํธ๋กํผ
$$Information Gain = Entropy(Parent) – (weight) * Entropy(Child)$$
์ค์ต - Decision Tree ๋ชจ๋ธ ์์ฑ ๋ฐ ์๊ฐํ : ๋ถ๊ฝ ๋ฐ์ดํฐ ๋ถ๋ฅ
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ์คํ๋ฆฟ
# ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
from sklearn.datasets import load_iris
iris = load_iris()
# train_test_split
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)
decision tree ๋ชจ๋ธ : max_depth = 2
from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=2, criterion='entropy') # ๊ธฐ๋ณธ์ gini
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy_score(y_test, y_pred) #0.9555555555555556
# ์ด์ง ํธ๋ฆฌ ์๊ฐํ -> ํ์ดํธ๋ฐ์ค ๋ชจ๋ธ
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(25,20))
# _(์ธ๋์ค์ฝ์ด)๋ฅผ ํ๋ ์ฃผ๋ ์ด์ : ๋ฐํ๊ฐ์ ๋ฐ๊ฒ ๋๋๋ฐ, ๋ณ์๋ก ์ด๊ฑธ ๋ฐ์ง ์์ผ๋ฉด ์ง์ ๋ถํ๊ฒ ์ฐํ๊ฒ๋๋ฏ๋ก
# ๋ฐํ๊ฐ์ ์ํ๋ ์ค ํ๊ณ ์ ํจ
# plot_tree ๋ผ๋ ๋ฉ์๋๊ฐ ์ ๊ณต๋จ
_ = tree.plot_tree(clf, _names=iris.feature_names, ss_names=iris.target_names, filled=True)

max_depth๋ฅผ ์ค์ ํ์ง ์์์ ๋
# ๋ชจ๋ธ ์ค์
# NONE ์ผ๋ก ์ค์ ์, ์ ํ์ ๋์ง ์๋ ๊ฒ
clf = tree.DecisionTreeClassifier(max_depth=None)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy_score(y_test, y_pred) # 0.9333333333333333
# ์๊ฐํ
fig = plt.figure(figsize=(25,20))
_ = tree.plot_tree(clf,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True)
