๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
study๐Ÿ“š/๋จธ์‹ ๋Ÿฌ๋‹

[๋จธ์‹ ๋Ÿฌ๋‹] ์‚ฌ์ดํ‚ท๋Ÿฐ(scikit-learn) - Iris ํ’ˆ์ข… ์˜ˆ์ธก

by ์Šค๋‹ 2022. 8. 26.

์‚ฌ์ดํ‚ท๋Ÿฐ(scikit-learn)

  • ํŒŒ์ด์ฌ ๊ธฐ๋ฐ˜์˜ ๋‹ค๋ฅธ ๋จธ์‹ ๋Ÿฌ๋‹ ํŒจํ‚ค์ง€๋„ ์‚ฌ์ดํ‚ท๋Ÿฐ ์Šคํƒ€์ผ์˜ API๋ฅผ ์ง€ํ–ฅํ•  ์ •๋„๋กœ ์‰ฝ๊ณ  ๊ฐ€์žฅ ํŒŒ์ด์ฌ์Šค๋Ÿฌ์šด API๋ฅผ ์ œ๊ณต
  • ๋จธ์‹ ๋Ÿฌ๋‹์„ ์œ„ํ•œ ๋งค์šฐ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ API๋ฅผ ์ œ๊ณต
  • ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‹ค์ „ ํ™˜๊ฒฝ์—์„œ ๊ฒ€์ฆ๋์œผ๋ฉฐ, ๋งค์šฐ ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„ฑ์ˆ™ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ฃผ๋กœ numpy, scipy ๊ธฐ๋ฐ˜ ์œ„์—์„œ ๊ตฌ์ถ•๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ง€๋„ํ•™์Šต - ๋ถ„๋ฅ˜

๋ถ„๋ฅ˜(Classification)๋Š” ๋Œ€ํ‘œ์ ์ธ ์ง€๋„ ํ•™์Šต(Supervised Learning) ๋ฐฉ๋ฒ•์˜ ํ•˜๋‚˜.
์ง€๋„ํ•™์Šต์€ ํ•™์Šต์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํ”ผ์ฒ˜์™€ ๋ถ„๋ฅ˜ ๊ฒฐ์ •๊ฐ’์ธ ๋ ˆ์ด๋ธ”(Label)๋ฐ์ดํ„ฐ๋กœ ๋ชจ๋ธ์„ ํ•™์Šตํ•œ ๋’ค, ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ๋ฏธ์ง€์˜ ๋ ˆ์ด๋ธ”์„ ์˜ˆ์ธก.

์ฆ‰ ์ง€๋„ํ•™์Šต์€ ๋ช…ํ™•ํ•œ ์ •๋‹ต์ด ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ํ•™์Šตํ•œ ๋’ค ๋ฏธ์ง€์˜ ์ •๋‹ต์„ ์˜ˆ์ธกํ•˜๋Š” ๋ฐฉ์‹. ์ด๋•Œ ํ•™์Šต์„ ์œ„ํ•ด ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ•™์Šต ๋ฐ์ดํ„ฐ ์„ธํŠธ, ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์˜ ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„๋กœ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ์ง€์นญ

1. ์‚ฌ์ดํ‚ท๋Ÿฐ์„ ์ด์šฉํ•œ ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜

๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋Š” ๊ฝƒ์žŽ์˜ ๊ธธ์ด์™€ ๋„ˆ๋น„, ๊ฝƒ๋ฐ›์นจ์˜ ๊ธธ์ด์™€ ๋„ˆ๋น„ ํ”ผ์ฒ˜(Feature)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฝƒ์˜ ํ’ˆ์ข…์„ ์˜ˆ์ธกํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ.

  • ํ”ผ์ฒ˜(Feature), ์†์„ฑ
    ํ”ผ์ฒ˜๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ผ๋ฐ˜ ์†์„ฑ. ๋จธ์‹ ๋Ÿฌ๋‹์€ 2์ฐจ์› ์ด์ƒ์˜ ๋‹ค์ฐจ์› ๋ฐ์ดํ„ฐ์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ํƒ€๊ฒŸ๊ฐ’์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์†์„ฑ์„ ๋ชจ๋‘ ํ”ผ์ฒ˜๋กœ ์ง€์นญ.
  • ๋ ˆ์ด๋ธ”, ํด๋ž˜์Šค, ํƒ€๊ฒŸ(๊ฐ’), ๊ฒฐ์ •(๊ฐ’)
    ํƒ€๊ฒŸ๊ฐ’ ๋˜๋Š” ๊ฒฐ์ •๊ฐ’์€ ์ง€๋„ ํ•™์Šต ์‹œ ๋ฐ์ดํ„ฐ์˜ ํ•™์Šต์„ ์œ„ํ•ด ์ฃผ์–ด์ง€๋Š” ์ •๋‹ต ๋ฐ์ดํ„ฐ. ์ง€๋„ ํ•™์Šต ์ค‘ ๋ถ„๋ฅ˜์˜ ๊ฒฝ์šฐ์—๋Š” ์ด ๊ฒฐ์ •๊ฐ’์„ ๋ ˆ์ด๋ธ” ๋˜๋Š” ํด๋ž˜์Šค๋กœ ์ง€์นญ.

2. ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ๋ถ„๋ฅ˜ ์˜ˆ์ธก ํ”„๋กœ์„ธ์Šค

  1. ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ถ„๋ฆฌ : ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต ๋ฐ์ดํ„ฐ์™€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๋ถ„๋ฆฌ
  2. ๋ชจ๋ธ ํ•™์Šต : ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ML ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด ๋ชจ๋ธ์„ ํ•™์Šต
  3. ์˜ˆ์ธก ์ˆ˜ํ–‰ : ํ•™์Šต๋œ ML ๋ชจ๋ธ์„ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ๋ถ„๋ฅ˜(์ฆ‰, ๋ถ“๊ฝƒ ์ข…๋ฅ˜)๋ฅผ ์˜ˆ์ธก
  4. ํ‰๊ฐ€ : ์ด๋ ‡๊ฒŒ ์˜ˆ์ธก๋œ ๊ฒฐ๊ณผ๊ฐ’๊ณผ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋น„๊ตํ•ด ML๋ชจ๋ธ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€

3. ์‹ค์Šต

์‚ฌ์ดํ‚ท๋Ÿฐ์„ ์ด์šฉํ•˜์—ฌ ๋ถ“๊ฝƒ(Iris)๋ฐ์ดํ„ฐ ํ’ˆ์ข… ์˜ˆ์ธกํ•˜๊ธฐ

# ์‚ฌ์ดํ‚ท๋Ÿฐ ๋ฒ„์ „ ํ™•์ธ
import sklearn
print(sklearn.__version__)

** ๋ถ“๊ฝƒ ์˜ˆ์ธก์„ ์œ„ํ•œ ์‚ฌ์ดํ‚ท๋Ÿฐ ํ•„์š” ๋ชจ๋“ˆ ๋กœ๋”ฉ **

from sklearn.datasets import load_iris  # ๋‚ด์žฅ๋ฐ์ดํ„ฐ๋กœ ๋“ค์–ด๊ฐ€์žˆ๋Š” iris ๋ฐ์ดํ„ฐ ๋กœ๋“œ
from sklearn.tree import DecisionTreeClassifier  # ์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด ๋ถ„๋ฅ˜๊ธฐ
from sklearn.model_selection import train_test_split  # ํ•™์Šต,ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ(train, test ๋ฐ์ดํ„ฐ ๋ถ„ํ• )

1) ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋กœ๋”ฉ

import pandas as pd

# ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค. 
iris = load_iris() 
# iris.data๋Š” Iris ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ํ”ผ์ฒ˜(feature)๋งŒ์œผ๋กœ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ numpy๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 
iris_data = iris.data
iris_data

# iris.target์€ ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ ๋ ˆ์ด๋ธ”(๊ฒฐ์ • ๊ฐ’) ๋ฐ์ดํ„ฐ๋ฅผ numpy๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 
iris_label = iris.target
iris_label

print('iris target๋ช…:', iris.target_names)

iris target๋ช…: ['setosa' 'versicolor' 'virginica']

# ๋ถ“๊ฝƒ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ž์„ธํžˆ ๋ณด๊ธฐ ์œ„ํ•ด DataFrame์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. 
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target

print(iris_df.shape)
iris_df.head()

2) ํ•™์Šต ๋ฐ์ดํ„ฐ์™€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ๋ถ„๋ฆฌ

iris_df 150์˜ ํ–‰์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
train: 0.8_150=120 -> (X_train,y_train) ํ•™์Šต -> ๋ชจ๋ธ
test:0.2_150=30 -> (X_test,y_test)์˜ˆ์ธก -> ํ‰๊ฐ€์ง€ํ‘œ

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, 
                                                    test_size=0.2, random_state=11)
  • test_size: ํ…Œ์ŠคํŠธ ์…‹ ๊ตฌ์„ฑ์˜ ๋น„์œจ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. train_size์˜ ์˜ต์…˜๊ณผ ๋ฐ˜๋Œ€ ๊ด€๊ณ„์— ์žˆ๋Š” ์˜ต์…˜ ๊ฐ’์ด๋ฉฐ,
    ์ฃผ๋กœ test_size๋ฅผ ์ง€์ •ํ•ด ์ค๋‹ˆ๋‹ค. 0.2๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ ์…‹์˜ 20%๋ฅผ test (validation) ์…‹์œผ๋กœ ์ง€์ •ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
    default ๊ฐ’์€ 0.25 ์ž…๋‹ˆ๋‹ค.
  • random_state: ์„ธํŠธ๋ฅผ ์„ž์„ ๋•Œ ํ•ด๋‹น int ๊ฐ’์„ ๋ณด๊ณ  ์„ž์œผ๋ฉฐ,
    ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŠœ๋‹์‹œ ์ด ๊ฐ’์„ ๊ณ ์ •ํ•ด๋‘๊ณ  ํŠœ๋‹ํ•ด์•ผ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ์…‹์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# ํ•™์Šต ๋ฐ์ดํ„ฐ ์„ธํŠธ
print(X_train.shape)
print(y_train.shape)

# ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ธํŠธ
print(X_test.shape)
print(y_test.shape)

(120, 4)
(120,)
(30, 4)
(30,)

3) "ํ•™์Šต ๋ฐ์ดํ„ฐ" ์„ธํŠธ๋กœ ํ•™์Šต(Train) ์ˆ˜ํ–‰

# DecisionTreeClassifier ๊ฐ์ฒด ์ƒ์„ฑ 
dt_clf = DecisionTreeClassifier(random_state=11)

# ํ•™์Šต ์ˆ˜ํ–‰ (ํ•ด๋‹น ํ•™์Šต ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต)
dt_clf.fit(X_train, y_train)

DecisionTreeClassifier(random_state=11)

4) "ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ" ์„ธํŠธ๋กœ ์˜ˆ์ธก(Predict) ์ˆ˜ํ–‰

# ํ•™์Šต์ด ์™„๋ฃŒ๋œ DecisionTreeClassifier ๊ฐ์ฒด์—์„œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ์˜ˆ์ธก ์ˆ˜ํ–‰. 
pred = dt_clf.predict(X_test) #y_test(์‹ค์ œ๊ฐ’)
pred

print(len(pred))
pred

iris.target_names

array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

5)  ์˜ˆ์ธก ์ •ํ™•๋„ ํ‰๊ฐ€

from sklearn.metrics import accuracy_score #accuracy_score์— ์ •๋‹ต๋ฐฐ์—ด๊ณผ ์˜ˆ์ธก๊ฐ’์˜ ๋ฐฐ์—ด์„ ๋„ฃ์œผ๋ฉด ์ •ํ™•๋„๊ฐ€ ํ‰๊ฐ€๋œ๋‹ค.
print('์˜ˆ์ธก ์ •ํ™•๋„: {0:.4f}'.format(accuracy_score(y_test, pred))) #4f:์‹ค์ˆ˜ํ˜• 4์งธ์ž๋ฆฌ๊นŒ์ง€!

-> 93%์˜ ์ •ํ™•๋„๋กœ iris ๋ฐ์ดํ„ฐ์˜ ํ’ˆ์ข…์„ ์˜ˆ์ธกํ•จ.

๋Œ“๊ธ€