<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발새발코딩</title>
    <link>https://dbfoot.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 12 Jul 2026 23:11:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>HooSL</managingEditor>
    <image>
      <title>개발새발코딩</title>
      <url>https://tistory1.daumcdn.net/tistory/5052646/attach/6e049d6d64644ec2b631b8e14e0485ec</url>
      <link>https://dbfoot.tistory.com</link>
    </image>
    <item>
      <title>파파고 API 구현 코드</title>
      <link>https://dbfoot.tistory.com/181</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers.naver.com/docs/papago/papago-nmt-overview.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developers.naver.com/docs/papago/papago-nmt-overview.md&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648622436659&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Papago 번역 - Papago API&quot; data-og-description=&quot;Papago 번역 개요 Papago 번역 개요 Papago 번역은 Papago의 인공 신경망 기반 기계 번역 기술(NMT, Neural Machine Translation)로 텍스트를 번역한 결과를 반환하는 RESTful API입니다. Papago 번역으로 번역할 수 있&quot; data-og-host=&quot;developers.naver.com&quot; data-og-source-url=&quot;https://developers.naver.com/docs/papago/papago-nmt-overview.md&quot; data-og-url=&quot;https://developers.naver.com/docs/papago/papago-nmt-overview.md&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cY8EqG/hyNQ32D3Ex/rDqeTIX2gyRIG1x1ArqHSk/img.png?width=911&amp;amp;height=730&amp;amp;face=0_0_911_730,https://scrap.kakaocdn.net/dn/ipEVI/hyNR970ERv/UUKNmLBAkCKAzE1dTGLRI0/img.png?width=1199&amp;amp;height=394&amp;amp;face=0_0_1199_394&quot;&gt;&lt;a href=&quot;https://developers.naver.com/docs/papago/papago-nmt-overview.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developers.naver.com/docs/papago/papago-nmt-overview.md&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cY8EqG/hyNQ32D3Ex/rDqeTIX2gyRIG1x1ArqHSk/img.png?width=911&amp;amp;height=730&amp;amp;face=0_0_911_730,https://scrap.kakaocdn.net/dn/ipEVI/hyNR970ERv/UUKNmLBAkCKAzE1dTGLRI0/img.png?width=1199&amp;amp;height=394&amp;amp;face=0_0_1199_394');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Papago 번역 - Papago API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Papago 번역 개요 Papago 번역 개요 Papago 번역은 Papago의 인공 신경망 기반 기계 번역 기술(NMT, Neural Machine Translation)로 텍스트를 번역한 결과를 반환하는 RESTful API입니다. Papago 번역으로 번역할 수 있&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developers.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 코드&lt;/p&gt;
&lt;pre id=&quot;code_1648622754728&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

URL = &quot;https://openapi.naver.com/v1/papago/n2mt&quot;

text = '파이썬 너무 어려워요'

header = {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
            'X-Naver-Client-Id':'개발자센터에서 발급받은 Client ID 값',
            'X-Naver-Client-Secret':'개발자센터에서 발급받은 Client Secret 값'}

data = {'source':'ko','target':'en','text':text} #source : 번역할 언어 , target : 번역된 언어

responce = requests.post(URL,data=data,headers=header)

print(responce.json())

print()

print(responce.json()['message']['result']['translatedText'])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;56.jpg&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTFIQ/btrxZC69wJH/nJ4kH2HUKrsvvE6jO7Fklk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTFIQ/btrxZC69wJH/nJ4kH2HUKrsvvE6jO7Fklk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTFIQ/btrxZC69wJH/nJ4kH2HUKrsvvE6jO7Fklk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTFIQ%2FbtrxZC69wJH%2FnJ4kH2HUKrsvvE6jO7Fklk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;86&quot; data-filename=&quot;56.jpg&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 코드&lt;/p&gt;
&lt;pre id=&quot;code_1648622875163&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import sys
import urllib.request
import json
client_id = &quot;개발자센터에서 발급받은 Client ID 값&quot;
client_secret = &quot;개발자센터에서 발급받은 Client Secret 값&quot; 

encText = urllib.parse.quote(&quot;반갑습니다&quot;) #번역할 문장

data = &quot;source=ko&amp;amp;target=en&amp;amp;text=&quot; + encText #source : 번역할 언어 , target : 번역된 언어
url = &quot;https://openapi.naver.com/v1/papago/n2mt&quot;
request = urllib.request.Request(url)
request.add_header(&quot;X-Naver-Client-Id&quot;,client_id)
request.add_header(&quot;X-Naver-Client-Secret&quot;,client_secret)
response = urllib.request.urlopen(request, data=data.encode(&quot;utf-8&quot;))
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
    print()
    json_dict = json.loads(response_body.decode('utf-8'))
    print(json_dict['message']['result']['translatedText'])
else:
    print(&quot;Error Code:&quot; + rescode)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;57.jpg&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9ZF2b/btrxVFYn2JA/mfvgaKi2KqurFsf97BXza1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9ZF2b/btrxVFYn2JA/mfvgaKi2KqurFsf97BXza1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9ZF2b/btrxVFYn2JA/mfvgaKi2KqurFsf97BXza1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9ZF2b%2FbtrxVFYn2JA%2FmfvgaKi2KqurFsf97BXza1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;86&quot; data-filename=&quot;57.jpg&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 코드가 더 간결합니다.&lt;/p&gt;</description>
      <category>API</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/181</guid>
      <comments>https://dbfoot.tistory.com/181#entry181comment</comments>
      <pubDate>Wed, 30 Mar 2022 15:51:10 +0900</pubDate>
    </item>
    <item>
      <title>CNN 이용하여 정교한 이미지 분류 (강아지, 고양이 분류)</title>
      <link>https://dbfoot.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;/tmp 컬럼에, 2000개의 이미지를 다운로드 받아서 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648526902226&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!wget --no-check-certificate \
  https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
  -O /tmp/cats_and_dogs_filtered.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축풀기&lt;/p&gt;
&lt;pre id=&quot;code_1648526930987&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
import os
#압축풀기
import zipfile
filename = '/tmp/cats_and_dogs_filtered.zip'
zip_ref = zipfile.ZipFile(filename,mode='r')
zip_ref.extractall('/tmp/cats_and_dogs_filtered')
zip_ref.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 억세스할 경로를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1648526956721&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_cats_dir = '/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/train/cats'
train_dogs_dir = '/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/train/dogs'

validation_cats_dir = '/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/validation/cats'
validation_dogs_dir = '/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/validation/dogs'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 확인해보기&lt;/p&gt;
&lt;pre id=&quot;code_1648526990810&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_cats_names = os.listdir(train_cats_dir)
train_dogs_names = os.listdir(train_dogs_dir)

validation_cats_names = os.listdir(validation_cats_dir)
validation_dogs_names = os.listdir(validation_dogs_dir)

print(train_cats_names)
print(train_dogs_names)
print(validation_cats_names)
print(validation_dogs_names)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트레이닝 이미지와 밸리데이션 이미지를 각각 몇개씩인지 확인해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1648527045706&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;len(train_cats_names)
len(train_dogs_names)
len(validation_cats_names)
len(validation_dogs_names)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강아지와 고양이 8개씩 화면에 이미지를 표시해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648527107514&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;%matplotlib inline

import matplotlib.image as mpimg
import matplotlib.pyplot as plt

# Parameters for our graph; we'll output images in a 4x4 configuration
nrows = 4
ncols = 4

pic_index = 0 # Index for iterating over images&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648527115818&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Set up matplotlib fig, and size it to fit 4x4 pics
fig = plt.gcf()
fig.set_size_inches(ncols*4, nrows*4)

pic_index+=8

next_cat_pix = [os.path.join(train_cats_dir, fname) 
                for fname in train_cats_names[ pic_index-8:pic_index] 
               ]

next_dog_pix = [os.path.join(train_dogs_dir, fname) 
                for fname in train_dogs_names[ pic_index-8:pic_index]
               ]

for i, img_path in enumerate(next_cat_pix+next_dog_pix):
  # Set up subplot; subplot indices start at 1
  sp = plt.subplot(nrows, ncols, i + 1)
  sp.axis('Off') # Don't show axes (or gridlines)

  img = mpimg.imread(img_path)
  plt.imshow(img)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 13-12-17-153.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;823&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dt1kJH/btrxQ3XIp7x/OtephFmA57wQClmKDmYOM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dt1kJH/btrxQ3XIp7x/OtephFmA57wQClmKDmYOM0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dt1kJH/btrxQ3XIp7x/OtephFmA57wQClmKDmYOM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt1kJH%2FbtrxQ3XIp7x%2FOtephFmA57wQClmKDmYOM0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;823&quot; data-filename=&quot;bandicam 2022-03-29 13-12-17-153.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;823&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지의 사이즈를 150x150, 칼라(rgb) 로 처리해서 모델링하는 함수를 만듭니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648527239971&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#라이브러리 import
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Flatten,Dense

#모델링 함수
def build_model():
  model = Sequential()
  model.add(Conv2D(filters=16,kernel_size=(3,3),activation='relu',input_shape=(150,150,3)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))

  model.add(Conv2D(filters=32,kernel_size=(3,3),activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))

  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))

  model.add(Flatten())

  model.add(Dense(units=512,activation='relu'))
  model.add(Dense(units=1,activation='sigmoid'))

  return model
  
  #모델 생성
  model = build_model()
  
  #모델 요약
  model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RMSprop 으로 컴파일합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648527264625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.optimizers import RMSprop,Adam,Adagrad,Adadelta #RMSprop 보폭

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(learning_rate=0.001),
              metrics=['accuracy'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data&amp;nbsp;Preprocessing&amp;nbsp;Image&amp;nbsp;Data&amp;nbsp;Generator&amp;nbsp;사용하기&lt;/p&gt;
&lt;pre id=&quot;code_1648527346299&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1/255.0)
validation_datagen = ImageDataGenerator(rescale=1/255.0)

train_generator = train_datagen.flow_from_directory('/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/train',target_size=(150,150),class_mode='binary')
validation_generator = validation_datagen.flow_from_directory('/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/validation',target_size=(150,150),class_mode='binary')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 훈련 15epochs&lt;/p&gt;
&lt;pre id=&quot;code_1648527358410&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;epoch_history = model.fit(train_generator,epochs=15,steps_per_epoch=8,validation_data=validation_generator)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 평가&lt;/p&gt;
&lt;pre id=&quot;code_1648527390579&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.evaluate(validation_generator)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 다른 사진을 넣고 비교해보기&lt;/p&gt;
&lt;pre id=&quot;code_1648527424609&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np

from google.colab import files
from keras.preprocessing import image

uploaded=files.upload()

for fn in uploaded.keys():
 
  # predicting images
  path='/content/' + fn
  img=image.load_img(path, target_size=(150, 150))
  
  x=image.img_to_array(img)
  x=np.expand_dims(x, axis=0)
  images = np.vstack([x])
  
  classes = model.predict(images, batch_size=10)
  
  print(classes[0])
  
  if classes[0]&amp;gt;0.5:
    print(fn + &quot; is a dog&quot;)
    
  else:
    print(fn + &quot; is a cat&quot;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>딥러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/180</guid>
      <comments>https://dbfoot.tistory.com/180#entry180comment</comments>
      <pubDate>Tue, 29 Mar 2022 13:17:14 +0900</pubDate>
    </item>
    <item>
      <title>Image Data Generator 사람과 말 분류</title>
      <link>https://dbfoot.tistory.com/179</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 파일 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말, 사람을 분류하기 위한 사진 파일 다운로드하기&lt;/p&gt;
&lt;pre id=&quot;code_1648525011001&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!wget --no-check-certificate \
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip \
    -O /tmp/horse-or-human.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인용&lt;/p&gt;
&lt;pre id=&quot;code_1648525019474&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;! wget --no-check-certificate \
    https://storage.googleapis.com/laurencemoroney-blog.appspot.com/validation-horse-or-human.zip \
    -O /tmp/validation-horse-or-human.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축풀기&lt;/p&gt;
&lt;pre id=&quot;code_1648525066698&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
import zipfile

filename = '/tmp/horse-or-human.zip'
zip_ref = zipfile.ZipFile(filename,mode='r')
zip_ref.extractall('/tmp/horse-or-human')
zip_ref.close()

import zipfile
filename = '/tmp/validation-horse-or-human.zip'
zip_ref = zipfile.ZipFile(filename,mode='r')
zip_ref.extractall('/tmp/validation-horse-or-human')
zip_ref.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진이 저장된 폴더 경로 만들기&lt;/p&gt;
&lt;pre id=&quot;code_1648525098641&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_horse_dir = '/tmp/horse-or-human/horses'
train_human_dir = '/tmp/horse-or-human/humans'

validation_horse_dir = '/tmp/validation-horse-or-human/horses'
validation_human_dir = '/tmp/validation-horse-or-human/humans'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 폴더에 저장되어 있는 사진파일 이름들 출력하기&lt;/p&gt;
&lt;pre id=&quot;code_1648525399392&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_horse_names = os.listdir(train_horse_dir)
train_human_names = os.listdir(train_human_dir)

validation_horse_names = os.listdir(validation_horse_dir)
validation_human_names = os.listdir(validation_human_dir)

#잘 나오는 지 확인용
print(validation_horse_names)
print(validation_human_names)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 디렉토리에 저장된 파일의 개수 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-44-30-712.jpg&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n9pgP/btrxLkSJoYy/Ae2IoSQbwCsELIChNZjKGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n9pgP/btrxLkSJoYy/Ae2IoSQbwCsELIChNZjKGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n9pgP/btrxLkSJoYy/Ae2IoSQbwCsELIChNZjKGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn9pgP%2FbtrxLkSJoYy%2FAe2IoSQbwCsELIChNZjKGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;327&quot; data-filename=&quot;bandicam 2022-03-29 12-44-30-712.jpg&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시각화로 사진 이미지 확인해 보기&lt;/p&gt;
&lt;pre id=&quot;code_1648525530809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;%matplotlib inline

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# Parameters for our graph; we'll output images in a 4x4 configuration
nrows = 4
ncols = 4

# Index for iterating over images
pic_index = 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 8마리, 사람 8명씩 이미지 확인하기&lt;/p&gt;
&lt;pre id=&quot;code_1648525559993&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Set up matplotlib fig, and size it to fit 4x4 pics
fig = plt.gcf()
fig.set_size_inches(ncols * 4, nrows * 4)

pic_index += 8
next_horse_pix = [os.path.join(train_horse_dir, fname) 
                for fname in train_horse_names[pic_index-8:pic_index]]
next_human_pix = [os.path.join(train_human_dir, fname) 
                for fname in train_human_names[pic_index-8:pic_index]]

for i, img_path in enumerate(next_horse_pix+next_human_pix):
  # Set up subplot; subplot indices start at 1
  sp = plt.subplot(nrows, ncols, i + 1)
  sp.axis('Off') # Don't show axes (or gridlines)

  img = mpimg.imread(img_path)
  plt.imshow(img)

plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-46-14-522.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIkjdQ/btrxNYhWsPy/GVmzNpHyGXUlFwjkjIVRfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIkjdQ/btrxNYhWsPy/GVmzNpHyGXUlFwjkjIVRfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIkjdQ/btrxNYhWsPy/GVmzNpHyGXUlFwjkjIVRfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIkjdQ%2FbtrxNYhWsPy%2FGVmzNpHyGXUlFwjkjIVRfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;802&quot; data-filename=&quot;bandicam 2022-03-29 12-46-14-522.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 모델링 하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진의 결과는 2개중의 하나이기 때문에 맨 마지막 액티베이션 함수는 시그모이드를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러리 import&lt;/p&gt;
&lt;pre id=&quot;code_1648525638785&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D,Flatten,Dense&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델링 함수&lt;/p&gt;
&lt;pre id=&quot;code_1648525650889&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def build_model():
  model = Sequential()
  model.add(Conv2D(filters=16,kernel_size=(3,3),activation='relu',input_shape=(300,300,3)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))

  model.add(Conv2D(filters=32,kernel_size=(3,3),activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))

  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu'))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))

  model.add(Flatten())

  model.add(Dense(units=512,activation='relu'))
  model.add(Dense(units=1,activation='sigmoid'))

  return model&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 생성, 요약&lt;/p&gt;
&lt;pre id=&quot;code_1648525674657&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = build_model()
model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RMSprop optimization algorithm 사용하여 컴파일&lt;/p&gt;
&lt;pre id=&quot;code_1648525818410&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.optimizers import RMSprop,Adam,Adagrad,Adadelta #RMSprop 보폭

model.compile(loss='binary_crossentropy',
              optimizer=RMSprop(learning_rate=0.001),
              metrics=['accuracy'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일로 되어있는 이미지를 학습을 위해서 넘파이로 바꿔줘야 합니다. &lt;br /&gt;실제로 복잡한 작업을 해야 하는것을 텐서플로우에서 쉽게 처리할수있게 라이브러리를 제공합니다.&lt;br /&gt;ImageDataGenerator&lt;/p&gt;
&lt;pre id=&quot;code_1648525877801&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from tensorflow.keras.preprocessing.image import ImageDataGenerator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일로 되어있는 이미지의 피쳐스케일링을 합니다 -&amp;gt; 255.0으로 나누는 것&lt;/p&gt;
&lt;pre id=&quot;code_1648525916337&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_datagen = ImageDataGenerator(rescale=1/255.0)
validation_datagen = ImageDataGenerator(rescale=1/255.0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이 들어있는 디렉토리를 알려주고, 이미지 사이즈 정보도 알려주고, 분류할 정보도 알려줍니다.&lt;br /&gt;&lt;br /&gt;target_size 파라미터는 우리가 마음대로 정해줄수있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 모델의 input_shape과 동일해야합니다.&lt;br /&gt;class_mode는, 2개 분류는 binary, 3개이상은 categorical로 설정&lt;/p&gt;
&lt;pre id=&quot;code_1648525958113&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_generator = train_datagen.flow_from_directory('/tmp/horse-or-human',target_size=(300,300),class_mode='binary')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;train_generator는 X_train과 y_train이 들어있게 됩니다. &lt;br /&gt;y_train의 값은 폴더의 이름으로 설정됩니다. &lt;br /&gt;따라서 폴더의 이름을 알파벳순으로 정렬한수 0부터 차례로 숫자를 매깁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648526004633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;validation_generator = validation_datagen.flow_from_directory('/tmp/validation-horse-or-human',target_size=(300,300),class_mode='binary')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 데이터수는 = batch_size x steps_per_epoch 와 같습니다. &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;nbsp; &amp;nbsp; &amp;nbsp; 20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 50&lt;/p&gt;
&lt;pre id=&quot;code_1648526083777&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;epoch_history = model.fit(train_generator,epochs=30,steps_per_epoch=8,validation_data=validation_generator)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-55-36-748.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diauAA/btrxTOlAC02/CuPTg62qkSHro4Q5OFFjFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diauAA/btrxTOlAC02/CuPTg62qkSHro4Q5OFFjFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diauAA/btrxTOlAC02/CuPTg62qkSHro4Q5OFFjFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiauAA%2FbtrxTOlAC02%2FCuPTg62qkSHro4Q5OFFjFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;522&quot; data-filename=&quot;bandicam 2022-03-29 12-55-36-748.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 결과, 시각화&lt;/p&gt;
&lt;pre id=&quot;code_1648526160250&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.evaluate(validation_generator)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-55-54-146.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kMQGd/btrxHWyKzk5/FKrdSKlaovdkt3pKO8R450/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kMQGd/btrxHWyKzk5/FKrdSKlaovdkt3pKO8R450/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kMQGd/btrxHWyKzk5/FKrdSKlaovdkt3pKO8R450/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkMQGd%2FbtrxHWyKzk5%2FFKrdSKlaovdkt3pKO8R450%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;100&quot; data-filename=&quot;bandicam 2022-03-29 12-55-54-146.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1648526183481&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(['Train','Validation'])
plt.savefig('chart1.jpg')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-56-16-420.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKM7U/btrxNY3lS1X/pIREWwFze4ii39DyzbwTqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKM7U/btrxNY3lS1X/pIREWwFze4ii39DyzbwTqK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKM7U/btrxNY3lS1X/pIREWwFze4ii39DyzbwTqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKM7U%2FbtrxNY3lS1X%2FpIREWwFze4ii39DyzbwTqK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;453&quot; data-filename=&quot;bandicam 2022-03-29 12-56-16-420.jpg&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648526227161&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
from google.colab import files
from tensorflow.keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys() :
  path = '/content/' + fn
  img = image.load_img(path, target_size=(300,300))     #target_size를 맞게 변경
  x = image.img_to_array(img)

  print(x.shape)

  x = np.expand_dims(x, axis = 0)

  print(x.shape)

  images = np.vstack( [x] )
  classes = model.predict( images, batch_size = 10 )
  
  print(classes)

  if classes[0] &amp;gt; 0.5 :                                #분류할 데이터의 이름을 맞게 변경하세요.
    print(fn + &quot; is a human&quot;)
  else :
    print(fn + &quot; is a horse&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 실행하고 파일 선택에 사람 또는 말 사진을 넣으면 지금까지 만든 모델이 분류를 해줍니다.&lt;/p&gt;</description>
      <category>딥러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/179</guid>
      <comments>https://dbfoot.tistory.com/179#entry179comment</comments>
      <pubDate>Tue, 29 Mar 2022 12:57:40 +0900</pubDate>
    </item>
    <item>
      <title>Convolutional Neural Networks</title>
      <link>https://dbfoot.tistory.com/178</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러리 import&lt;/p&gt;
&lt;pre id=&quot;code_1648523663348&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten,Conv2D,MaxPooling2D
from tensorflow.keras.datasets import mnist
import matplotlib.pyplot as plt&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648523681969&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(X_train,y_train),(X_test,y_test) = mnist.load_data()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지는 원래 컬러 이미지이므로, 1개의 이미지는 3차원 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이미지 처리를 CNN을 구성할때는, 전체 데이터셋은 4차원으로 구성해야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648523749041&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X_train=X_train.reshape(60000,28,28,1)
X_test=X_test.reshape(10000,28,28,1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피처스케일링&lt;/p&gt;
&lt;pre id=&quot;code_1648523764624&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X_train=X_train/255.0
X_test=X_test/255.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CNN으로 모델링, 컴파일, 학습합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648523819808&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = Sequential()
model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',input_shape = (28,28,1))) #첫번째는 input_shape 필수
model.add(MaxPooling2D(pool_size=(2,2),strides=2))
model.add(Conv2D(filters=64,kernel_size=(2,2),activation='relu'))
model.add(MaxPooling2D((2,2),2))
model.add(Flatten())
model.add(Dense(units=128,activation='relu'))
model.add(Dense(units=10,activation='softmax'))
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train,epochs=5)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습이 끝나면 테스트셋으로 정확도를 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648523892081&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.evaluate(X_test,y_test)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-18-17-658.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQjrb6/btrxLlRymPL/6Ef8ZvAmzl1Ho1DWNhcSjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQjrb6/btrxLlRymPL/6Ef8ZvAmzl1Ho1DWNhcSjk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQjrb6/btrxLlRymPL/6Ef8ZvAmzl1Ho1DWNhcSjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQjrb6%2FbtrxLlRymPL%2F6Ef8ZvAmzl1Ho1DWNhcSjk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;104&quot; data-filename=&quot;bandicam 2022-03-29 12-18-17-658.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨퓨전 매트릭스로 어떤 것을 틀렸는지 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648523986960&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.metrics import confusion_matrix,accuracy_score

y_pred = model.predict(X_test)
y_pred=y_pred.argmax(axis=1)

cm = confusion_matrix(y_test,y_pred)

import seaborn as sb
sb.heatmap(data=cm,annot=True,fmt='.0f',cmap='RdPu')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-20-15-619.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjgOB9/btrxr4qF4xr/bUzJujvCDI8PouzCuK1VRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjgOB9/btrxr4qF4xr/bUzJujvCDI8PouzCuK1VRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjgOB9/btrxr4qF4xr/bUzJujvCDI8PouzCuK1VRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjgOB9%2Fbtrxr4qF4xr%2FbUzJujvCDI8PouzCuK1VRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;320&quot; data-filename=&quot;bandicam 2022-03-29 12-20-15-619.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트레이닝셋은 93% , 테스트셋은 91% 까지 나옵니다.&lt;br /&gt;에포크를 20까지 해보면, 트레이닝셋 정확도는 올라가지만 밸리데이션 정확도는 내려갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 오버핏팅이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648524159591&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
training_images=training_images.reshape(60000, 28, 28, 1)
training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 만든 모델을 함수로 만들겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 학습할때 에포크를 20으로 해서 학습하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수는 epoch_history로 사용해서 학습&lt;/p&gt;
&lt;pre id=&quot;code_1648524227217&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def build_model():
  model = Sequential()
  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',input_shape = (28,28,1)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=2))
  model.add(Conv2D(filters=64,kernel_size=(2,2),activation='relu'))
  model.add(MaxPooling2D((2,2),2))
  model.add(Flatten())
  model.add(Dense(units=128,activation='relu'))
  model.add(Dense(units=10,activation='softmax'))
  model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

  return model&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 생성&lt;/p&gt;
&lt;pre id=&quot;code_1648524239752&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = build_model()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 학습&lt;/p&gt;
&lt;pre id=&quot;code_1648524252904&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;epoch_history = model.fit(X_train,y_train,epochs=20,validation_split=0.2)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-24-29-987.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdA0KO/btrxTPY0aWO/AxQyhgwLyu5R9zxgwi4EhK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdA0KO/btrxTPY0aWO/AxQyhgwLyu5R9zxgwi4EhK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdA0KO/btrxTPY0aWO/AxQyhgwLyu5R9zxgwi4EhK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdA0KO%2FbtrxTPY0aWO%2FAxQyhgwLyu5R9zxgwi4EhK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;753&quot; data-filename=&quot;bandicam 2022-03-29 12-24-29-987.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Accuracy 차트&lt;/p&gt;
&lt;pre id=&quot;code_1648524329216&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plt.plot(epoch_history.history['accuracy'])
plt.plot(epoch_history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(['Train','Validation'])
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-25-21-401.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yd45I/btrxIMidIRq/RBgkLCkjewKOZ684qJCjF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yd45I/btrxIMidIRq/RBgkLCkjewKOZ684qJCjF1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yd45I/btrxIMidIRq/RBgkLCkjewKOZ684qJCjF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyd45I%2FbtrxIMidIRq%2FRBgkLCkjewKOZ684qJCjF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;435&quot; data-filename=&quot;bandicam 2022-03-29 12-25-21-401.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loss 차트&lt;/p&gt;
&lt;pre id=&quot;code_1648524358720&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plt.plot(epoch_history.history['loss'])
plt.plot(epoch_history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['Train','Validation'])
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-25-45-256.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFQ3Tq/btrxQ4B7dZm/23YTcKzRgrzkkrgazkthfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFQ3Tq/btrxQ4B7dZm/23YTcKzRgrzkkrgazkthfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFQ3Tq/btrxQ4B7dZm/23YTcKzRgrzkkrgazkthfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFQ3Tq%2FbtrxQ4B7dZm%2F23YTcKzRgrzkkrgazkthfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;435&quot; data-filename=&quot;bandicam 2022-03-29 12-25-45-256.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Visualizing the Convolutions and Pooling&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648524511856&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=7
THIRD_IMAGE=26
CONVOLUTION_NUMBER = 1
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
  f1 = activation_model.predict(X_test[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[0,x].grid(False)
  f2 = activation_model.predict(X_test[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[1,x].grid(False)
  f3 = activation_model.predict(X_test[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[2,x].grid(False)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-29-12-746.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhlsmR/btrxGbQFx4X/UEUINoprjS3GYuGhVZI72k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhlsmR/btrxGbQFx4X/UEUINoprjS3GYuGhVZI72k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhlsmR/btrxGbQFx4X/UEUINoprjS3GYuGhVZI72k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhlsmR%2FbtrxGbQFx4X%2FUEUINoprjS3GYuGhVZI72k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;272&quot; data-filename=&quot;bandicam 2022-03-29 12-29-12-746.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXERCISES &lt;br /&gt;&lt;br /&gt;1. 컨볼루션 필터 갯수를 16 또는 64로 바꿔서 정확도를 확인합니다.&lt;br /&gt;&lt;br /&gt;2. 맨 마지막 컨볼루션 지우고 해봅니다&lt;br /&gt;&lt;br /&gt;3. 콜백 셋팅해서 돌려봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델생성&lt;/p&gt;
&lt;pre id=&quot;code_1648524661472&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model = build_model()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼리스탑핑 이용 방법&lt;/p&gt;
&lt;pre id=&quot;code_1648524679912&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=5)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백 클래스 이용 방법&lt;/p&gt;
&lt;pre id=&quot;code_1648524700594&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self,epoch,logs={}):
    if logs['val_accuracy'] &amp;gt; 0.99 :
      print('\n벨리데이션 정확도가 99%가 넘으므로, 에포크를 멈춥니다.')
      self.model.stop_training = True&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648524715952&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;my_callback = myCallback()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 학습&lt;/p&gt;
&lt;pre id=&quot;code_1648524741288&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;epoch_history = model.fit(X_train,y_train,epochs=20,validation_split=0.2,callbacks=[early_stop,my_callback])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 12-32-32-177.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nch4V/btrxLSI1rAR/3i2e7zKcRPdwF6hSPTAzX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nch4V/btrxLSI1rAR/3i2e7zKcRPdwF6hSPTAzX0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nch4V/btrxLSI1rAR/3i2e7zKcRPdwF6hSPTAzX0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnch4V%2FbtrxLSI1rAR%2F3i2e7zKcRPdwF6hSPTAzX0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;372&quot; data-filename=&quot;bandicam 2022-03-29 12-32-32-177.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>딥러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/178</guid>
      <comments>https://dbfoot.tistory.com/178#entry178comment</comments>
      <pubDate>Tue, 29 Mar 2022 12:32:46 +0900</pubDate>
    </item>
    <item>
      <title>ANN 인공신경망을 이용해 자동차 연비 예측하기 EarlyStopping 콜백(callback) 사용</title>
      <link>https://dbfoot.tistory.com/177</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러리 import&lt;/p&gt;
&lt;pre id=&quot;code_1648519624183&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import matplotlib.pyplot as plt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 드라이브 마운트&lt;/p&gt;
&lt;pre id=&quot;code_1648519624188&quot; class=&quot;clean&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/KYxVP/btrxvLLcYcH/c4qCqQL0qaxRp2VShe4qfK/auto-mpg.csv?attach=1&amp;amp;knm=tfile.csv&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;auto-mpg.csv&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv파일 읽기&lt;/p&gt;
&lt;pre id=&quot;code_1648519624190&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
# Working Direcctory Setting 워킹 디렉토리 세팅
os.chdir('/content/drive/csv파일 있는 위치')

df = pd.read_csv('auto-mpg.csv')

df&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 빈데이터 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648519896266&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.isna().sum()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 빈데이터 삭제&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648519906993&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df=df.dropna()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. X, y 설정&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648519921649&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X=df.iloc[:,1:]
y=df['MPG']&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 카테고리컬 데이터처리&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Origin&amp;nbsp;컬럼은&amp;nbsp;다음과&amp;nbsp;같습니다.&amp;nbsp;(1.&amp;nbsp;American,&amp;nbsp;2.&amp;nbsp;European,3.&amp;nbsp;Japanese)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648519937913&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X=pd.get_dummies(X,columns=['Origin'])&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;더미삭제&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648519956131&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X=X.drop('Origin_1',axis=1)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. X 만 피처 스케일링 합니다. (차트 확인을 위해 y는 하지 않습니다.)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648519996625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.preprocessing import MinMaxScaler
scaler_X = MinMaxScaler()
scaler_X.fit_transform(X)
X = scaler_X.fit_transform(X)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. Train / Test로 분리&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648520031153&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=7)
X_train&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. 딥러닝 모델링(모델링 해주는 함수만들고 모델링)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러리&lt;/p&gt;
&lt;pre id=&quot;code_1648520050577&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델링 함수&lt;/p&gt;
&lt;pre id=&quot;code_1648520061249&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def build_model():
  model = Sequential()
  model.add(Dense(64,'relu',input_dim=X_train.shape[1]))
  model.add(Dense(64,'relu'))
  model.add(Dense(1,activation='linear'))

  model.compile(optimizer = 'adam',loss = 'mse',metrics=['mse','mae'])

  return model&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델링&lt;/p&gt;
&lt;pre id=&quot;code_1648520097770&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model=build_model()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;중요!! 학습하기 (&lt;span style=&quot;background-color: #ffffff; color: #212121;&quot;&gt;EarlyStopping 콜백(callback)사용하고 안하고의 차이&lt;/span&gt;)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이곳은 안따라하셔도 됩니다.(오래 걸림)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648520232162&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;epoch_history = model.fit(X_train,y_train,epochs=1000,validation_split=0.2)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 11-23-42-650.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doq2i7/btrxO9wvyPv/6sM3XGg8AvNpzfK224H1mk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doq2i7/btrxO9wvyPv/6sM3XGg8AvNpzfK224H1mk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doq2i7/btrxO9wvyPv/6sM3XGg8AvNpzfK224H1mk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdoq2i7%2FbtrxO9wvyPv%2F6sM3XGg8AvNpzfK224H1mk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;702&quot; data-filename=&quot;bandicam 2022-03-29 11-23-42-650.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 에포크 1000개까지 학습합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상당한 시간이 걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 학습한 내용을 시각화 한다면?&lt;/p&gt;
&lt;pre id=&quot;code_1648520318865&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#학습한 후의 결과를, 보기 위해서 학습 결과의 변수에 history 변수안에 있는 데이터를 데이터 프레임으로 만들기
df_history = pd.DataFrame(epoch_history.history)
df_history&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 11-18-45-651.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bda1uZ/btrxKiHTc5T/t795mYkgtt3O5YYQ3GfSKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bda1uZ/btrxKiHTc5T/t795mYkgtt3O5YYQ3GfSKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bda1uZ/btrxKiHTc5T/t795mYkgtt3O5YYQ3GfSKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbda1uZ%2FbtrxKiHTc5T%2Ft795mYkgtt3O5YYQ3GfSKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;504&quot; data-filename=&quot;bandicam 2022-03-29 11-18-45-651.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차트화&lt;/p&gt;
&lt;pre id=&quot;code_1648520369041&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

def plot_history(history):
  hist = pd.DataFrame(history.history)
  hist['epoch'] = history.epoch

  plt.figure(figsize=(8,12))

  plt.subplot(2,1,1)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Abs Error [MPG]')
  plt.plot(hist['epoch'], hist['mae'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mae'],
           label = 'Val Error')
  plt.ylim([0,5])
  plt.legend()

  plt.subplot(2,1,2)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Square Error [$MPG^2$]')
  plt.plot(hist['epoch'], hist['mse'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mse'],
           label = 'Val Error')
  plt.ylim([0,20])
  plt.legend()
  plt.show()

plot_history(epoch_history)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 11-19-36-935.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLeEEZ/btrxQ34g61x/E82p3vqdC8GmEzEJskOTUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLeEEZ/btrxQ34g61x/E82p3vqdC8GmEzEJskOTUK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLeEEZ/btrxQ34g61x/E82p3vqdC8GmEzEJskOTUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLeEEZ%2FbtrxQ34g61x%2FE82p3vqdC8GmEzEJskOTUK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;702&quot; data-filename=&quot;bandicam 2022-03-29 11-19-36-935.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121;&quot;&gt;그래프를 보면 수 백번 에포크를 진행한 이후에는 모델이 거의 향상되지 않는 것 같습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121;&quot;&gt;model.fit 메서드를 수정하여 검증 점수가 향상되지 않으면 자동으로 훈련을 멈추도록 만들어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #212121;&quot;&gt;그래서 !! EarlyStopping 콜백(callback)사용합니다!!&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1648520582918&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#위에 에포크 1000개 했다면 모델을 다시 만들어 줍니다.
model = build_model()
# 안했다면 윗부분은 건너뜁니다.

# patience= 파라미터는 성능향상을 체크할 에포크 수로서
# 10이라고 세팅하면 에포크가 10번 지났는데도 성능향상없으면, 멈추라는 뜻입니다.
early_stop=tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=10)

epoch_history = model.fit(X_train,y_train,epochs=1000,validation_split=0.2,
                          callbacks = [early_stop])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 11-23-20-045.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXwpF7/btrxILDAThC/EYymHeBsK70MCnJZsBMYXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXwpF7/btrxILDAThC/EYymHeBsK70MCnJZsBMYXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXwpF7/btrxILDAThC/EYymHeBsK70MCnJZsBMYXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXwpF7%2FbtrxILDAThC%2FEYymHeBsK70MCnJZsBMYXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;702&quot; data-filename=&quot;bandicam 2022-03-29 11-23-20-045.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 에포크 172까지만 수행하고 종료됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648520759211&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt

def plot_history(history):
  hist = pd.DataFrame(history.history)
  hist['epoch'] = history.epoch

  plt.figure(figsize=(8,12))

  plt.subplot(2,1,1)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Abs Error [MPG]')
  plt.plot(hist['epoch'], hist['mae'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mae'],
           label = 'Val Error')
  plt.ylim([0,5])
  plt.legend()

  plt.subplot(2,1,2)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Square Error [$MPG^2$]')
  plt.plot(hist['epoch'], hist['mse'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mse'],
           label = 'Val Error')
  plt.ylim([0,20])
  plt.legend()
  plt.show()

plot_history(epoch_history)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 11-26-07-989.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLQjP/btrxLSoEeU5/lmko2Ltmi9X9GJtemnafy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLQjP/btrxLSoEeU5/lmko2Ltmi9X9GJtemnafy0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLQjP/btrxLSoEeU5/lmko2Ltmi9X9GJtemnafy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLQjP%2FbtrxLSoEeU5%2Flmko2Ltmi9X9GJtemnafy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;702&quot; data-filename=&quot;bandicam 2022-03-29 11-26-07-989.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;몇번 동일한 값이 나오니 자동으로 종료했습니다.&lt;/p&gt;</description>
      <category>딥러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/177</guid>
      <comments>https://dbfoot.tistory.com/177#entry177comment</comments>
      <pubDate>Tue, 29 Mar 2022 11:27:03 +0900</pubDate>
    </item>
    <item>
      <title>Neural Networks</title>
      <link>https://dbfoot.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러이 import&lt;/p&gt;
&lt;pre id=&quot;code_1648517543607&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 드라이브 마운트&lt;/p&gt;
&lt;pre id=&quot;code_1648517543613&quot; class=&quot;clean&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ckdEDO/btrxHwfdMge/ySDX6kh6ziNuPAkNv1VTr0/Churn_Modelling.csv?attach=1&amp;amp;knm=tfile.csv&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Churn_Modelling.csv&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.64MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv파일 읽기&lt;/p&gt;
&lt;pre id=&quot;code_1648517543614&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
# Working Direcctory Setting 워킹 디렉토리 세팅
os.chdir('/content/drive/csv파일 있는 위치')

df = pd.read_csv('Churn_Modelling.csv')

df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 비어있는 데이터 확인합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648517701536&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df.isna().sum()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. X와 y 설정합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648517768224&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X=df.loc[:,'CreditScore':'EstimatedSalary']
y=df['Exited']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 문자열 데이터를 숫자로 변경합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X의 Geography은 3개로 되어있으므로 원핫인코딩 해야합니다.&lt;br /&gt;X의 Gender은 2개로 외어있으므로 레이블인코딩 해야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648517907984&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#원핫인코딩
X = pd.get_dummies(X,columns=['Geography'])

#레이블인코딩
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoder.fit_transform(X['Gender'])

#Female, Male 정렬하면 ,Female이 0, Male이 1이 됩니다.
X['Gender'] = encoder.fit_transform(X['Gender'])

X&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원 핫 인코딩한 결과의 맨 왼쪽 컬럼은, 삭제를 해도 0과 1로 모두 3개 데이터 표현 가능 &lt;br /&gt;Dummy varialbe trap : 즉 맨 왼쪽 하나의 컬럼은 지워도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많으면 메모리 먹기 떄문입니다&lt;br /&gt;&amp;nbsp;0 0 1 =&amp;gt; 0 1 &lt;br /&gt;&amp;nbsp;0 1 0 =&amp;gt; 1 0 &lt;br /&gt;&amp;nbsp;1 0 0 =&amp;gt; 0 0&lt;/p&gt;
&lt;pre id=&quot;code_1648517984809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X=X.drop('Geography_France',axis=1)
X&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 각 데이터의 범위를 일정하게 맞춰주는, 피쳐 스케일링 합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝은 무조건 피처스케일링 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648518092795&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(X)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 학습용과 테스트용으로 나눕니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648518154265&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. 딥러닝으로 모델링&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648518247616&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.models import Sequential #sequential 신경망 같은거
from tensorflow.keras.layers import Dense #Dense는 레이어

model = Sequential()
X.shape# input_dim을 확인하기 위해&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648518318617&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#히든레이어 생성 : 이때는 인풋 레이어의 숫자도 세팅해줍니다
model.add(Dense(units=6,activation='relu',input_dim = 11))

#히든레이어 생성(인풋레이어 필요없음)
model.add(Dense(units=8,activation='relu'))

#아웃풋 레이어 생성
model.add(Dense(units=1,activation='sigmoid'))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 합니다. Compile &lt;br /&gt;오차함수를 설정하고 옵티마이저(그레디언트 디센트 알고리즘)를 설정합니다&lt;br /&gt;옵티마이저는 그래디언트 디센트 알고리즘을 개선한 것들 중에서 선택하면 됩니다.&lt;br /&gt;그래디언트 디센트는 오차가 최소가 될때의 W값을 찾는 알고리즘입니다.&lt;br /&gt;&lt;br /&gt;loss는, 오차함수를 말합니다&lt;br /&gt;분류의 문제는 2가지로 나뉩니다.&lt;br /&gt;1.&amp;nbsp;2개로&amp;nbsp;분류하는&amp;nbsp;문제&amp;nbsp;:&amp;nbsp;binary_crossentropy &lt;br /&gt;2.&amp;nbsp;3개&amp;nbsp;이상으로&amp;nbsp;분류하는&amp;nbsp;문제&amp;nbsp;:&amp;nbsp;categorical_crossentropy &lt;br /&gt;위의 2개중 하나를 설정합니다&lt;br /&gt;&lt;br /&gt;metrics 분류의 문제는 보통 정확도를 측정합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 accuracy를 설정합니다&lt;/p&gt;
&lt;pre id=&quot;code_1648518440066&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])

#만든 모델을, 요약
model.summary()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. 컴파일이 끝나면, 학습합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byPcK4/btrxO9Xy7ll/svLqIO1EFTCNiBx0BuWPoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byPcK4/btrxO9Xy7ll/svLqIO1EFTCNiBx0BuWPoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byPcK4/btrxO9Xy7ll/svLqIO1EFTCNiBx0BuWPoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyPcK4%2FbtrxO9Xy7ll%2FsvLqIO1EFTCNiBx0BuWPoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;385&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;epoch&lt;/b&gt; : 한 번의 epoch는 신경망에서 전체 데이터 셋에 대해 forward pass/backward pass 과정을 거친 것을 말합니다. 즉, 전체 데이터 셋에 대해 한 번 학습을 완료한 상태를 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;batch_size&lt;/b&gt;&amp;nbsp;:&amp;nbsp;메모리의&amp;nbsp;한계와&amp;nbsp;속도&amp;nbsp;저하&amp;nbsp;때문에&amp;nbsp;대부분의&amp;nbsp;경우에는&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;epoch에서&amp;nbsp;모든&amp;nbsp;데이터를&amp;nbsp;한꺼번에&amp;nbsp;집어넣을&amp;nbsp;수는&amp;nbsp;없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서&amp;nbsp;데이터를&amp;nbsp;나누어서&amp;nbsp;주게&amp;nbsp;되는데&amp;nbsp;이때&amp;nbsp;몇&amp;nbsp;번&amp;nbsp;나누어서&amp;nbsp;주는가를&amp;nbsp;iteration,&amp;nbsp;각&amp;nbsp;iteration마다&amp;nbsp;주는&amp;nbsp;데이터&amp;nbsp;사이즈를&amp;nbsp;batch&amp;nbsp;size라고&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;출처:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.slideshare.net/w0ong/ss-82372826&quot;&gt;https://www.slideshare.net/w0ong/ss-82372826&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648518567144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;model.fit(X_train,y_train,epochs=20,batch_size=10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8. 학습이 끝나면, 평가해야 합니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648518732347&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;y_pred = model.predict(X_test)

# 0~1사이의 실수로 나옵니다.
# 이유는 아웃풋 레이어의 액티베이션 펑션으로 시그모이드를 시용했기 때문 입니다.
y_pred&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;y_pred&amp;nbsp;값이&amp;nbsp;실수로&amp;nbsp;나왔기&amp;nbsp;때문에&amp;nbsp;컨퓨전&amp;nbsp;매트릭스에&amp;nbsp;넣을&amp;nbsp;수&amp;nbsp;없습니다 &lt;br /&gt;따라서 0.5기준으로 크면 1, 작으면 0으로 맞춰줘야합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648518787640&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;y_pred = (y_pred &amp;gt; 0.5).astype(int)
#결과값 (2000,1)

#y_pred는 2차원 이므로, 컨퓨전매트릭스에 넣을 수 없기 때문에 1차원으로 만들어줍니다.

y_pred=y_pred.reshape(2000,)
#결과값 (2000,)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648518961473&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.metrics import confusion_matrix, accuracy_score

confusion_matrix(y_test,y_pred)
accuracy_score(y_test,y_pred)

# 텐서플로우의 평가 함수 제공,
model.evaluate(X_test,y_test)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 10-56-14-655.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2lThL/btrxoHbsGHl/A3XG7oliY8sZGBDlMYoBJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2lThL/btrxoHbsGHl/A3XG7oliY8sZGBDlMYoBJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2lThL/btrxoHbsGHl/A3XG7oliY8sZGBDlMYoBJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2lThL%2FbtrxoHbsGHl%2FA3XG7oliY8sZGBDlMYoBJk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;114&quot; data-filename=&quot;bandicam 2022-03-29 10-56-14-655.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>딥러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/176</guid>
      <comments>https://dbfoot.tistory.com/176#entry176comment</comments>
      <pubDate>Tue, 29 Mar 2022 10:57:16 +0900</pubDate>
    </item>
    <item>
      <title>Facebook의 Prophet을 이용해 아보카도 가격 예측 plot,count plot차트 시각화 하기</title>
      <link>https://dbfoot.tistory.com/175</link>
      <description>&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cmne0o/btrxvMXvbkH/r9Vor0k1iWcM5rYQMzmZb0/avocado.csv?attach=1&amp;amp;knm=tfile.csv&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;avocado.csv&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.88MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터는&amp;nbsp;미국의&amp;nbsp;아보카도&amp;nbsp;리테일&amp;nbsp;데이터&amp;nbsp;입니다.&amp;nbsp;(2018년도&amp;nbsp;weekly&amp;nbsp;데이터)&lt;/li&gt;
&lt;li&gt;아보카도 거래량과 가격이 나와 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼 설명 :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Date&amp;nbsp;-&amp;nbsp;The&amp;nbsp;date&amp;nbsp;of&amp;nbsp;the&amp;nbsp;observation&lt;/li&gt;
&lt;li&gt;AveragePrice - the average price of a single avocado&lt;/li&gt;
&lt;li&gt;type - conventional or organic&lt;/li&gt;
&lt;li&gt;year - the year&lt;/li&gt;
&lt;li&gt;Region - the city or region of the observation&lt;/li&gt;
&lt;li&gt;Total Volume - Total number of avocados sold&lt;/li&gt;
&lt;li&gt;4046 - Total number of avocados with PLU 4046 sold - PLU는 농산물 코드입니다&lt;/li&gt;
&lt;li&gt;4225 - Total number of avocados with PLU 4225 sold&lt;/li&gt;
&lt;li&gt;4770 - Total number of avocados with PLU 4770 sold&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 데이터 준비&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prophet&amp;nbsp;라이브러리 &lt;br /&gt;install&amp;nbsp;:&amp;nbsp;pip&amp;nbsp;install&amp;nbsp;fbprophet &lt;br /&gt;&lt;br /&gt;위&amp;nbsp;에러&amp;nbsp;발생시&amp;nbsp;:&amp;nbsp;conda&amp;nbsp;install&amp;nbsp;-c&amp;nbsp;conda-forge&amp;nbsp;fbprophet &lt;br /&gt;&lt;br /&gt;레퍼런스&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;https://research.fb.com/prophet-forecasting-at-scale/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://research.fb.com/prophet-forecasting-at-scale/&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;https://facebook.github.io/prophet/docs/quick_start.html#python-api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://facebook.github.io/prophet/docs/quick_start.html#python-api&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648516326187&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Quick Start&quot; data-og-description=&quot;Prophet is a forecasting procedure implemented in R and Python. It is fast and provides completely automated forecasts that can be tuned by hand by data scientists and analysts.&quot; data-og-host=&quot;facebook.github.io&quot; data-og-source-url=&quot;https://facebook.github.io/prophet/docs/quick_start.html#python-api&quot; data-og-url=&quot;http://facebook.github.io/prophet/docs/quick_start.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/96y5g/hyNQ0wWqZQ/IMwSsCov9LxN44wD2BWbr1/img.png?width=2000&amp;amp;height=970&amp;amp;face=0_0_2000_970,https://scrap.kakaocdn.net/dn/d1jahr/hyNQW2o7YF/KDF2PGQWkceTeGVKXbZTb1/img.png?width=2000&amp;amp;height=970&amp;amp;face=0_0_2000_970,https://scrap.kakaocdn.net/dn/bgqJa4/hyNQ4lOzBw/3ZjShkBHqxkkrThWSLy4ck/img.png?width=648&amp;amp;height=648&amp;amp;face=0_0_648_648&quot;&gt;&lt;a href=&quot;https://facebook.github.io/prophet/docs/quick_start.html#python-api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://facebook.github.io/prophet/docs/quick_start.html#python-api&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/96y5g/hyNQ0wWqZQ/IMwSsCov9LxN44wD2BWbr1/img.png?width=2000&amp;amp;height=970&amp;amp;face=0_0_2000_970,https://scrap.kakaocdn.net/dn/d1jahr/hyNQW2o7YF/KDF2PGQWkceTeGVKXbZTb1/img.png?width=2000&amp;amp;height=970&amp;amp;face=0_0_2000_970,https://scrap.kakaocdn.net/dn/bgqJa4/hyNQ4lOzBw/3ZjShkBHqxkkrThWSLy4ck/img.png?width=648&amp;amp;height=648&amp;amp;face=0_0_648_648');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Quick Start&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Prophet is a forecasting procedure implemented in R and Python. It is fast and provides completely automated forecasts that can be tuned by hand by data scientists and analysts.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;facebook.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러이 import&lt;/p&gt;
&lt;pre id=&quot;code_1648516358313&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd  
import numpy as np 
import matplotlib.pyplot as plt 
import random
import seaborn as sns
from fbprophet import Prophet&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 드라이브 마운트&lt;/p&gt;
&lt;pre id=&quot;code_1648516381888&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csv파일 읽기&lt;/p&gt;
&lt;pre id=&quot;code_1648516422215&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os
# Working Direcctory Setting 워킹 디렉토리 세팅
os.chdir('/content/drive/csv파일 있는 위치')

# avocado.csv 데이터 읽기 필요없는 맨 첫컬럼은 제거 합니다.
avocado_df = pd.read_csv('avocado.csv',index_col=0)

avocado_df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. EDA(Exploratory Data Analysis) : 탐색적 데이터 분석&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 날짜가 뒤죽박죽이기 때문에 날짜로 정렬합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648516570546&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;avocado_df.sort_values('Date',inplace=True)
avocado_df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜별로 가격이 어떻게 변하는지 plot로 간단하게 확인해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648516696031&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df_date=avocado_df.groupby('Date')['AveragePrice'].mean()

plt.plot(df_date)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 10-18-33-078.jpg&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mXIX5/btrxEDs150B/JTPUpRaHX8kzyfOdyeaqa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mXIX5/btrxEDs150B/JTPUpRaHX8kzyfOdyeaqa1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mXIX5/btrxEDs150B/JTPUpRaHX8kzyfOdyeaqa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmXIX5%2FbtrxEDs150B%2FJTPUpRaHX8kzyfOdyeaqa1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;308&quot; data-filename=&quot;bandicam 2022-03-29 10-18-33-078.jpg&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;region 지역별로 데이터가 몇개인지 시각화&lt;/p&gt;
&lt;pre id=&quot;code_1648516775367&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plt.figure(figsize=(6,10))
sns.countplot(data=avocado_df,y='region')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 10-19-21-349.jpg&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxGRys/btrxEDzKlz8/5kUVGcYj3QBQksIUxUDiqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxGRys/btrxEDzKlz8/5kUVGcYj3QBQksIUxUDiqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxGRys/btrxEDzKlz8/5kUVGcYj3QBQksIUxUDiqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxGRys%2FbtrxEDzKlz8%2F5kUVGcYj3QBQksIUxUDiqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;674&quot; data-filename=&quot;bandicam 2022-03-29 10-19-21-349.jpg&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로펫분석을 위해, 두개의 컬럼만 가져옵니다. ('Date',&amp;nbsp;'AveragePrice')&lt;/p&gt;
&lt;pre id=&quot;code_1648516888968&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;avocado_prophet_df = avocado_df[['Date', 'AveragePrice']]

avocado_prophet_df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.&amp;nbsp;Prophet&amp;nbsp;을&amp;nbsp;이용한&amp;nbsp;예측&amp;nbsp;수행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜 컬럼은 ds로 예측하고자하는 가격 컬럼은 y로 바꿔줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648516969296&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;avocado_prophet_df = avocado_prophet_df.rename(columns={'Date':'ds','AveragePrice':'y'})

avocado_prophet_df.head()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로펫으로 예측합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648517081784&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#1. 변수로 만듭니다
prophet = Prophet()

#2. 기존의 날짜와 데이터로 학습시킵니다
prophet.fit(avocado_prophet_df)

#3. 예측하고자 하는 기간을 정해서, 기간만 나와있는 데이터프레임 만듭니다
future = prophet.make_future_dataframe(periods=365) # 365일치를 예측했을 때

#4. 프로펫의 predict 함수를 이용해서 실제로 예측합니다
forecast = prophet.predict(future)

forecast&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Time Series 타임 시리즈 데이터라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;plot로 차트 확인&lt;/p&gt;
&lt;pre id=&quot;code_1648517139552&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prophet.plot(forecast)
plt.savefig('chart1.jpg') #버그 떄문에 두개가 나와서 드라이브에 저장하면 한개만 나옵니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 10-25-50-725.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wGliC/btrxILpZDdQ/zGjMfJOrAZktDMydLhZzf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wGliC/btrxILpZDdQ/zGjMfJOrAZktDMydLhZzf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wGliC/btrxILpZDdQ/zGjMfJOrAZktDMydLhZzf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwGliC%2FbtrxILpZDdQ%2FzGjMfJOrAZktDMydLhZzf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;491&quot; data-filename=&quot;bandicam 2022-03-29 10-25-50-725.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값이 너무 많내요...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼을 더 쪼개면 값이 보기 편하게 나올겁니다. (예 region이 west인 아보카도 가격 예측)&lt;/p&gt;
&lt;pre id=&quot;code_1648517177896&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prophet.plot_components(forecast)
plt.savefig('chart2.jpg')
#위에는 앞으로 전망
#밑에는 연단위 주기성&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 10-26-05-792.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDNkPS/btrxGbwfiAU/yC1AYji6VmOB9Ut2KEIEnk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDNkPS/btrxGbwfiAU/yC1AYji6VmOB9Ut2KEIEnk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDNkPS/btrxGbwfiAU/yC1AYji6VmOB9Ut2KEIEnk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDNkPS%2FbtrxGbwfiAU%2FyC1AYji6VmOB9Ut2KEIEnk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;555&quot; data-filename=&quot;bandicam 2022-03-29 10-26-05-792.jpg&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>머신러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/175</guid>
      <comments>https://dbfoot.tistory.com/175#entry175comment</comments>
      <pubDate>Tue, 29 Mar 2022 10:28:52 +0900</pubDate>
    </item>
    <item>
      <title>WordCloud Visualizing 스팸이메일 단어 워드클라우드</title>
      <link>https://dbfoot.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dbfoot.tistory.com/173&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dbfoot.tistory.com/173&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648514847632&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Naive Bayes 나이브 베이즈와  Vectorizing 벡터라이징을 이용한 스팸 분류 예시&quot; data-og-description=&quot;5,574개의 이메일 메시지가 있으며, 스팸인지 아닌지의 정보를 가지고 있다. 컬럼 : text, spam spam 컬럼의 값이 1이면 스팸이고, 0이면 스팸이 아닙니다. 스팸인지 아닌지 분류하는 인공지능을 만들&quot; data-og-host=&quot;dbfoot.tistory.com&quot; data-og-source-url=&quot;https://dbfoot.tistory.com/173&quot; data-og-url=&quot;https://dbfoot.tistory.com/173&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xyBZh/hyNRaGjE7j/rr46GIyv9XlKBB4z7s994K/img.png?width=800&amp;amp;height=872&amp;amp;face=0_0_800_872,https://scrap.kakaocdn.net/dn/9FRe6/hyNQ6YeGe0/vbeT6k85ZqfRhp0uHL63L0/img.png?width=800&amp;amp;height=872&amp;amp;face=0_0_800_872,https://scrap.kakaocdn.net/dn/EBBDG/hyNQ8uYDML/0a7VKei0gcPKQ09Cqy9GY0/img.jpg?width=919&amp;amp;height=376&amp;amp;face=0_0_919_376&quot;&gt;&lt;a href=&quot;https://dbfoot.tistory.com/173&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbfoot.tistory.com/173&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xyBZh/hyNRaGjE7j/rr46GIyv9XlKBB4z7s994K/img.png?width=800&amp;amp;height=872&amp;amp;face=0_0_800_872,https://scrap.kakaocdn.net/dn/9FRe6/hyNQ6YeGe0/vbeT6k85ZqfRhp0uHL63L0/img.png?width=800&amp;amp;height=872&amp;amp;face=0_0_800_872,https://scrap.kakaocdn.net/dn/EBBDG/hyNQ8uYDML/0a7VKei0gcPKQ09Cqy9GY0/img.jpg?width=919&amp;amp;height=376&amp;amp;face=0_0_919_376');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Naive Bayes 나이브 베이즈와 Vectorizing 벡터라이징을 이용한 스팸 분류 예시&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;5,574개의 이메일 메시지가 있으며, 스팸인지 아닌지의 정보를 가지고 있다. 컬럼 : text, spam spam 컬럼의 값이 1이면 스팸이고, 0이면 스팸이 아닙니다. 스팸인지 아닌지 분류하는 인공지능을 만들&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dbfoot.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1648514877865&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from wordcloud import WordCloud, STOPWORDS&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스팸만&amp;nbsp;들어있는&amp;nbsp;이메일의&amp;nbsp;내용을&amp;nbsp;가져와서&amp;nbsp;화면에&amp;nbsp;어떤&amp;nbsp;단어가&amp;nbsp;많이&amp;nbsp;나왔는지&amp;nbsp;시각화&amp;nbsp;하려&amp;nbsp;합니다. &lt;br /&gt;데이터프레임에 있는 문자열을 하나의 문자열로 만들어 줘야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 각 행의 문자열을 리스트로 받아옵니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648515011858&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam['text'].tolist()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 리스트에 들어있는 문자열을 join 함수 이용해서 하나로 만들어 줍니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648515051568&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;words_as_one_string=''.join(spam['text'].tolist())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 워드 클라우드 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;apple.jpg&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VqjZL/btrxD3dlwQR/PcjG3idjpuTGcRtEK6nlRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VqjZL/btrxD3dlwQR/PcjG3idjpuTGcRtEK6nlRk/img.jpg&quot; data-alt=&quot;워드클라우드를 사과모양으로 하기 위한 사진 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VqjZL/btrxD3dlwQR/PcjG3idjpuTGcRtEK6nlRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVqjZL%2FbtrxD3dlwQR%2FPcjG3idjpuTGcRtEK6nlRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;338&quot; data-filename=&quot;apple.jpg&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;워드클라우드를 사과모양으로 하기 위한 사진 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1648515181807&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from PIL import Image

#첨부한 이미지를 가져옵니다.
img = Image.open('apple.jpg')

#이미지를 넘파이로 만들어줍니다.
img_mask = np.array(img)

#워드클라우드의 스탑워즈를 내 메모리에 생성해서 사용합니다
my_stopwords = STOPWORDS

my_stopwords.add('subject')
my_stopwords.add('us')
my_stopwords.add('one')

wc = WordCloud(background_color='white',mask=img_mask,stopwords=my_stopwords,max_words=100)

wc.generate(words_as_one_string)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648515276535&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plt.figure(figsize=(10,6))
plt.imshow(wc)
plt.axis('off')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-29 09-55-01-696.jpg&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boUbgG/btrxzjt0rKH/igMyBLzRYypiBkvAVzXPXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boUbgG/btrxzjt0rKH/igMyBLzRYypiBkvAVzXPXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boUbgG/btrxzjt0rKH/igMyBLzRYypiBkvAVzXPXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboUbgG%2Fbtrxzjt0rKH%2FigMyBLzRYypiBkvAVzXPXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;458&quot; data-filename=&quot;bandicam 2022-03-29 09-55-01-696.jpg&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>머신러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/174</guid>
      <comments>https://dbfoot.tistory.com/174#entry174comment</comments>
      <pubDate>Tue, 29 Mar 2022 09:55:55 +0900</pubDate>
    </item>
    <item>
      <title>Naive Bayes 나이브 베이즈와  Vectorizing 벡터라이징을 이용한 스팸 분류 예시</title>
      <link>https://dbfoot.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;5,574개의 이메일 메시지가 있으며, 스팸인지 아닌지의 정보를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼 : text, spam&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spam 컬럼의 값이 1이면 스팸이고, 0이면 스팸이 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스팸인지 아닌지 분류하는 인공지능을 만들자 - 수퍼바이즈드 러닝의 분류 문제!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글드라이브 import&lt;/p&gt;
&lt;pre id=&quot;code_1648456081321&quot; class=&quot;clean&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from google.colab import drive
drive.mount('/content/drive')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 라이브러리 import&lt;/p&gt;
&lt;pre id=&quot;code_1648456081324&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Kdz8E/btrxIMOSYEk/wgcTYayifWewknrE5cPONk/Mall_Customers.csv?attach=1&amp;amp;knm=tfile.csv&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bY8bsv/btrxHYoLV3d/PrkuBPtLBDFRnIBHXn1zUk/emails.csv?attach=1&amp;amp;knm=tfile.csv&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;emails.csv&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;8.54MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1648456081329&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam_df=pd.read_csv('/content/drive/MyDrive/위치/emails.csv')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스팸이면 1 이고, 아니면 0 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;스팸은 몇개이고, 아닌 것은 몇개인지 확인하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648456252088&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam_df['spam']==1
spam_df['spam'].value_counts()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648456260128&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sns.countplot(data=spam_df,x='spam')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-28 17-31-10-794.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTMHp/btrxlDmrSrT/UG43TTUZL49XWXkuRxXVm1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTMHp/btrxlDmrSrT/UG43TTUZL49XWXkuRxXVm1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTMHp/btrxlDmrSrT/UG43TTUZL49XWXkuRxXVm1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTMHp%2FbtrxlDmrSrT%2FUG43TTUZL49XWXkuRxXVm1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;376&quot; data-filename=&quot;bandicam 2022-03-28 17-31-10-794.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이메일의 길이가 스팸과 관련이 있는지 확인해보려고 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;이메일의 문자 길이를 구해서, length라는 컬럼을 만듭니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648456405385&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam_df['length']=spam_df['text'].apply(len)
spam_df&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;글자 길이를 히스토그램으로 나타냅니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648456472040&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam_df['length'].hist(bins=30)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-28 17-35-13-350.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckeUKt/btrxHWLgFNT/UgqvXi6mk817oNKWEPONVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckeUKt/btrxHWLgFNT/UgqvXi6mk817oNKWEPONVK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckeUKt/btrxHWLgFNT/UgqvXi6mk817oNKWEPONVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckeUKt%2FbtrxHWLgFNT%2FUgqvXi6mk817oNKWEPONVK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;313&quot; data-filename=&quot;bandicam 2022-03-28 17-35-13-350.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 긴 이메일을 찾아서 스팸인지 아닌지 확인하고, 이메일 내용을 확인합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648456580338&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam_df['length'].max()

spam_df['length']==spam_df['length'].max()

spam_df.loc[spam_df['length']==spam_df['length'].max(),'text'][2650]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0은 스팸이 아니고, 1은 스팸입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이차트를 통해, 스팸과 스팸이 아닌 것이 몇 퍼센트인지, 소수점 1자리 까지만 보여줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648456642120&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam_count = spam_df['spam'].value_counts()

plt.pie(spam_count,autopct='%.1f',labels=spam_count.index)
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-28 17-37-28-492.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyVwRK/btrxGdtczxe/nBsr9Dz9GdE6tesLCyKhW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyVwRK/btrxGdtczxe/nBsr9Dz9GdE6tesLCyKhW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyVwRK/btrxGdtczxe/nBsr9Dz9GdE6tesLCyKhW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeyVwRK%2FbtrxGdtczxe%2FnBsr9Dz9GdE6tesLCyKhW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;313&quot; data-filename=&quot;bandicam 2022-03-28 17-37-28-492.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스팸이 아닌 것은 ham 변수로 , 스팸인것은 spam 변수로 저장하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648456714993&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ham = spam_df.loc[spam_df['spam']==0,]

spam = spam_df.loc[spam_df['spam']==1,]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스팸의 이메일 길이를 히스토그램으로 나타내기&lt;/p&gt;
&lt;pre id=&quot;code_1648457036384&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spam['length'].hist()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bandicam 2022-03-28 17-44-05-700.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JVDy9/btrxD3cYmn2/W5MBWk8EbBpajMFEomb6rk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JVDy9/btrxD3cYmn2/W5MBWk8EbBpajMFEomb6rk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JVDy9/btrxD3cYmn2/W5MBWk8EbBpajMFEomb6rk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJVDy9%2FbtrxD3cYmn2%2FW5MBWk8EbBpajMFEomb6rk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;313&quot; data-filename=&quot;bandicam 2022-03-28 17-44-05-700.jpg&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;햄의 이메일 길이를 히스토그램으로 나타내기&lt;/p&gt;
&lt;pre id=&quot;code_1648457069152&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ham['length'].hist()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;쉼표, 마침표 등의 구두점 제거하기&lt;/b&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자열에는 필요없는 글자가 포함되어 있다마침표, 느낌표,물결표시등 ! 이런것을 punctuation (구두점) 이라고 합니다.이것을 먼저 제거합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;테스트 문장입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648457175665&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Test = 'Hello Mr. Future, I am so happy to be learning AI now!~'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1648457207649&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import string
string.punctuation&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648457243745&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Test_punc_removed = []
for char in Test:
  if char not in string.punctuation:
    Test_punc_removed.append(char)
    
print(Test_punc_removed)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 리스트에 있는 문자들을, 하나의 문자열로 만듭니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648457318448&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;''.join(Test_punc_removed)

Test_punc_removed_join =''.join(Test_punc_removed)
Test_punc_removed_join&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STOPWORDS(불용어) 제거하기&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;STOPWORDS(불용어) 란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dbfoot.tistory.com/172&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dbfoot.tistory.com/172&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648513213117&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Stopwords (불용어)&quot; data-og-description=&quot;언어를 분석할때, stopwords 라는 용어가 나옵니다. stopwords 또는 불용어 란, 우리가 언어를 분석할 때, 의미가 있는 단어와, 의미가 없는 단어나 조사 등이 있습니다. 이렇게 의미가 없는 것들을 stop&quot; data-og-host=&quot;dbfoot.tistory.com&quot; data-og-source-url=&quot;https://dbfoot.tistory.com/172&quot; data-og-url=&quot;https://dbfoot.tistory.com/172&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AFM5A/hyNQ1JlKuq/eL6MLflWSa5X4dW5eI7kw1/img.png?width=715&amp;amp;height=677&amp;amp;face=0_0_715_677,https://scrap.kakaocdn.net/dn/bCPa0U/hyNQYy5dj6/iKr2K5bLABe307nDLZvE0k/img.png?width=715&amp;amp;height=677&amp;amp;face=0_0_715_677,https://scrap.kakaocdn.net/dn/cXWcfE/hyNRbkTC8M/7S6KlBOgGVAQ09PXKPKW8k/img.jpg?width=580&amp;amp;height=579&amp;amp;face=0_0_580_579&quot;&gt;&lt;a href=&quot;https://dbfoot.tistory.com/172&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dbfoot.tistory.com/172&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AFM5A/hyNQ1JlKuq/eL6MLflWSa5X4dW5eI7kw1/img.png?width=715&amp;amp;height=677&amp;amp;face=0_0_715_677,https://scrap.kakaocdn.net/dn/bCPa0U/hyNQYy5dj6/iKr2K5bLABe307nDLZvE0k/img.png?width=715&amp;amp;height=677&amp;amp;face=0_0_715_677,https://scrap.kakaocdn.net/dn/cXWcfE/hyNRbkTC8M/7S6KlBOgGVAQ09PXKPKW8k/img.jpg?width=580&amp;amp;height=579&amp;amp;face=0_0_580_579');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Stopwords (불용어)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;언어를 분석할때, stopwords 라는 용어가 나옵니다. stopwords 또는 불용어 란, 우리가 언어를 분석할 때, 의미가 있는 단어와, 의미가 없는 단어나 조사 등이 있습니다. 이렇게 의미가 없는 것들을 stop&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dbfoot.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1648513323434&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import nltk

#불용어 다운로드
nltk.download('stopwords')

from nltk.corpus import stopwords
my_stopwords = stopwords.words('english')
my_stopwords&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구두점 제거한 문자열을, 이제 불용어 단어에 해당하지 않는 단어들만 모아서 리스트로 만듭니다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1648513438783&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Test_punc_removed_join_clean =[]
for word in Test_punc_removed_join.split():
  if word.lower() not in my_stopwords:
    Test_punc_removed_join_clean.append(word)
    
print(Test_punc_removed_join_clean)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;의미없는 글자도 제거 했으면 이제는 각 단어를 숫자로 바뚸줘야 학습할 수 있습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단어를 숫자로 맵핑시키는 것을 벡터라이징 이라고 합니다. Vectorizing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이블 인코딩(문자를 문자 순서대로 숫자로 변경)&lt;/p&gt;
&lt;pre id=&quot;code_1648513727628&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.feature_extraction.text import CountVectorizer

sample_data = ['This is the first document',
               'I loved them',
               'This document is the second document',
               'I am loving you',
               'And this is the third one']
               
Vectorizer = CountVectorizer()
X = Vectorizer.fit_transform(sample_data)

X=X.toarray()
Vectorizer.get_feature_names_out()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 우리의 데이터프레임에 있는, 이메일 내용을 Cleaning 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 구두점 제거 (글자 제거)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 불용어 제거 (단어 제거)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요 이 두가지 작업을 하나의 함수로 만들어줍니다 : 파이프 라이닝&lt;/p&gt;
&lt;pre id=&quot;code_1648513964578&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def message_cleaning(sentence):
  #1. 구두점 제거
  Test_punc_removed=[char for char in sentence if char not in string.punctuation]
  #2. 각각 떨어져 있는 글자를 다시 원상복구(하나의 문자열로 만든다)한다.
  Test_punc_removed_join=''.join(Test_punc_removed)
  #3. 문자열을 단어로 쪼개서, stopwords에 들어있는지 확인하여, 중요한 단어만 남긴다.
  Test_punc_removed_join_clean = [word for word in Test_punc_removed_join.split() if word.lower() not in my_stopwords]
  #4. 중요한 단어들만 남은 리스트를 리턴해준다.
  return Test_punc_removed_join_clean&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648513994949&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;message_cleaning('Hello~~! my name, is hehehe! nice to meet you.')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카운트 벡터라이저의 애널라이저 파라미터 위의 구두점제거 + 불용어 제거하는 함수를 설정해주면 알아서 이 함수를 먼저 실행하고 나서 숫자로 바꿔줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648514077326&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Vectorizer = CountVectorizer(analyzer=message_cleaning)
X=Vectorizer.fit_transform(spam_df['text'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습을 위해서 X,y를 세팅해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X는 넘파이 어레이여야 하므로, toarray() 함수 이용해서 넘파이로 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648514193438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X=X.toarray()

y=spam_df['spam']&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나이브 베이즈 모델링&lt;/p&gt;
&lt;pre id=&quot;code_1648514281438&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=15)
from sklearn.naive_bayes import MultinomialNB,GaussianNB

classifier1 = MultinomialNB()
classifier1.fit(X_train,y_train)
y_pred=classifier1.predict(X_test)

y_test
y_pred&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648514451638&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.metrics import confusion_matrix,accuracy_score
confusion_matrix(y_test,y_pred)
accuracy_score(y_test,y_pred)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1648514528295&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;classifier2 = GaussianNB()
classifier2.fit(X_train,y_train)
y_pred = classifier2.predict(X_test)
confusion_matrix(y_test,y_pred)
accuracy_score(y_test,y_pred)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문장 테스트 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1648514580518&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;testing_sample = ['Free money!!!', &quot;Hi Kim, Please let me know if you need any further information. Thanks&quot;,'Hello, I am Ryan, I would like to book a hotel in Bali by January 24th', 'money viagara!!!!!']
X_sample = Vectorizer.transform(testing_sample)
X_sample = X_sample.toarray()
classifier1.predict(X_sample)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>머신러닝</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/173</guid>
      <comments>https://dbfoot.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 29 Mar 2022 09:46:26 +0900</pubDate>
    </item>
    <item>
      <title>Stopwords (불용어)</title>
      <link>https://dbfoot.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;언어를 분석할때, stopwords 라는 용어가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stopwords 또는 불용어 란, 우리가 언어를 분석할 때, 의미가 있는 단어와, 의미가 없는 단어나 조사 등이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 의미가 없는 것들을 stopwords 라고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서, 다음 문장이 있으면,&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&quot;Family is not an important thing. It's everything.&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Family,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;important,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;thing,&lt;span&gt;&amp;nbsp;&lt;/span&gt;everything 은 의미가 있다고 보고,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;나머지 아래 같은 것들은 의미가 없다고 판단하여 stopwords 로 정의합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{'a', 'about', 'above', 'after', 'again', 'against', 'all', 'also', 'am', 'an', 'and', 'any', 'are', &quot;aren't&quot;, 'as', 'at', 'be', 'because', 'been', 'before', 'being', 'below', 'between', 'both', 'but', 'by', 'can', &quot;can't&quot;, 'cannot', 'com', 'could', &quot;couldn't&quot;, 'did', &quot;didn't&quot;, 'do', 'does', &quot;doesn't&quot;, 'doing', &quot;don't&quot;, 'down', 'during', 'each', 'else', 'ever', 'few', 'for', 'from', 'further', 'get', 'had', &quot;hadn't&quot;, 'has', &quot;hasn't&quot;, 'have', &quot;haven't&quot;, 'having', 'he', &quot;he'd&quot;, &quot;he'll&quot;, &quot;he's&quot;, 'her', 'here', &quot;here's&quot;, 'hers', 'herself', 'him', 'himself', 'his', 'how', &quot;how's&quot;, 'however', 'http', 'i', &quot;i'd&quot;, &quot;i'll&quot;, &quot;i'm&quot;, &quot;i've&quot;, 'if', 'in', 'into', 'is', &quot;isn't&quot;, 'it', &quot;it's&quot;, 'its', 'itself', 'just', 'k', &quot;let's&quot;, 'like', 'me', 'more', 'most', &quot;mustn't&quot;, 'my', 'myself', 'no', 'nor', 'not', 'of', 'off', 'on', 'once', 'only', 'or', 'other', 'otherwise', 'ought', 'our', 'ours', 'ourselves', 'out', 'over', 'own', 'r', 'said', 'same', 'shall', &quot;shan't&quot;, 'she', &quot;she'd&quot;, &quot;she'll&quot;, &quot;she's&quot;, 'should', &quot;shouldn't&quot;, 'since', 'so', 'some', 'such', 'than', 'that', &quot;that's&quot;, 'the', 'their', 'theirs', 'them', 'themselves', 'then', 'there', &quot;there's&quot;, 'these', 'they', &quot;they'd&quot;, &quot;they'll&quot;, &quot;they're&quot;, &quot;they've&quot;, 'this', 'those', 'through', 'to', 'too', 'under', 'until', 'up', 'very', 'was', &quot;wasn't&quot;, 'we', &quot;we'd&quot;, &quot;we'll&quot;, &quot;we're&quot;, &quot;we've&quot;, 'were', &quot;weren't&quot;, 'what', &quot;what's&quot;, 'when', &quot;when's&quot;, 'where', &quot;where's&quot;, 'which', 'while', 'who', &quot;who's&quot;, 'whom', 'why', &quot;why's&quot;, 'with', &quot;won't&quot;, 'would', &quot;wouldn't&quot;, 'www', 'you', &quot;you'd&quot;, &quot;you'll&quot;, &quot;you're&quot;, &quot;you've&quot;, 'your', 'yours', 'yourself', 'yourselves'}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 불용어 ( Stopwords )는 그때 그때, 사람이 판단하여, 불용어 리스트에, 원하는 단어를 추가하거나 제거하면서 사용하면 됩니다.&lt;/p&gt;</description>
      <category>Python 기초</category>
      <author>HooSL</author>
      <guid isPermaLink="true">https://dbfoot.tistory.com/172</guid>
      <comments>https://dbfoot.tistory.com/172#entry172comment</comments>
      <pubDate>Mon, 28 Mar 2022 17:51:55 +0900</pubDate>
    </item>
  </channel>
</rss>