줘이리의 인생적기

[tensorflow 16] 이항 분류01 본문

공부/tensorflow

[tensorflow 16] 이항 분류01

줘이리 2021. 5. 17. 22:00
728x90

이항 분류는 정답의 범주가 2개인 분류 문제입니다.

 

예를 들어, 개냐 고양이냐, 사람이냐 자동차냐하는 문제이죠.

 

 

이항 분류에서 또 유명한 데이터셋이죠

 

와인 데이터를 이용하여 이항 분류를 공부해보겠습니다.

 

와인 데이터셋은 앞서 공부한 보스턴 가격 주택처럼 keras와 tensorflow처럼 내장되어 있지 않습니다.

 

외부에서 데이터를 불러오는 과정이 필요합니다.

 


 

먼저 이 데이터는 당도, 밀도, 산도, 알코올 도수, 품질 등 12개 속성을 가지고 있습니다.

 

첫 번째로 할 일은 이 데이터를 사용하기 위해 화이트인지 레드인지에 대한 속성을 추가해주어야겠죠

 

두 번째는 데이터들을 합치고, 랜덤하게 섞는 과정이 필요합니다.

 

마지막은 보스턴 주택 가격 데이터셋에서 했던 것처럼 데이터 정규화가 필요합니다.


정규화 전까지의 작업을 해보도록 하겠습니다.

 

import pandas as pd
import tensorflow as tf

#wine 데이터 받아오기
red = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv', sep=';')
white = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv', sep=';')

#red wine 일 때 type 0 속성 추가
red['type'] = 0
#white wine 일 때 type 1 속성 추가
white['type'] = 1

#wine 확인
print("red wine 데이터")
print(red.head())
print("white wine 데이터")
print(white.head())

#pandas cancat으로 두 와인 데이터 합치기
wine = pd.concat([red, white])
print("wine 데이터 describe")
print(wine.describe())

#red wine, white wine 갯수 비교
print(wine['type'].value_counts())

#info 함수로 데이터에 잘못된 정보들이 있는가 확인
#정규화를 위해 필수적인 작업
print(wine.info())

 

첫 번째 print 결과 입니다. red wine과 white wine 데이터의 결과인데요

마지막에 type 속성을 추가하였습니다.

 

describe print 결과 입니다.

 

type의 mean값을 보면 0.75로 속성이 1인 white wine이 3배 정도 많다는 걸 알 수 있죠.

 

value_counts를 통해 알아본 결과는 red wine은 1599개, white wine 은 4898개입니다.

약 3배보다 조금 더 넘는 수로 white wine이 많다는 걸 알 수 있습니다.


이제 데이터 파악은 끝나고, 정규화를 시작해볼 텐데요

 

정규화를 하기 전에는 데이터에 잘못된 정보들이 있는가 확인이 필요합니다

 

정보들을 확인한 후에 데이터들을 랜덤으로 섞고, train, test 셋으로 나누어 보겠습니다.

 

 

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

#wine 데이터 받아오기
red = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv', sep=';')
white = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv', sep=';')

#red wine 일 때 type 0 속성 추가
red['type'] = 0
#white wine 일 때 type 1 속성 추가
white['type'] = 1

#wine 확인
print("red wine 데이터")
print(red.head())
print("white wine 데이터")
print(white.head())

#pandas cancat으로 두 와인 데이터 합치기
wine = pd.concat([red, white])
print("wine 데이터 describe")
print(wine.describe())

#red wine, white wine 갯수 비교
print(wine['type'].value_counts())

#info 함수로 데이터에 잘못된 정보들이 있는가 확인
#정규화를 위해 필수적인 작업
print(wine.info())

#정규화
wine_norm = (wine - wine.min()) / (wine.max() - wine.min())

#데이터 섞기, farc=1은 모든 데이터를 섞겠다는 뜻의 인자
wine_shuffle = wine_norm.sample(frac=1)
print("데이터 랜덤 섞기")
print(wine_shuffle.head())

#numpy로 변환
wine_np = wine_shuffle.to_numpy()
print(wine_np[:5])

#80퍼센트 데이터를 train
train_idx = int(len(wine_np) * 0.8)

#X는 12개의 속성, Y는 추가한 wine의 type 정보
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] = ", train_X[0])
print("train_Y[0] = ", train_Y[0])
print("test_X[0] = ", test_X[0])
print("test_Y[0] = ", test_Y[0])

info()를 통해 얻은 정보입니다. 각 type에 해당하지 않는 데이터가 없네요. 깔끔하죠

 

type을 보시면 마구잡이로 데이터가 섞인 것을 알 수 있습니다.

 

위의 데이터를 numpy형식으로 바꾼 결괏값입니다.

 

지정한 train과 test의 첫 번째 값입니다. 

 

train, test 데이터셋 분배까지 잘 되었네요