포트폴리오

python - tensorflow(iris 데이터셋 이용)

leegunho 2022. 6. 28. 12:08
import tensorflow as tf
import pandas as pd
import requests
import matplotlib.pyplot as plt
import numpy as np
 
# downloadDataOnline 에 url 을 넣고 컴퓨터 안에 csv 파일이 없어도 언제든지 다운받아 실행시킬수 있도록 해봤습니다.
#인터넷이 안된다면 오히려 안좋은 코드가 될수도 있을꺼 같습니다. (사용자 정의함수 생성)
#requests = Python용 HTTP 라이브러리이며, 간단하게는 HTTP, HTTPS 웹 사이트에 요청하기 위해 자주 사용되는 모듈 .get 이용 페이지를 얻어야하니까.
#allow_redirects = (url 리다이렉션) 이용 가능한 웹 페이지를 하나 이상의 URL 주소로 만들어주는 월드 와이드 웹 기법
#  allow_redirects = True 인 경우 리디렉션이 수행 된 후 리디렉션 된 후 최종 페이지가 반환됩니다. allow_redirects가 False이면 리디렉션 인 경우에도 첫 번째 응답이 반환됩니다.(301같은)
def downloadDataOnline(url):
    r = requests.get(url, allow_redirects=True)
    open('iris.data', 'wb').write(r.content)
 
 
downloadDataOnline('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')
 
#열이름을 F1, F2, F3, F4, Lable 로 생성
df=pd.read_csv('iris.data',header=None,names=['F1','F2','F3','F4','Label'])
df.head()
 
from sklearn.preprocessing import LabelEncoder
labelEncoder=LabelEncoder()
df['Label']=labelEncoder.fit_transform(df['Label'].to_numpy())
df.head()
#데이터 전처리 패키지 불러오기
from sklearn.model_selection import train_test_split
# 데이터 세트를 학습용과 테스트용 으로 나누기 위해 사이킷런의 train_test_split 을 이용!
#to_numpy()=배열 객체인 ndarray로 반환 하는 함수
#df.loc = 2차원, 행열 에서 행또는 열의 데이터를 조회하기 위해 df.loc 로 만듬
npX=df.loc[:,['F1','F2','F3','F4']].to_numpy()
# reshape(-1,1) 열의 값은 특정 정수로 지정이 되어있을 때, 남은 배열의 길이와 남은 차원으로부터 추정해서 알아서 지정하라는 의미입니다
#-1,1 (12개행이 있다고 가정) = 열이 1로 정해졌으니, 12개 행이 만들어짐
#-1,2 (12개 행이 있다고 가정) = 열이 2로 정해졌으니, 6개 행이 만들어짐
#-1,3 (12개 행이 있다고 가정) = 열이 3로 정해졌으니, 4개 행이 만들어짐
npY=df['Label'].to_numpy().reshape(-1,1)
npY
#training set의 정확도가 낮다면 size=0.2를 더 높이고 정확도가 높다면 낮추면됨. 0.2가 적당해 보여서 0.2로 지정
X_train, X_test, y_train, y_test = train_test_split(npX, npY, test_size=0.2)
 
# 모델학습
#Sequential = 층추가
#Dropout=모델의 과적합 문제는 정규화(regularization) 해결 하는데 주로 사용됩니다.
#과적합 이란, ABCD 모델 4개에 대해서 설명하는 알고리즘 을 만들다 보니까 A,B,C,D는 100%에 가깝게 잘 설명하는 반면, 새데이터 인 E 데이터를 에측하는 능력이 떨어집니다.
#이를 과적합 이라고 합니다.
#tf.keras.layers.Dropout(0.1) = 0~1사이 확률
#activation='relu' 은닉층에 주로 사용되는 활성화 함수. tf.keras.layers.Dense(10, activation='relu') input 레이어 가 10개
#activation='softmax' 셋 이상의 선택지 중 하나를 택하는 다중 클래스 분류 문제에서 출력층에 주로 사용되는 활성화 함수.
model = tf.keras.models.Sequential([
  tf.keras.layers.Dropout(0.1),
  tf.keras.layers.Dense(10, activation='relu'),
  tf.keras.layers.Dropout(0.1),
  tf.keras.layers.Dense(3, activation='softmax')
])
#compile() : 모델을 기계가 이해할 수 있도록 컴파일 합니다. 손실 함수와 옵티마이저, 메트릭 함수를 선택합니다.
'''
optimizer = 훈련 과정을 설정하는 옵티마이저를 설정합니다.
loss = 훈련 과정에서 사용할 손실 함수(loss function)를 설정합니다.
metrics = 훈련을 모니터링하기 위한 지표를 선택합니다.
'''
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#fit() : 모델을 학습합니다 epochs= 횟수
model.fit(X_train, y_train, epochs=40)
 
model.evaluate(X_test,  y_test, verbose=2)

결과

 

accuracy(정확도):0.7333, loss(손실):0.6722 가 나왔습니다.