๐Ÿš€ ๋จธ์‹ ๋Ÿฌ๋‹์˜ ์„ธ๊ณ„, ๋ถ„๋ฅ˜(Classification)๋กœ ์ฒซ๋ฐœ ๋‚ด๋”›๊ธฐ

๋จธ์‹ ๋Ÿฌ๋‹์˜ ์„ธ๊ณ„์— ์ฒซ๋ฐœ์„ ๋‚ด๋”›๋Š” ๋‹น์‹ , ์–ด๋””๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ง‰๋ง‰ํ•œ๊ฐ€์š”? ์˜ค๋Š˜์€ ๊ทธ ์ฒซ๊ฑธ์Œ์œผ๋กœ, ์ˆ˜๋งŽ์€ ๋ชจ๋ธ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ๋ถ„๋ฅ˜(Classification) ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ Scikit-Learn์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ์™€ ํ•จ๊ป˜ ์ •๋ณตํ•ด๋ณธ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๋ ค ํ•œ๋‹ค. ๋”ฑ๋”ฑํ•œ ์ด๋ก ์„œ๋ฅผ ๋„˜์–ด, ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ๋งŒ์ ธ๋ณด๋ฉฐ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹ฌ์žฅ์„ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ์—ฌ์ •์ด์—ˆ๋‹ค. ๐Ÿ˜„

๐Ÿ’ก โ€œ์ด๋ฉ”์ผ์ด ์ŠคํŒธ์ผ๊นŒ, ์•„๋‹๊นŒ?โ€

์šฐ๋ฆฌ ์ฃผ๋ณ€์˜ ์ˆ˜๋งŽ์€ AI ์„œ๋น„์Šค๋Š” ๋ฐ”๋กœ ์ด โ€˜๋ถ„๋ฅ˜โ€™์—์„œ ์‹œ์ž‘๋œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  โ€˜์ด๊ฒƒโ€™๊ณผ โ€˜์ €๊ฒƒโ€™์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์ง€ํ˜œ, ์ฆ‰ ๋ถ„๋ฅ˜์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋จธ์‹ ๋Ÿฌ๋‹์˜ ๋ฐ”๋‹ค๋ฅผ ํ•ญํ•ดํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๋‚˜์นจ๋ฐ˜๊ณผ๋„ ๊ฐ™๋‹ค.


๐Ÿ› ๏ธ 1. ์šฐ๋ฆฌ์˜ ๋“ ๋“ ํ•œ ์žฅ๋น„, Scikit-Learn

ํƒํ—˜์„ ๋– ๋‚˜๊ธฐ ์ „, ์ตœ๊ณ ์˜ ์žฅ๋น„๋ถ€ํ„ฐ ์ฑ™๊ฒจ์•ผ ํ•œ๋‹ค. Scikit-learn์€ ๋งˆ์น˜ ์ž˜ ๋งŒ๋“ค์–ด์ง„ ์Šค์œ„์Šค ์•„๋ฏธ ๋‚˜์ดํ”„์ฒ˜๋Ÿผ, ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณตํ•ด์ค€๋‹ค.

scikit-learn logo

Scikit-learn ์‚ฌ์šฉ๋ฒ•์€ ๋”ฑ 5๋‹จ๊ณ„๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋œ๋‹ค.

  1. ๋ชจ๋ธ ์„ ํƒ: from sklearn.some_module import SomeModel
  2. ๋ชจ๋ธ ์ƒ์„ฑ: model = SomeModel(hyperparameter=value)
  3. ๋ฐ์ดํ„ฐ ์ค€๋น„: X_train, y_train
  4. ํ›ˆ๋ จ: model.fit(X_train, y_train) โœจ
  5. ์˜ˆ์ธก: model.predict(X_new)

์ด ๊ฐ„๋‹จํ•œ ํŒจํ„ด๋งŒ ์ตํžˆ๋ฉด, ํผ์…‰ํŠธ๋ก ๋ถ€ํ„ฐ SVM๊นŒ์ง€ ๋ชจ๋“  ๋ชจ๋ธ์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์€๊ฐ€!


๐Ÿ—บ๏ธ 2. ๋ณธ๊ฒฉ์ ์ธ ํƒํ—˜: 6๊ฐœ์˜ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ณต๊ธฐ

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ 6๊ฐœ์˜ ์ฃผ์š” ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•˜๋‚˜์”ฉ ๋งŒ๋‚˜๋ณด์•˜๋‹ค.

(1) ํผ์…‰ํŠธ๋ก  (Perceptron): ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์‹œ์ž‘

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์„ ํ˜• ๋ถ„๋ฅ˜๊ธฐ. sklearn.linear_model.Perceptron์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ ํ˜•์ ์œผ๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์—์„œ๋Š” ์—ฌ์ „ํžˆ ๊ฐ•๋ ฅํ•œ ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค.

from sklearn.linear_model import Perceptron

# ํผ์…‰ํŠธ๋ก  ํ›ˆ๋ จ
ppn = Perceptron(eta0=0.1, random_state=1)
ppn.fit(X_train_std, y_train)

(2) ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ (Logistic Regression): ํ™•๋ฅ ์˜ ์„ธ๊ณ„๋กœ

์ด๋ฆ„์€ โ€˜ํšŒ๊ท€โ€™์ง€๋งŒ, ์‚ฌ์‹ค์€ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์ด๋‹ค. ๊ฐ ํด๋ž˜์Šค์— ์†ํ•  ํ™•๋ฅ ์„ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ์ ์ด ๋งค๋ ฅ์ ์ด๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์—๋งŒ ๋„ˆ๋ฌด ์ต์ˆ™ํ•ด์ง€๋Š” ๊ณผ๋Œ€์ ํ•ฉ(Overfitting) ์ด๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ๋‹ค.

๐Ÿง ๋ฐœ๊ฒฌ! ๊ณผ๋Œ€์ ํ•ฉ์„ ๋ง‰๋Š” ๋งˆ๋ฒ•, ๊ทœ์ œ(Regularization)

๋ชจ๋ธ์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋„๋ก ํŽ˜๋„ํ‹ฐ๋ฅผ ์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. Scikit-learn์—์„œ๋Š” LogisticRegression(C=1.0, penalty='l2')์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ด ๋งˆ๋ฒ•์„ ๋ถ€๋ฆด ์ˆ˜ ์žˆ๋‹ค. C ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ๊ฐ•ํ•œ ๊ทœ์ œ๊ฐ€ ์ ์šฉ๋˜์–ด ๋ชจ๋ธ์ด ๋” ๋‹จ์ˆœํ•ด์ง„๋‹ค. ์ด ์›๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๋ชจ๋ธ์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด์—ˆ๋‹ค.

from sklearn.linear_model import LogisticRegression

# L2 ๊ทœ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ํ›ˆ๋ จ
lr = LogisticRegression(C=1.0, penalty='l2', random_state=1)
lr.fit(X_train_std, y_train)

(3) ์„œํฌํŠธ ๋ฒกํ„ฐ ๋จธ์‹  (SVM): ์ตœ์ ์˜ ๊ฒฝ๊ณ„์„ ์„ ์ฐพ์•„์„œ

ํด๋ž˜์Šค ๊ฐ„์˜ ๋งˆ์ง„(๊ฐ„๊ฒฉ)์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๊ฐ€์žฅ ์•ˆ์ •์ ์ธ ๊ฒฝ๊ณ„์„ ์„ ์ฐพ๋Š” ๋˜‘๋˜‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ํŠนํžˆ ์ปค๋„ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํ˜•์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋„ ๊ฑฐ๋œฌํžˆ ๋ถ„๋ฅ˜ํ•ด๋‚ธ๋‹ค. SVC(kernel='rbf')๊ฐ€ ๋ฐ”๋กœ ๊ทธ ๋งˆ๋ฒ•์˜ ์ฃผ๋ฌธ์ด๋‹ค.

from sklearn.svm import SVC

# RBF ์ปค๋„์„ ์‚ฌ์šฉํ•˜๋Š” SVM ํ›ˆ๋ จ
svm = SVC(kernel='rbf', random_state=1, gamma=0.10, C=10.0)
svm.fit(X_train_std, y_train)

(4) ๊ฒฐ์ • ํŠธ๋ฆฌ (Decision Tree): ์Šค๋ฌด๊ณ ๊ฐœ ํ•˜๋“ฏ ๋ช…์พŒํ•˜๊ฒŒ

โ€œ์ด ํŠน์ง•์ด A๋ณด๋‹ค ํฐ๊ฐ€์š”?โ€ ๊ฐ™์€ ์งˆ๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š”, ๋งˆ์น˜ ์Šค๋ฌด๊ณ ๊ฐœ ๊ฐ™์€ ๋ชจ๋ธ์ด๋‹ค. ๋ชจ๋ธ์˜ ๊ฒฐ์ • ๊ณผ์ •์„ ์‚ฌ๋žŒ์ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„์ฒญ๋‚œ ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“ค๋ฉด ๊ณผ๋Œ€์ ํ•ฉ์˜ ๋ซ์— ๋น ์ง€๊ธฐ ์‰ฌ์šฐ๋‹ˆ max_depth๋กœ ๊นŠ์ด๋ฅผ ์กฐ์ ˆํ•˜๋Š” ์ง€ํ˜œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

from sklearn.tree import DecisionTreeClassifier

# ๊ฒฐ์ • ํŠธ๋ฆฌ ํ›ˆ๋ จ (์ตœ๋Œ€ ๊นŠ์ด 4๋กœ ์ œํ•œ)
tree = DecisionTreeClassifier(criterion='gini', max_depth=4, random_state=1)
tree.fit(X_train, y_train)

(5) ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ (Random Forest): ์ง‘๋‹จ์ง€์„ฑ์˜ ํž˜

๊ฒฐ์ • ํŠธ๋ฆฌ๊ฐ€ ํ•œ ๋ช…์˜ ์ „๋ฌธ๊ฐ€๋ผ๋ฉด, ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ๋Š” ์ˆ˜๋งŽ์€ ์ „๋ฌธ๊ฐ€ ์ง‘๋‹จ์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ์ • ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ํˆฌํ‘œ(์•™์ƒ๋ธ”)๋ฅผ ํ•˜๋‹ˆ, ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ์•ˆ์ •์ ์ด๊ณ  ๊ฐ•๋ ฅํ•ด์ง„๋‹ค. ์—ญ์‹œ ํ•จ๊ป˜ํ•  ๋•Œ ๋” ๊ฐ•ํ•˜๋‹ค! ๐Ÿง 

from sklearn.ensemble import RandomForestClassifier

# 100๊ฐœ์˜ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋œ ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ํ›ˆ๋ จ
forest = RandomForestClassifier(n_estimators=100, random_state=1)
forest.fit(X_train, y_train)

(6) K-์ตœ๊ทผ์ ‘ ์ด์›ƒ (KNN): โ€œ์นœ๊ตฌ๋ฅผ ๋ณด๋ฉด ๋„ˆ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹คโ€

์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ์ฃผ๋ณ€์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด k๊ฐœ ์ด์›ƒ๋“ค์„ ๋ณด๊ณ  ํด๋ž˜์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ๋ชจ๋ธ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘์ง€ ์•Š์•„ โ€˜๊ฒŒ์œผ๋ฅธ ํ•™์Šตโ€™์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

from sklearn.neighbors import KNeighborsClassifier

# 5๊ฐœ์˜ ์ด์›ƒ์„ ์ฐธ๊ณ ํ•˜๋Š” KNN ํ›ˆ๋ จ
# ํŠน์ง•์„ ํ‘œ์ค€ํ™”(Standardization)ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค!
knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski')
knn.fit(X_train_std, y_train)

โœจ ์˜ค๋Š˜์˜ ํšŒ๊ณ 

๋‹จ์ˆœํžˆ Scikit-learn์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ฐ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์ด ์–ด๋–ค ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๊ณ , ์™œ ํŠน์ • ์ƒํ™ฉ์—์„œ ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ(๊ทœ์ œ, ์ปค๋„ ๋“ฑ)๊ฐ€ ์ค‘์š”ํ•œ์ง€ ๋ชธ์†Œ ์ฒด๊ฐํ•˜๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ๐Ÿ˜Š

์˜ค๋Š˜ ๋ฐฐ์šด 6๊ฐœ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์•ž์œผ๋กœ ๋งˆ์ฃผํ•  ๋” ๋ณต์žกํ•œ ๋ชจ๋ธ๋“ค์˜ ๋“ ๋“ ํ•œ ๊ธฐ์ดˆ๊ฐ€ ๋˜์–ด์ค„ ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์—๋Š” ์˜ค๋Š˜ ๋ฐฐ์šด ๋ชจ๋ธ๋“ค์„ ํ™œ์šฉํ•ด ์‹ค์ œ ์บ๊ธ€ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์˜ˆ์ธก ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ๋ณผ ์ƒ๊ฐ์— ๊ฐ€์Šด์ด ๋›ด๋‹ค! ๐Ÿ”ฅ