09_DL(Deep_Learning)

06_초음파 광물 예측

chuuvelop 2025. 4. 24. 17:20
728x90
초음파 광물 예측

 

 

초음파 광물 예측 데이터

  • 1988년 존스홉킨스 대학교의 세즈노프스키 교수가 1986년 힌튼 교수가 발표한 역전파 알고리즘에 관심을 갖고 은닉층과 역전파의 효과를 실험하기 위해 정리한 데이터
  • 광석과 일반 돌에 각각 음파 탐지기를 쏜 후 그 결과를 정리

 

import pandas as pd
from tensorflow import keras
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
import missingno as msno

import matplotlib.pyplot as plt

 

df = pd.read_csv("./data/sonar.csv", header = None)
df.head()

 

df.shape
(208, 61)

 

df.describe()

 

 

df.isna().sum()
0     0
1     0
2     0
3     0
4     0
     ..
56    0
57    0
58    0
59    0
60    0
Length: 61, dtype: int64

 

 

# 컬럼이 너무 많아서 결측치 확인이 힘듦

 

# pip install missingno

 

# 결측치 유무 확인
msno.matrix(df)

 

 

df[60].value_counts()
60
M    111
R     97
Name: count, dtype: int64

 

x = df.iloc[:, :-1]
y = df.iloc[:, -1]

 

 

 

ver1(원핫인코딩 방식)

enc_y = pd.get_dummies(y, dtype = int)

 

enc_y.head()

 

 

# 데이터 분할
x_train, x_test, y_train, y_test = train_test_split(x, enc_y, test_size = 0.2, stratify = enc_y, random_state = 26)
x_sub, x_val, y_sub, y_val = train_test_split(x_train, y_train, test_size = 0.2, stratify = y_train, random_state = 26)

 

x_sub.shape, x_val.shape, x_test.shape
((132, 60), (34, 60), (42, 60))

 

 

# 스케일링
mm = MinMaxScaler()
scaled_sub = mm.fit_transform(x_sub)
scaled_val = mm.transform(x_val)
scaled_test = mm.transform(x_test)

 

# 모델링
model = keras.Sequential()
model.add(keras.Input(shape = (60,))) # 입력층
model.add(keras.layers.Dense(64, activation = "relu")) # 은닉층
model.add(keras.layers.Dense(32, activation = "relu"))
model.add(keras.layers.Dense(2, activation = "softmax")) # 출력층

 

model.summary()

 

 

model.compile(loss = "categorical_crossentropy", optimizer = "adam", metrics = ["accuracy"])
es_cb = keras.callbacks.EarlyStopping(patience = 8, restore_best_weights = True)
model.fit(scaled_sub, y_sub, epochs = 200, batch_size=16, validation_data=(x_val, y_val),
         callbacks=[es_cb])

 

 

model.evaluate(scaled_test, y_test)

[0.45047587156295776, 0.6904761791229248]

 

 

ver2(LableEncoder)

le = LabelEncoder()
y = le.fit_transform(y)

 

y
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

 

 

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, stratify = y,
                                                    random_state = 26)
x_sub, x_val, y_sub, y_val = train_test_split(x_train, y_train, test_size = 0.2, stratify = y_train,
                                              random_state = 26)

 

mm = MinMaxScaler()
scaled_sub = mm.fit_transform(x_sub)
scaled_val = mm.transform(x_val)
scaled_test = mm.transform(x_test)
model2 = keras.Sequential()
model2.add(keras.Input(shape=(60,)))
model2.add(keras.layers.Dense(64, activation = "relu"))
model2.add(keras.layers.Dense(32, activation = "relu"))
model2.add(keras.layers.Dense(1, activation = "sigmoid")) # 이진분류이므로 sigmoid선호

 

 

model2.compile(loss = "binary_crossentropy", optimizer = "adam", metrics = ["accuracy"])

 

es_cb = keras.callbacks.EarlyStopping(patience = 8, restore_best_weights = True)

 

model2.fit(scaled_sub, y_sub, epochs = 200, batch_size = 16, validation_data = (scaled_val, y_val),
           callbacks = [es_cb])

...

 

 

model2.evaluate(scaled_test, y_test)

[0.4113645553588867, 0.8333333134651184]

 

 

model2.predict(scaled_test[:5])

array([[0.52603143],
       [0.9594594 ],
       [0.995561  ],
       [0.7798952 ],
       [0.4923146 ]], dtype=float32)

 

 

y_test[:5]
array([0, 1, 1, 1, 0])
728x90

'09_DL(Deep_Learning)' 카테고리의 다른 글

08_합성곱 신경망_구성요소  (0) 2025.04.24
07_보스턴 집값 예측  (0) 2025.04.24
05_다중분류(Iris)  (0) 2025.04.23
04_신경망 모델 훈련 도구  (1) 2025.04.23
월별 사인(sin) 코사인(cos) 시각화  (0) 2025.04.21