์ํ ์: 150
์์ฑ ์: 4
- ์ ๋ณด 1: ๊ฝ๋ฐ์นจ ๊ธธ์ด (sepal length, ๋จ์: cm)
- ์ ๋ณด 2: ๊ฝ๋ฐ์นจ ๋๋น (sepal width, ๋จ์: cm)
- ์ ๋ณด 3: ๊ฝ์ ๊ธธ์ด (petal length, ๋จ์: cm)
- ์ ๋ณด 4: ๊ฝ์ ๋๋น (petal width, ๋จ์: cm)
ํด๋์ค: Iris-setosa, Iris-versicolor, Iris-virginica
ํด๋์ค๊ฐ 3๊ฐ
- ์ฐธ(1)๊ณผ ๊ฑฐ์ง(0) = ์ดํญ ๋ถ๋ฅ(binary classification)์ ๋ค๋ฆ , ์ฌ๋ฌ ๊ฐ ์ค์ ์ด๋ค ๊ฒ์ด ๋ต์ธ์ง๋ฅผ ์์ธกํ๋ ๋ฌธ์
- ์ฌ๋ฌ ๊ฐ์ ๋ต ์ค ํ๋๋ฅผ ๊ณ ๋ฅด๋ ๋ถ๋ฅ ๋ฌธ์ = ๋ค์ค ๋ถ๋ฅ(multi classification)
์๊ด๋ ๊ทธ๋ํ
import pandas as pd
df = pd.read_csv(’../dataset/iris.csv’, names = [“sepal_length”, “sepal_width”, “petal_length”, “petal_width”, “species”])
print(df.head())
pairplot( ) :๋ฐ์ดํฐ๋ฅผ ํ๋์ ๋ณด๋ ๊ทธ๋ํ ์ถ๋ ฅ
import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(df, hue=‘species’);
plt.show()
๊ฝ์๊ณผ ๊ฝ๋ฐ์นจ์ ํฌ๊ธฐ์ ๋๋น๊ฐ ํ์ข ๋ณ๋ก ์ฐจ์ด๊ฐ ์์์ ์ ์ ์๋ค.
Keras ๋ก ํ์ข ์์ธก
์-ํซ ์ธ์ฝ๋ฉ(one-hot-encoding)
Iris-setosa, Iris-virginica ๋ฑ ๋ฐ์ดํฐ ์์ ๋ฌธ์์ด์ด ํฌํจ๋์ด ์์ ๋ -- numpy๋ณด๋ค๋ pandas๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ X์ Y ๊ฐ์ ๊ตฌ๋ถ
df = pd.read_csv(’../dataset/iris.csv’, names = [“sepal_length”, “sepal_width”, “petal_length”, “petal_width”, “species”])
# ๋ฐ์ดํฐ ๋ถ๋ฅ
dataset = df.values
X = dataset[:,0:4].astype(float)
Y_obj = dataset[:,4]
Y ๊ฐ=๋ฌธ์์ด, ์ซ์๋ก ๋ฐ๊ฟ ์ฃผ๋ ค๋ฉด ํด๋์ค ์ด๋ฆ์ ์ซ์ ํํ๋ก ๋ฐ๊ฟ ์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ํจ์๊ฐ sklearn ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ LabelEncoder() ํจ์์ ๋๋ค.
from sklearn.preprocessing import LabelEncoder
# ๋ฌธ์์ด์ ์ซ์๋ก ๋ณํ
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
array(['Iris-setosa', 'Iris-versicolor','Iris-virginica'])๊ฐ array([1,2,3])๋ก ๋ฐ๋๋๋ค.
ํ์ฑํ ํจ์๋ฅผ ์ ์ฉํ๋ ค๋ฉด Y ๊ฐ์ด ์ซ์ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ ธ ์์ด์ผ ํฉ๋๋ค.
์ด ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ ค๋ฉด tf.keras.utils.categorical() ํจ์๋ฅผ ์ ์ฉํด์ผ ํฉ๋๋ค. ์ด์ ๋ฐ๋ผ Y ๊ฐ์ ํํ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๋ฉ๋๋ค.
from tensorflow.keras.utils import np_utils
Y_encoded = tf.keras.utils.to_categorical(Y)
์ด๋ ๊ฒ ํ๋ฉด array([1,2,3])๊ฐ ๋ค์ array([[1., 0., 0.], [0., 1., 0.],[ 0., 0., 1.]])๋ก ๋ฐ๋๋๋ค.
์ด์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ Y ๊ฐ์ 0๊ณผ 1๋ก๋ง ์ด๋ฃจ์ด์ง ํํ๋ก ๋ฐ๊ฟ ์ฃผ๋ ๊ธฐ๋ฒ์ ์-ํซ ์ธ์ฝ๋ฉ(one-hot-encoding)์ด๋ผ๊ณ ํฉ๋๋ค.
ํ์ฑํํจ์ ์ํํธ๋งฅ์ค(Softmax)
#๋ชจ๋ธ ์ค์
model = Sequential()
model.add(Dense(16, input_dim=4, activation=‘relu’))
model.add(Dense(3, activation=‘softmax’))
๋จผ์ ์ต์ข ์ถ๋ ฅ ๊ฐ์ด 3๊ฐ ์ค ํ๋์ฌ์ผ ํ๋ฏ๋ก ์ถ๋ ฅ์ธต์ ํด๋นํ๋ Dense์ ๋ ธํธ ์๋ฅผ 3์ผ๋ก ์ค์ ํฉ๋๋ค.
์ํํธ๋งฅ์ค๋ ์ดํฉ์ด 1์ธ ํํ๋ก ๋ฐ๊ฟ์ ๊ณ์ฐํด ์ฃผ๋ ํจ์์ ๋๋ค.
ํฉ๊ณ๊ฐ 1์ธ ํํ๋ก ๋ณํํ๋ฉด ํฐ ๊ฐ์ด ๋๋๋ฌ์ง๊ฒ ๋ํ๋๊ณ ์์ ๊ฐ์ ๋ ์์์ง๋๋ค.
์ด ๊ฐ์ด ๊ต์ฐจ ์ํธ๋กํผ๋ฅผ ์ง๋ [1., 0., 0.]์ผ๋ก ๋ณํ๊ฒ ๋๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์-ํซ ์ธ์ฝ๋ฉ ๊ฐ, ์ฆ ํ๋๋ง 1์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ 0์ธ ํํ๋ก ์ ํ
๋ค์ค ๋ถ๋ฅ์ ์ ์ ํ ์ค์ฐจ ํจ์์ธ categorical_crossentropy๋ฅผ ์ฌ์ฉํ๊ณ , ์ต์ ํ ํจ์๋ก adam์
๊ทธ๋ฆฌ๊ณ ์ ์ฒด ์ํ์ด 50ํ ๋ฐ๋ณต๋ ๋๊น์ง ์คํ์ ์งํํ๋ ํ ๋ฒ์ ์ ๋ ฅ๋๋ ๊ฐ์ 1๊ฐ๋ก
์ ์ฒด ์ฝ๋
# ๋ฐ์ดํฐ ๋ถ๋ฅ
dataset = df.values
X = dataset[:,0:4].astype(float)
Y_obj = dataset[:,4]
# ๋ฌธ์์ด์ ์ซ์๋ก ๋ณํ
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)
Y_encoded = tf.keras.utils.to_categorical(Y)
# ๋ชจ๋ธ์ ์ค์
model = Sequential()
model.add(Dense(16, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))
# ๋ชจ๋ธ ์ปดํ์ผ
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
# ๋ชจ๋ธ ์คํ
model.fit(X, Y_encoded, epochs=50, batch_size=1)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print("\n Accuracy: %.4f" % (model.evaluate(X, Y_encoded)[1]))
- 0s 1ms/sample - loss: 0.1042 - accuracy: 0.9867
Accuracy: 0.9867
์์ธก ์ ํ๋: 98.67%
์ด๋ 148๊ฐ์ ์ํ์ ํ ๋ฒ์ฉ ํ ์คํธํ ๊ฒฐ๊ณผ 146๊ฐ์ ํ์ข ์ ์ ํํ ๋งํ๋ ํ๋ฅ
'๋ฅ๋ฌ๋ > Today I learned :' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฅ๋ฌ๋] ์์ธ์ ์ข ๋ฅ ์์ธกํ๊ธฐ (0) | 2021.03.25 |
---|---|
[๋ฅ๋ฌ๋] ์ด์ํ ๊ด๋ฌผ ๋ฐ์ดํฐ : ๊ณผ์ ํฉ ํผํ๊ธฐ (0) | 2021.03.24 |
[๋ฅ๋ฌ๋] ํผ๋ง ์ธ๋์ธ ๋น๋จ๋ณ ์์ธกํ๊ธฐ (0) | 2021.03.22 |
[๋ฅ๋ฌ๋] ๋ชจ๋ธ ์ค๊ณํ๊ธฐ (0) | 2021.03.21 |
[๋ฅ๋ฌ๋] ์ค์ฐจ ์ญ์ ํ (Error Back propagation) ,๊ธฐ์ธ๊ธฐ ์์ค(vanishing gradient) ๋ฌธ์ , ๊ณ ๊ธ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (0) | 2021.03.20 |