텐서플로공부

텐서플로 정리 4탄

백준파이썬개발자:프로젝트골드 2024. 1. 11. 08:01
반응형
# 5.1 와인 데이터셋 불러오기
import pandas as pd
print(red.head())
print(white.head())

위코드는 와인데이터를 불러오는 코드이다.

결과는 위결과이다.

 

변수를 정하면 다음과같다.

이제 13번째 칼럼을 만들어보겠다.

# 5.2 와인 데이터셋 합치기
red['type'] = 0
white['type'] = 1
print(red.head(2))
print(white.head(2))

wine = pd.concat([red, white])
print(wine.describe())

red와인인경우 0이며 white와인이라면 1이라는 라벨을붙혀준다음 wine이라는 변수로 합쳐춘다.

합쳐줄때사용하는 함수는 concat이다.

 

# 5.3 레드 와인과 화이트 와인 type 히스토그램
import matplotlib.pyplot as plt
plt.hist(wine['type'])
plt.xticks([0, 1])
plt.show()

print(wine['type'].value_counts())

 

위코드를 통해서 그래프를 출력하면 다음과같다.

# 5.5 데이터 정규화
wine_norm = (wine - wine.min()) / (wine.max() - wine.min())
print(wine_norm.head())
print(wine_norm.describe())

 

데이터를 정규화를 하는 코드이다.

이것을 하는 이유는 앞선 sigmoide와 같은 이유이다.

값의 범위를 줄이기 위함이다.

각자의 값의 최대값에서 최소값을 뺀후 나눈다면 0~ 1사이값을 가질수있다.

 

이제 학습을 위해서 데이터의 위치를 섞어주는 작업을 진행한다.

# 5.6 데이터 섞은 후 numpy array로 변환
import numpy as np
wine_shuffle = wine_norm.sample(frac=1)
print(wine_shuffle.head())
wine_np = wine_shuffle.to_numpy()
print(wine_np[:5])

 

여기서 sample이라는 함수를 통해서 무작위로 섞어준다.

# 5.7 train 데이터와 test 데이터로 분리
import tensorflow as tf
train_idx = int(len(wine_np) * 0.8)
train_X, train_Y = wine_np[:train_idx, :-1], wine_np[:train_idx, -1]
test_X, test_Y = wine_np[train_idx:, :-1], wine_np[train_idx:, -1]
print(train_X[0])
print(train_Y[0])
print(test_X[0])
print(test_Y[0])
train_Y = tf.keras.utils.to_categorical(train_Y, num_classes=2)
test_Y = tf.keras.utils.to_categorical(test_Y, num_classes=2)
print(train_Y[0])
print(test_Y[0])

위코드는 간단하다. 학습데이터와 테스트 데이터를 분리한다.

인공지능이 학습데이터로 학습을 진행하고 테스트데이터로 성능을 확인하기 위함이다.

 

# 5.8 와인 데이터셋 분류 모델 생성
import tensorflow as tf
model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=48, activation='relu', input_shape=(12,)),
    tf.keras.layers.Dense(units=24, activation='relu'),
    tf.keras.layers.Dense(units=12, activation='relu'),
    tf.keras.layers.Dense(units=2, activation='softmax')
])

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.07), loss='categorical_crossentropy', metrics=['accuracy'])

model.summary()

위코드를 위해서 오늘 글을 작성해도 과언ㅇ ㅣ아니다.

위코드는 이전 회귀와 비슷하지만 다른점은 softmax로 끝낸다는점이다.

softmax는 값이 1,2,3가 있을경우

[e^1/sum, e^2/sum, e^3/sum]으로 되어있다.

즉 최대값이 1이하이다.

# 5.9 와인 데이터셋 분류 모델 학습
history = model.fit(train_X, train_Y, epochs=25, batch_size=32, validation_split=0.25)

위코드로 학습을 시킨다.

이후 다음과같은 결과를 얻는다.

# 5.11 분류 모델 평가
model.evaluate(test_X, test_Y)

 

다항분류

 

# 5.13 품질 히스토그램 시각화
import matplotlib.pyplot as plt
plt.hist(wine['quality'], bins=7, rwidth=0.8)
plt.show()

# 5.14 품질을 3개의 범주(좋음, 보통, 나쁨)로 재분류
wine.loc[wine['quality'] <= 5, 'new_quality'] = 0
wine.loc[wine['quality'] == 6, 'new_quality'] = 1
wine.loc[wine['quality'] >= 7, 'new_quality'] = 2

print(wine['new_quality'].describe())
print(wine['new_quality'].value_counts())

 

위코드는 간단하다.

퀄리티가 6에 가장많이 분포되어있다.

그래서 값을 5이하 6인경우 7이상으로 3가지로 분류를 한것이다.

 

이코드를 통해서 학습데이터와 테스트 데이터를 분리한다.

아래코드는 그동안해온것과 다를게없는 코드이다.

# 5.15 데이터 정규화 및 train, test 데이터 분리
del wine['quality']
wine_backup = wine.copy()
wine_norm = (wine - wine.min()) / (wine.max() - wine.min())
wine_norm['new_quality'] = wine_backup['new_quality']
wine_shuffle = wine_norm.sample(frac=1)
wine_np = wine_shuffle.to_numpy()

train_idx = int(len(wine_np) * 0.8)
train_X, train_Y = wine_np[:train_idx, :-1], wine_np[:train_idx, -1]
test_X, test_Y = wine_np[train_idx:, :-1], wine_np[train_idx:, -1]
train_Y = tf.keras.utils.to_categorical(train_Y, num_classes=3)
test_Y = tf.keras.utils.to_categorical(test_Y, num_classes=3)

 

그래서 다항분류를 위해서 다음과같이 모델을 구성한다.

# 5.16 와인 데이터셋 다항 분류 모델 생성 및 학습
model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=48, activation='relu', input_shape=(12,)),
    tf.keras.layers.Dense(units=24, activation='relu'),
    tf.keras.layers.Dense(units=12, activation='relu'),
    tf.keras.layers.Dense(units=3, activation='softmax')
])

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.003), loss='categorical_crossentropy', metrics=['accuracy'])

history = model.fit(train_X, train_Y, epochs=25, batch_size=32, validation_split=0.25)

3가지의 카테고리이기때문에 마지막의 units은 3으로 지정한다.

반응형