๋ฅ๋ฌ๋์ ์ด๋ฏธ์ง ์ธ์, ์์ฐ์ด ์ฒ๋ฆฌ, ์์ฑ ์ธ์ ๋ฑ ๋ค์ํ ์์ญ์์ ๋งค์ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
๋ฅ๋ฌ๋์ ํ๋ ๋ ์ด์ด๊ฐ ๋ง๋ค๋ ๊ฒ์ด ํน์ง์ด๋ค
- ๋ฅ๋ฌ๋์์ "ํ๋ ๋ ์ด์ด"๋ ์ ๋ ฅ์ธต(input layer)๊ณผ ์ถ๋ ฅ์ธต(output layer) ์ฌ์ด์ ์๋ ์ค๊ฐ ๋ ์ด์ด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ํ๋ ๋ ์ด์ด๊ฐ ๋ง์์๋ก, ๋ชจ๋ธ์ ๋ ๋ณต์กํ ํจํด์ด๋ ๊ด๊ณ๋ฅผ ํ์ตํ ์ ์๊ฒ ๋๋ค. ์ด๋ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ๊ฐ์ ๋ณต์กํ ๋น์ ํ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ ๋ง์ ํ๋ ๋ ์ด์ด๋ฅผ ๊ฐ์ง ์ ๊ฒฝ๋ง์ ๋ ๋ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ๋ ๋ง์ ๋ฐ์ดํฐ์ ์ฐ์ฐ ๋ฆฌ์์ค๋ฅผ ํ์๋ก ํ๋ค. ๊ทธ๋ฌ๋ ์ถฉ๋ถํ ๋ฐ์ดํฐ์ ๋ฆฌ์์ค๊ฐ ์ ๊ณต๋๋ค๋ฉด, ๊น์ ์ ๊ฒฝ๋ง์ ๋งค์ฐ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํจ๊ณผ์ ์ผ ์ ์๋ค.
๊ธ์ต์ํ ๊ฐฑ์ (0 ๋๋ 1) ์ฌ๋ถ ์์ธกํ๋ ANN ๋ง๋ค๊ธฐ
Churn_Modelling.csv ํ์ผ์ ๋ณด๋ฉด, ๊ณ ๊ฐ ์ ๋ณด์ ํด๋น ๊ณ ๊ฐ์ด ๊ธ์ต์ํ์ ๊ฐฑ์ ํ๋์ง ์ํ๋์ง์ ์ฌ๋ถ์ ๋ํ ๋ฐ์ดํฐ๊ฐ ์๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฐฑ์ ์ฌ๋ถ๋ฅผ ์์ธกํ๋ ๋ฅ๋ฌ๋์ ๊ตฌ์ฑํ์์ค.
df
nan๊ฐ ์ ๋ฆฌํ๊ธฐ
df.isna().sum()
RowNumber 0
CustomerId 0
Surname 0
CreditScore 0
Geography 0
Gender 0
Age 0
Tenure 0
Balance 0
NumOfProducts 0
HasCrCard 0
IsActiveMember 0
EstimatedSalary 0
Exited 0
dtype: int64
ํน์ฑ์ด๊ณผ ๋์์ด๋ก ๋๋๊ธฐ
ํน์ฑ ์ด(X)์ ๋ฐ์ดํฐ์
์์ ๊ฐ๊ฐ์ ๊ด์ธก์น์ ๋ํ ์ค๋ช
๋ณ์๋ฅผ ๋ํ๋ธ๋ค
๋์ ์ด(y)์ ์์ธกํ๋ ค๋ ๊ฐ์ด ํฌํจ๋ ์ด์ด๋ค
y = df['Exited']
X = df.loc[: , 'CreditScore':'EstimatedSalary' ]
X
๋ฌธ์์ด์ ์ซ์์ด๋ก ๋ฐ๊พธ๊ธฐ
X['Geography'].nunique() # ์ํซ ์ธ์ฝ๋ฉ
3
X['Gender'].nunique() # ๋ ์ด๋ธ ์ธ์ฝ๋ฉ
2
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.compose import ColumnTransformer
le = LabelEncoder()
X['Gender'] = le.fit_transform(X['Gender'])
sorted(X['Geography'].unique())
['France', 'Germany', 'Spain']
ct = ColumnTransformer(
[('encoder', OneHotEncoder(), [1])],
remainder='passthrough'
)
X = ct.fit_transform(X)
Dummy Variable Trap (๋๋ฏธ)
X = pd.DataFrame(X).drop(0, axis=1).values
์ฑ๋ฅ์ ์ํด์ ํ๋์ ์ปฌ๋ผ์ ์ญ์ ํ๋ ๊ฒ์ด๋ค
์ ํซ ์ธ์ฝ๋ฉํ ๊ฒฐ๊ณผ์์, ๊ฐ์ฅ ์ผ์ชฝ์ ์ปฌ๋ผ์ ์ญ์ ํด๋ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐ๋ ์๋ฌด ๋ฌธ์ ์๋ค.
'France', 'Germany', 'Spain'
1 0 0
0 1 0
0 0 1
๋งจ ์ผ์ชฝ France ์ปฌ๋ผ์ ์ญ์ ํด๋,
0 0 => France
1 0 => Germany
0 1 => Spain
์๋ฌด ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค
ํผ์ณ์ค์ผ์ผ๋ง
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit_transform(X)
train๊ณผ test๋ก ๋๋๊ธฐ
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
๋ชจ๋ธ๋ง (ANN)
import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense # Dense๋ ์์ ์ฐ๊ฒฐ ์ธต์ ์๋ฏธํ๋ค
model = Sequential() # Sequential ์ธ๊ณต์ง๋ฅ(API)์ ์ฌ์ฉํ์ฌ ์์ฐจ์ ์ผ๋ก ์ธต์ ์์๊ฐ๋ค
model.add( Dense(units = 8, activation='relu',input_shape=(11,)) )
# ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์ธต. 11๊ฐ์ ์ ๋ ฅ ํน์ฑ์ ๋ฐ์ 8๊ฐ์ ๋ด๋ฐ์ผ๋ก ์ฐ๊ฒฐ๋๋ค. ํ๋ ๋ ์ด์ด์ ํ์ฑํ ํจ์๋ ReLU๋ฅผ ์ฌ์ฉํ๋ค
model.add( Dense(6, 'relu') )
# ์๋์ธต. ์ ๋ ฅ ํน์ฑ์ ๋ฐ์๋ค์ด๊ณ 6๊ฐ์ ๋ด๋ฐ์ ๊ฐ์ง๋ฉฐ, ํ๋ ๋ ์ด์ด์ ํ์ฑํ ํจ์๋ ReLU๋ฅผ ์ฌ์ฉํ๋ค
model.add( Dense(1, 'sigmoid') )
# ์ถ๋ ฅ์ธต. ํ๋์ ๋ด๋ฐ์ ๊ฐ์ง๋ฉฐ, ํ์ฑํ ํจ์๋ก๋ ์๊ทธ๋ชจ์ด๋(Sigmoid) ํจ์๊ฐ ์ฌ์ฉ๋๋ค. ์ด๋ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฐ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ ํจ์๋ก, ์ถ๋ ฅ๊ฐ์ 0๊ณผ 1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ๋ณํ์์ผ์ค๋ค.
model.summary() # ๋ชจ๋ธ์ ๊ตฌ์กฐ๋ฅผ ์์ฝํ์ฌ ๋ณด์ฌ์ฃผ๋ ํจ์
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 8) 96
_________________________________________________________________
dense_1 (Dense) (None, 6) 54
_________________________________________________________________
dense_2 (Dense) (None, 1) 7
=================================================================
Total params: 157
Trainable params: 157
Non-trainable params: 0
_________________________________________________________________
์์ฝ์ ํตํด ๊ฐ ์ธต์ ๊ตฌ์ฑ๊ณผ ์ถ๋ ฅ ํํ, ํ๋ผ๋ฏธํฐ ์๋ฅผ ํ์ธํ ์ ์๋ค
Param #๋ ํด๋น ์ธต์ ๊ฐ์ค์น(weight)์ ํธํฅ(bias)์ ๋ํ๋ด๋ ํ๋ผ๋ฏธํฐ ์๋ฅผ ์๋ฏธํ๋ค
์ปดํ์ผ(Compile)
์ปดํ์ผ์
1. ์ตํฐ๋ง์ด์ (optimizer) # ์ค์ฐจ๋ฅผ ์ค์ด๋ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ํํ ์ต์ (์ต์ ๋น์ฉ)์ ์ฒ๋ฆฌ๊ฒฝ๋ก๋ฅผ ์์ฑํด์ค๋ค
2. ๋ก์คํ์ (loss function ์ค์ฐจํจ์, ์์คํจ์) ์ ํ
- 2๊ฐ๋ก ๋ถ๋ฅํ๋ ๋ฌธ์ ์ loss๋ 'binary_crossentropy'๋ก ์ค์
- ex ) ๋ง์ฝ mse๋ก ์ค์ ํ๋ฉด ๋ชจ๋ธ์ด ํ๋ จ๋ ๋ MSE๋ฅผ ์ต์ํํ๋๋ก ํ์ต๋๋ค
3. ๊ฒ์ฆ๋ฐฉ๋ฒ ์ ํ
์์๋ก ์งํํ๋ค
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit( X_train, y_train, batch_size = 10, epochs = 20)
๋ฅ๋ฌ๋์์ "์ํฌํฌ(epochs)"๋ ํ ๋ฒ์ ํ์ต ๊ณผ์ ์์ ์ ์ฒด ๋ฐ์ดํฐ์ ์ด ๋ชจ๋ธ์ ๋ํด ํ ๋ฒ ํต๊ณผํ๋ ํ์๋ฅผ ๋งํ๋ค
์ฆ, ์ํฌํฌ๋ ๋ชจ๋ธ์ด ํ๋ จ ๋ฐ์ดํฐ์ ์ ์ฒด๋ฅผ ๋ช ๋ฒ์ด๋ ๋ฐ๋ณตํด์ ํ์ตํ๋์ง๋ฅผ ๋ํ๋ด๋ ์งํ๋ฅผ ๋ปํ๋ค
๊ฒ์ฌ(Test) ํ๊ธฐ
model.evaluate(X_test, y_test)
63/63 [==============================] - 0s 2ms/step - loss: 0.3386 - accuracy: 0.8570
[0.3385504186153412, 0.8569999933242798]
# confusion matrix๋ก ํ์ธํ๊ธฐ
from sklearn.metrics import confusion_matrix, accuracy_score
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5)
cm = confusion_matrix(y_test, y_pred)
print(cm)
63/63 [==============================] - 0s 1ms/step
[[1496 99]
[ 187 218]]
(1496 + 218) / cm.sum() #์ ํ๋
0.857
accuracy_score(y_test, y_pred) #์ ํ๋
0.857
์๋ก์ด ๋ฐ์ดํฐ ์ ๋ ฅ๋ฐ์์ ๋
new_data2 = [{'CreditScore': 600,'Geography':'France','Gender':'Male', 'Age':40, 'Tenure':3, 'Balance':60000, 'NumOfProducts':2,'HasCrCard': 1, 'IsActiveMember':1, 'EstimatedSalary':50000}]
# ์ด๋ ๊ฒ [{ํค-๊ฐ}]์์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ JSON๋ฐ์ดํฐ ํํ๋ผ๊ณ ํ๋ค
# JSON(JavaScript Object Notation)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ์กํ๊ธฐ ์ํ ๊ฒฝ๋์ ๋ฐ์ดํฐ ํ์์ด๋ค.
# JSON ๋ฐ์ดํฐ์์ ๊ฐ์ฒด๋ ์ค๊ดํธ({})๋ก ํ์๋๋ฉฐ, ๋ฐฐ์ด์ ๋๊ดํธ([])๋ก ํ์๋๋ค
new_data = pd.DataFrame(new_data2)
#๋ผ๋ฒจ์ธ์ฝ๋ฉ ํด์ฃผ๊ธฐ
new_data['Gender'] = le.transform(new_data['Gender'])
#์ํซ์ธ์ฝ๋ฉ ํด์ฃผ๊ธฐ
new_data = ct.transform(new_data)
#๋๋ฏธ (์ํซ์ธ์ฝ๋ฉ์์ ์ฒซ๋ฒ์งธ ์ด ์ ๊ฑฐํ๋ ๊ฒ)
new_data = pd.DataFrame(new_data).drop(0, axis=1).values
#ํผ์ฒ์ค์ผ์ผ๋ง
new_data = sc.transform(new_data)
#์์ธกํ๊ธฐ
y_pred = model.predict(new_data2)
(y_pred > 0.5).astype(int)
array([[0]])
๊ฒฐ๊ณผ : ์๋ก์ด ๋ฐ์ดํฐ์ ๊ณ ๊ฐ์ ๊ฐฑ์ ํ์ง ์์ ๊ฒ์ด๋ค.
'ML (MachineLearning)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ฐฑ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ AI์๊ฒ ํ๋ณ์์ผ, ์นดํ ๊ณ ๋ฆฌ์ ์ ๋ต์ ๋ง์ถ๋ ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฒ (0) | 2024.04.18 |
---|---|
GridSearch ๋ฅผ ์ด์ฉํ ์ต์ ์ ํ์ดํผ ํ๋ผ๋ฏธํฐ ์ฐพ๊ธฐ (0) | 2024.04.17 |
๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ์์ฝ (0) | 2024.04.16 |
ํ์ด๋ผํค ํด๋ฌ์คํฐ๋ง(Hierarchical Clustering) : ๊ณ์ธต์ ๊ตฐ์ง (0) | 2024.04.16 |
K-Means ์๊ณ ๋ฆฌ์ฆ (0) | 2024.04.16 |