# 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으로 지정한다.