๋ณธ ๋ด์ฉ์ ํธ์ฆ์จ ๋จธ์ ๋ฌ๋2 ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ์์ผ๋ฉฐ, ์๋ต๋ ๋ด์ฉ์ด๋ ์ถ๊ฐ๋ ๋ด์ฉ์ด ์์ต๋๋ค.
[3.2] SGDClassifier
ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์ด์ฉํ์ฌ ์ ํ ๋ชจ๋ธ์ ๊ตฌํ
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(max_iter=1000, tol=1e-3, random_state=42)
sgd_clf.fit(X_train, y_train)
[Tip]
SGDClassifier๋ ํ๋ จํ๋ ๋ฐ ๋ฌด์์์ฑ์ ์ฌ์ฉ. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌํํ๊ธฐ ์ํด์ random_state ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ผํจ
[3.3] ์ฑ๋ฅ ์ธก์ ๋ฐฉ๋ฒ
๊ต์ฐจ ๊ฒ์ฆ
- ๊ต์ฐจ ๊ฒ์ฆ์ด๋ ์ฝ๊ฒ ๋งํด ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ๋๋๊ณ ์ฌ๋ฌ ๋ชจ๋ธ์ ํ์ตํ์ฌ ์ฑ๋ฅ์ ํ๊ฐํ๋ ๋ฐฉ๋ฒ์ด๋ค
- ์ฌ์ดํท๋ฐ์์๋ ๊ต์ฐจ ๊ฒ์ฆ์ ๋ ์ฝ๊ฒ ํ ์ ์๋ API์ธ cross_val_score()์ ์ ๊ณตํ๋ค.
from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf, X_train, y_train, cv = 3, scoring = "accuracy")
- cross_val_score(estimator, X, y, scoring=ํ๊ฐ์งํ, cv=๊ต์ฐจ ๊ฒ์ฆ ํด๋ ์)
- ์ฅ์
- ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ํ๋ จ ์ํฌ ์ ์๋ค.
- ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ํ๊ฐ์ ํ์ฉํ ์ ์๋ค.
- ๋จ์
- Iteration ํ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ ํ๋ จ/ํ๊ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
์ค์ฐจ ํ๋ ฌ
- ๋ถ๋ฅ๊ธฐ์ ์ฑ๋ฅ์ ํ๊ฐํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ Confusion Matrix(์ค์ฐจ ํ๋ ฌ)๋ฅผ ์กฐ์ฌํ๋ ๊ฒ์ด๋ค
- ์๋ฅผ ๋ค์ด ์ซ์ 5์ ์ด๋ฏธ์ง๋ฅผ 3์ผ๋ก ์๋ชป ๋ถ๋ฅํ ํ์๋ฅผ ์ธ๋ ๊ฒ์ด๋ค.
- ์ค์ฐจ ํ๋ ฌ์ ๋ง๋ค๋ ค๋ฉด ์ฐ์ ์ค์ ํ๊ฒ๊ณผ ๋น๊ตํ ์ ์๋๋ก ์์ธก๊ฐ์ ๋ง๋ค์ด์ผ ํจ.
- cross_val_predict() : k-๊ฒน ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ์ง๋ง ํ๊ฐ ์ ์๋ฅผ ๋ฐํํ์ง ์๊ณ ๊ฐ test fold์์ ์ป์ ์์ธก์ ๋ฐํํ๋ค.
# 5๊ฐ ๋ง๋์ง ์๋์ง ๋ถ๋ฅํ๋ ์์
from sklearn.model_selection import cross_val_predict
y_train_predict = cross_val_predict(sgd_clf, X_train, y_train_5, cv = 3)
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train, y_train_predict)
- ์ค์ฐจ ํ๋ ฌ์ ํ์ ์ค์ ํด๋์ค๋ฅผ ๋ํ๋ด๊ณ ์ด์ ์์ธกํ ํด๋์ค๋ฅผ ๋ํ๋ธ๋ค.
์์ฑ์์ฑ
์์ฑ | TN | FP |
์์ฑ | FN | TP |
์ฒซ๋ฒ์งธ ํ์ '5 ์๋' ์ด๋ฏธ์ง์ ๋ํ ๊ฒ์ด๋ค.
TN : 5๊ฐ ์๋ ์ด๋ฏธ์ง๋ฅผ ์ ํํ๊ฒ ๋ถ๋ฅ
FP : 5๊ฐ ์๋ ์ด๋ฏธ์ง๋ฅผ 5๋ผ๊ณ ์๋ชป ๋ถ๋ฅ
๋๋ฒ์งธ ํ์ '5' ์ด๋ฏธ์ง์ ๋ํ ๊ฒ์ด๋ค
FN : 5์ธ ์ด๋ฏธ์ง๋ฅผ 5๊ฐ ์๋ ์ด๋ฏธ์ง๋ผ๊ณ ์๋ชป ๋ถ๋ฅ
TP : 5์ธ ์ด๋ฏธ์ง๋ฅผ 5๋ผ๊ณ ์ ํํ๊ฒ ๋ถ๋ฅ
- Precision : TP / (TP + FP) / ์ค์ True, ์์ธก True
- Recall : TP / (TP + FN) / ์ค์ False, ์์ธก True
from sklearn.metrics import precision_socre, recall_score
precision_score(y_train_5, y_train_predict)
recall_score(y_train_5, y_train_predict)
- F1-score : 2TP / (2TP + FN + FP) / Precision๊ณผ Recall์ ์กฐํ ํ๊ท
from sklearn.metrics import f1_score
f1_score(y_train_5, y_train_predict)
ROC ์ปค๋ธ ๊ณก์
- ๊ฑฐ์ง์์ฑ๋น์จ(FPR)์ ๋ํ ์ง์ง์์ฑ๋น์จ(TPR)์ ๊ณก์
- FPR : ์์ฑ์ผ๋ก ์๋ชป ๋ถ๋ฅ๋ ์์ฑ ์ํ์ ๋น์จ
- ๋ฏผ๊ฐ๋(์ฌํ์จ)์ ๋ํ 1-ํน์ด๋ ๊ทธ๋ํ
from sklearn.metrics import roc_auc_score
y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,
method="decision_function")
roc_auc_score(y_train_5, y_scores)
RandomForestClassifier
- ๋ฐฐ๊น (bagging) : ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฌ๋ฌ๊ฐ์ ๋ถ๋ฅ๊ธฐ๋ฅผ ๋ง๋๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฐ๊น ์ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด ๋๋คํฌ๋ ์คํธ์ด๋ค.
- ๋๋ค ํฌ๋ ์คํธ๋ ๊ฒฐ์ ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- ๋๋ค ํฌ๋ ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ํธ๋ฆฌ ๋ถ๋ฅ๊ธฐ๊ฐ ๋ฐฐ๊น ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ง ํ์ฌ ํ์ต์ ์ํํ ํ์ ์ต์ข ์ ์ผ๋ก ๋ณดํ ์ ํตํด ์์ธก ๊ฒฐ์ ์ ํ๊ฒ ๋ฉ๋๋ค.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_predict
forest_clf = RandomForestClassifier(random_state = 42)
y_prod_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv = 3, method = "predict_proba" )
[3.4] ๋ค์ค ๋ถ๋ฅ
- ๋ ์ด์์ ํด๋์ค๋ฅผ ๊ตฌ๋ณํ ์ ์๋ค
- SGDClassifier, RandomForest์ ๊ฐ์ ์ผ๋ถ ์๊ณ ๋ฆฌ์ฆ๋ค์ ์ฌ๋ฌ ๊ฐ์ ํด๋์ค๋ฅผ ์ง์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐ๋ฉด, Logistic, SVM ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ง ๋ถ๋ฅ๋ง ๊ฐ๋ฅํ๋ค
- ์ด์ง ๋ถ๋ฅ๊ธฐ๋ฅผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํด ๋ค์ค ํด๋์ค๋ฅผ ๋ถ๋ฅํ๋ ๊ธฐ๋ฒ๋ ์กด์ฌํ๋ค. ex) ํน์ ์ซ์ ํ๋๋ง ๊ตฌ๋ถํ๋ ์ซ์๋ณ ์ด์ง ๋ถ๋ฅ๊ธฐ 10๊ฐ
- ํด๋์ค๊ฐ N๊ฐ๋ผ๋ฉด ๋ถ๋ฅ๊ธฐ๋ N(N-1)/2 ๊ฐ ํ์ํ๋ค
๋ถ๋ฅ ์ํฌํธ ๋ฒกํฐ ๋จธ์ (SVC)
from sklearn.svm import SVC
svm_clf = SVC()
svm_clf.fit(X_train, y_train)
svc_clf.predict([some_digit]) #some_digit๋ ์ซ์ 5์ธ MNIST ๋ฐ์ดํฐ
- ์ ์ฝ๋๋ ํ๊ฒ ํด๋์ค(y_train_5) ๋์ 0~9๊น์ง ์๋ ํ๊ฒ ํด๋์ค(y_train)์ ์ฌ์ฉํด SVC๋ฅผ ํ๋ จ์์ผฐ๋ค.
some_digit_scores = svm_clf.decision_function([some_digit])
- ์ ์ฝ๋๋ฅผ ํตํด ํด๋์ค๋ง๋ค ํด๋นํ๋ Score๋ฅผ ๋ฐํํ ์ ์๋ค.
OvO (OneVsOneClassifier), OvR(OneVsRestClassifier)
- ์ฌ์ดํท๋ฐ์์ OvO, OvR๋ฅผ ๊ฐ์ ํ๋ ค๋ฉด OneVsOneClassifier, OneVsRestClassifier๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- OvO๋ 1๋1 ์ด์ง ๋ถ๋ฅ๊ธฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
- OvR์ ํ๋ ๋ ๋๋จธ์ง๋ฅผ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ด๋ค. One-versus-All(OvA)๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค
- ๊ฐ ํด๋์ค์ ๋ํ ์ ์๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ฅ ๋์ ๊ฐ์ ์ ํํ๋ ๋ฐฉ์์ด๋ค
from sklearn.multiclass import OneVsRestClassifier
ovr_clf = OneVsRestClassifier(SVC())
ovr_clf.fit(X_train, y_train)
์ค์ผ์ผ ์กฐ์
- ์ ๋ ฅ ์ค์ผ์ผ ์กฐ์ ์ ํตํด ์ ํ๋๋ฅผ ๋์ผ ์ ์๋ค.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) #์ค์ผ์ผ๋ฌ๋ฅผ ํตํด float ํ์์ ๊ฐ์ด ์๊ธฐ๋ฏ๋ก float๋ก ์ ํํด์ค ํ์๊ฐ ์๋ค
[3.5] ์๋ฌ ๋ถ์
์ค์ฐจ ํ๋ ฌ ๋ถ์
- cross_val_predict() ํจ์๋ฅผ ํตํด ์์ธก์ ๋ง๋ค๊ณ ์ด์ ์ฒ๋ผ confusion_matrix๋ฅผ ์์ฑํด๋ธ๋ค
y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv = 3)
conf_mx = confusion_matrix(y_train, y_train_pred)
print(conf_mx)
plt.matshow(conf_mx, cmap = plt.cm.gray)
plt.show()
- ์ค์ฐจ ํ๋ ฌ์ ํตํด ์ด๋ค ํด๋์ค๊ฐ ๋ถ๋ฅ๊ฐ ์ ์๋๋์ง ํ์ธํ ์ ์๋ค.
- ์ด๋ฅผ ํตํด ๋ถ๋ฅ๊ธฐ์ ์ฑ๋ฅ ํฅ์ ๋ฐฉ์์ ๋ํ ํต์ฐฐ์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด ์ฑ๋ฅ์ด ๋์ค์ง ์๋ ํด๋์ค์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ๋ ํ๋ณดํ์ฌ ํ์ต์ํฌ ์ ์๋ค.
- ๋ํ ๋ ์ ํฉํ ๋ชจ๋ธ์ ํ์ํ ์ ์๋ค
- ์ ์ฝ๋์์ MNIST์ ๋ํ ์ด๋ฏธ์ง ๋ถ๋ฅ๊ธฐ๋ก SGDClassifier๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ ํ ๋ถ๋ฅ๊ธฐ๋ ํฝ์ ์ ๊ฐ์ค์น๋ฅผ ํ ๋นํ๊ณ ์๋ก์ด ์ด๋ฏธ์ง์ ๋ํด ๋จ์ํ ํฝ์ ๊ฐ๋์ ๊ฐ์ค์น ํฉ์ ํด๋์ค์ ์ ์๋ก ๊ณ์ฐํ๋ค. ๋ฐ๋ผ์ 3๊ณผ 5๋ ๋ช ๊ฐ์ ํฝ์ ๋ง ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ด ์ฝ๊ฒ ํผ๋ํ๋ค
[3.6] ๋ค์ค ๋ ์ด๋ธ ๋ถ๋ฅ
- ์ง๊ธ๊น์ง๋ ๊ฐ ์ํ์ด ํ๋์ ํด๋์ค์๋ง ํ ๋น๋์๋ค. ํ์ง๋ง ๋ถ๋ฅ๊ธฐ๋ง๋ค ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ฅผ ์ถ๋ ฅํด์ผ ํ ๋๋ ์๋ค.
- ex) ์ฌ๋์ด ์ฌ๋ฌ๋ช ํฌํจ๋ ์ด๋ฏธ์ง
#๋ ๊ฐ์ ํ๊ฒ ๋ ์ด๋ธ์ด ํฌํจ๋ y_multilabel ํ์ต
from sklearn.neighbors import KNeighborsClassifier
y_train_large = (y_train >= 7)
y_train_odd = (y_train % 2 == 1)
y_multilabel = np.c_[y_train_large, y_train_odd]
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_multilabel)
[3.7] ๋ค์ค ์ถ๋ ฅ ๋ถ๋ฅ
- ๋ค์ค ๋ ์ด๋ธ ๋ถ๋ฅ์์ ํ ๋ ์ด๋ธ์ ๋ํ ์ถ๋ ฅ ๊ฐ์ด ๋ค์ค ํด๋์ค๊ฐ ๋ ์ ์๋๋ก ์ผ๋ฐํ ํ ๊ฒ์ด๋ค
- ex ) MNIST์์ ํฝ์ ์ ๊ฐ๋๋ฅผ ๋ด์ ๋ฐฐ์ด๋ก ์ถ๋ ฅ์ ํ๋ค. ๋ถ๋ฅ๊ธฐ์ ์ถ๋ ฅ์ด ๋ค์ค ๋ ์ด๋ธ(ํฝ์ ๋น ํ ๋ ์ด๋ธ)์ด๊ณ ๊ฐ ๋ ์ด๋ธ์ ๊ฐ์ ์ฌ๋ฌ๊ฐ ๊ฐ์ง๋ค(0~255๊น์ง์ ํฝ์ ๊ฐ๋).
noise = np.random.randint(0, 100, (len(X_train), 784)) #len(X_train) x 784 ํ๋ ฌ์์ 0~100 ๋๋ค ์ ์์ฑ / 784 = 28x28(์ด๋ฏธ์ง ํฌ๊ธฐ)
X_train_mod = X_train + noise #shape 60000, 784
noise = np.random.randint(0, 100, (len(X_test), 784))
X_test_mod = X_test + noise
y_train_mod = X_train
y_test_mod = X_test
some_index = 0 # 0๋ฒ ์ธ๋ฑ์ค
plt.subplot(121); plot_digit(X_test_mod[some_index]) # ์ก์ ์ถ๊ฐ๋ ์ด๋ฏธ์ง
plt.subplot(122); plot_digit(y_test_mod[some_index]) # ์๋ณธ ์ด๋ฏธ์ง
plt.show()
'AI > Machine Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 10 ์์ฝ (0) | 2022.12.08 |
---|---|
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 8 ์์ฝ (0) | 2022.12.03 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 5 ์์ฝ (0) | 2022.11.29 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 4 ์์ฝ (1) | 2022.10.27 |
[ํธ์ฆ์จ ๋จธ์ ๋ฌ๋ 2ํ] Chapter 3์ฅ ์ฐ์ต๋ฌธ์ ํ์ด (0) | 2022.10.23 |