240604 Today I Learn
๋ก์ง์คํฑ ํ๊ท ์ด๋ก
๐ก ๋ก์ง์คํฑ ํ๊ท
๋ ๋ฆฝ ๋ณ์์ ์ ํ ๊ฒฐํฉ์ ์ด์ฉํ์ฌ ์ฌ๊ฑด์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์์ธกํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํต๊ณ ๊ธฐ๋ฒ์ผ๋ก ๊ฐ์ค์น ๊ฐ์ ์๋ค๋ฉด X๊ฐ์ด ์ฃผ์ด์ก์ ๋ ํด๋น ์ฌ๊ฑด์ด ์ผ์ด๋ ์ ์๋ P์ ํ๋ฅ ์ ๊ณ์ฐํ๋ค. ์ด๋, ํ๋ฅ 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ณด๋ค ๋์ผ๋ฉด ์ฌ๊ฑด์ด ์ผ์ด๋จ(P(Y) = 1), ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ๊ฑด์ด ์ผ์ด๋์ง ์์(P(Y) = 0)์ผ๋ก ํ๋จํ์ฌ ๋ถ๋ฅ ์์ธก์ ์ฌ์ฉํ๋ค.
- ๋ก์ง์ ๊ฒฝ์ฐ ์ด๋ค ๊ฐ์ ๊ฐ์ง๋๋ผ๋ ๋ฐ๋์ ํน์ ์ฌ๊ฑด์ด ์ผ์ด๋ ํ๋ฅ ์ 0~1๋ก ๋ง๋ค์ด์ค๋ค.
- ๋ก์ง์ ๋ค์๊ณผ ๊ฐ์ด ํด์๋๋ค.
→ X์ ๊ฐ์ด 1๋งํผ ์ฆ๊ฐํ ๋, ์ค์ฆ๋น๋ e์ w1์น ๋งํผ ์ฆ๊ฐํ๋ค.
๋ถ๋ฅ ํ๊ฐ์งํ
๐ก ์ ํ๋ (Accuracy)
์ ์ฒด ์ค ์์ธก์ด ์ค์ ๊ฐ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ (์ฐธ์ธ ๊ฒฝ์ฐ ์ฐธ์ผ๋ก, ๊ฑฐ์ง์ธ ๊ฒฝ์ฐ ๊ฑฐ์ง์ผ๋ก ์์ธก์ด ๋ ๊ฒฝ์ฐ → TP / TN)
- Y๊ฐ์ด unbalanceํ ๊ฒฝ์ฐ ์ ๊ธฐ๋ฅ์ ํ์ง ๋ชปํจ
- Y ๋ฒ์ฃผ์ ๋น์จ์ ๋ง์ถฐ์ฃผ๊ฑฐ๋ ํ๊ฐ ์งํ๋ฅผ f1 score์ ์ฌ์ฉํด ์ด๋ฅผ ๋ณด์ํจ
- `from sklearn.metrics import accuracy_score`๋ฅผ ์ฌ์ฉ
๐ก F1 - Score
์ ๋ฐ๋์ ์ฌํ์จ์ ์กฐํ ํ๊ท
๊ฐ๋ฅํ ๊ฐ์ฅ ๋์ ๊ฐ์ 1.0์ผ๋ก ์๋ฒฝํ ์ ๋ฐ๋์ ์ฌํ์จ์ ๋ํ๋ด๋ฉฐ, ๊ฐ๋ฅํ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ์ ๋ฐ๋๋ ์ฌํ์จ์ด 0์ธ ๊ฒฝ์ฐ 0์ด๋ค.
- ํ๋์ ์ธก์ ํญ๋ชฉ์์ ์ ๋ฐ๋์ ์ฌํ์จ์ ๋์นญ์ ์ผ๋ก ๋ํ๋
- `from sklearn.metrics import f1_score` ์ฌ์ฉํด ๊ณ์ฐ
๋ก์ง์คํฑ ํ๊ท ์ค์ต - ํ์ดํ๋ ์์กด๋ฌธ์
๐งฎ ์ฌ์ฉ ํจ์
๋๋ณด๊ธฐ
# attribute๋ฅผ ์ถ๋ ฅํ๋ ํจ์
def get_att(x):
#x๋ชจ๋ธ์ ๋ฃ๊ธฐ
print(f'ํด๋์ค ์ข
๋ฅ : {x.classes_}')
print(f'๋
๋ฆฝ๋ณ์ {x.n_features_in_}๊ฐ')
print(f'๋ค์ด๊ฐ ๋
๋ฆฝ๋ณ์(x)์ ์ด๋ฆ {x.feature_names_in_}')
print(f'coef : {x.coef_}')
print(f'bias : {x.intercept_}')
# ๋ชจ๋ธ ํ๊ฐ
def get_metrics(true, pred):
print(f'์ ํ๋ : {accuracy_score(true, pred):.4f}')
print(f'f1-score : {f1_score(true, pred) :.4f}')
# ๋ด๊ฐ ๋ง๋ ..? ํจ์
def get_metrics(model, X, y_true):
model.fit(X, y_true)
pred = model.predict(X)
print(f'์ ํ๋ : {accuracy_score(y_true, pred):.4f}')
print(f'f1-score : {f1_score(y_true, pred) :.4f}')
1์ฐจ ๋ชจ๋ธ: Fare
# ํจ์ ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ๋ชจ๋ธ์ ๊ตฌ์กฐ ๋ฃ๊ธฐ
from sklearn.linear_model import LogisticRegression
model_lor = LogisticRegression()
# ๋ณ์ ์ง์
# X๋ณ์: Fare, Y๋ณ์: Survived
X1 = titanic[['Fare']]
y_true = titanic[['Survived']]
# ๋ชจ๋ธ ์ ํฉ
model_lor.fit(X1, y_true)
2์ฐจ ๋ชจ๋ธ: Pclass, Sex, Fare
# ๋ชจ๋ธ์ ๊ตฌ์กฐ ๋ฃ๊ธฐ
model_lor_2 = LogisticRegression()
#Y(Surivved): ์ฌ๋ง
#X(์์นํ): Fare
#X(๋ฒ์ฃผํ): Plcass(์ข์๋ฑ๊ธ), Sex
# ์ฑ๋ณ์ ๊ฒฝ์ฐ ๋ฒ์ฃผํ ๋ณ์์ด๋ ๋๋ฏธ๋ณ์๋ก ์ธ์ฝ๋ฉ์ด ํ์
# ๋ฌธ์ํ -> ๋๋ฏธ๋ณ์๋ก ๋ฐ๊พธ๊ธฐ
def get_sex(x):
if x == 'female':
return 0
else:
return 1
titanic['Sex_enc'] = titanic['Sex'].apply(get_sex)
# ๋ณ์ ์ง์
X2 = titanic[['Pclass','Sex_enc','Fare']]
y_true2 = titanic['Survived']
# ๋ชจ๋ธ ์ ํฉ
model_lor_2.fit(X2,y_true2)
1์ฐจ๋ชจ๋ธ vs. 2์ฐจ๋ชจ๋ธ
- 1์ฐจ๋ชจ๋ธ๋ณด๋ค 2์ฐจ๋ชจ๋ธ์ ์ ํ๋์ F1-score๊ฐ ๋์ ๋๊ฒ ๋๋ค → 2์ฐจ ๋ชจ๋ธ์ด 1์ฐจ ๋ชจ๋ธ๋ณด๋ค ์ข์ ๋ชจ๋ธ์ด๋ค.
# X๋ณ์๊ฐ Fare
get_att(model_lor)
get_metrics(model_lor, X1, y_true)
# X๋ณ์๊ฐ Fare, Pclass, Sex
get_att(model_lor_2)
get_metrics(model_lor_2, X2, y_true2)
predict vs. predict_proba
- predict๋ ์ ํฉ๋ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์์ธก๊ฐ์ ๊ตฌํ๊ณ , predict_proba๋ ์ ํฉ๋ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก P(Y=0)๊ณผ P(Y=1) ๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ค์๋งํด, predict_proba์์๋ ํ ๊ฐ์ ๋ํด ๋๊ฐ์ ๊ฐ์ด ์ถ๋ ฅ๋๋๋ฐ, ํ๋ฅ ์ด ๋ ๋์ ์ชฝ์ Y๊ฐ์ด predict์์ ์ถ๋ ฅ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
# ์ ํฉ๋ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์์ธก๊ฐ์ ๊ตฌํ๊ธฐ
model_lor_2.predict(X2)
# ๊ฐ ๋ฐ์ดํฐ๋ณ Y=1์ธ ํ๋ฅ ๋ฝ์๋ด๊ธฐ(์์กดํ ํ๋ฅ )
model_lor_2.predict_proba(X2)
์ ํ ํ๊ท vs. ๋ก์ง์คํฑ ํ๊ท
์ ํํ๊ท (์์ธก) | ๋ก์ง์คํฑ ํ๊ท (๋ถ๋ฅ) | |
๊ณตํต์ | 1. ๋ชจ๋ธ ์์ฑ์ด ์ฌ์ 2. ๊ฐ์ค์น(ํน์ ํ๊ท๊ณ์)๋ฅผ ํตํ ํด์์ด ์ฌ์ด ์ฅ์ ์ด ์์ 3. X๋ณ์์ ๋ฒ์ฃผํ, ์์นํ ๋ณ์ ๋ ๋ค ์ฌ์ฉ ๊ฐ๋ฅ |
|
Y(์ข ์๋ณ์) | ์์นํ | ๋ฒ์ฃผํ |
ํ๊ฐ์ฒ๋ | Mean Square Error R Square |
Accuracy F1 - score |
sklearn ๋ชจ๋ธ ํด๋์ค | sklearn.linear_model.linearRegression | sklearn.linear_model.LogistricRegression |
sklearn ํ๊ฐ ํด๋์ค | sklearn.metrics.mean_squared_error, skelarn.metrics.r2_score |
sklearn.metrics.accuracy_score, skelearn.metrics.f1_score |