<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Tech &amp;amp; TIL</title>
    <link>https://jadon.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 29 Jul 2026 23:38:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jadon Yang</managingEditor>
    <image>
      <title>Tech &amp;amp; TIL</title>
      <url>https://tistory1.daumcdn.net/tistory/4384158/attach/34634da38d7b49a0a4fb7408f74aac87</url>
      <link>https://jadon.tistory.com</link>
    </image>
    <item>
      <title>[파이썬] xlsb 파일 읽기</title>
      <link>https://jadon.tistory.com/51</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;xlsx 파일은 pd.read_excel('파일경로')로 읽으면 된다.&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;xlsb 파일은 &lt;b&gt;pyxlsb&lt;/b&gt;를 사용하여 읽는다.&lt;/h2&gt;
&lt;pre id=&quot;code_1652946715676&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;!pip install pyxlsb

import pandas as pd
df = pd.read_excel('파일경로', engine='pyxlsb')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>excel</category>
      <category>Python</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/51</guid>
      <comments>https://jadon.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 19 May 2022 16:52:33 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬] 시트 여러개인 엑셀 파일 읽기</title>
      <link>https://jadon.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 파이썬으로 엑셀 파일을 읽으려면 pd.read_excel 을 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1652946120807&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas

df = pd.read_excel('엑셀파일경로')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;하지만 이러한 방식으로 시트가 여러개인 엑셀 파일을 읽으려고 하면 오류가 발생함.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;pre id=&quot;code_1652946287519&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

df = pd.read_excel('엑셀파일경로', sheet_name=None)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;sheet_name 파라미터 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;0&lt;/b&gt;: 1번째 시트만 읽어옴 (기본값)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1&lt;/b&gt;: 2번째 시트만 읽어옴&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;Sheet1&quot;&lt;/b&gt;: 시트 이름을 기준으로 읽어옴&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[0, 1, &quot;Sheet5&quot;]&lt;/b&gt;: 1, 2번째 시트와 &quot;Sheet5&quot; 라는 이름의 시트를 읽어옴&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;None: 모든 시트를 읽어옴&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>excel</category>
      <category>Python</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/50</guid>
      <comments>https://jadon.tistory.com/50#entry50comment</comments>
      <pubDate>Thu, 19 May 2022 16:48:32 +0900</pubDate>
    </item>
    <item>
      <title>Bar charts &amp;amp; Heatmaps</title>
      <link>https://jadon.tistory.com/49</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ref: &lt;a href=&quot;https://www.kaggle.com/code/alexisbcook/bar-charts-and-heatmaps&quot;&gt;Kaggle Data Visualization Course&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Data&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/4c56020b-614f-4212-a618-fa4a2567596a/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Index: Month&lt;br&gt;Columns: Airline Code&lt;/p&gt;
&lt;h1&gt;Bar chart&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Set the width and height of the figure
plt.figure(figsize=(10,6))

# Add title
plt.title(&amp;quot;Average Arrival Delay for Spirit Airlines Flights, by Month&amp;quot;)

# Bar chart showing average arrival delay for Spirit Airlines flights by month
sns.barplot(x=flight_data.index, y=flight_data[&amp;#39;NK&amp;#39;])

# Add label for vertical axis
plt.ylabel(&amp;quot;Arrival delay (in minutes)&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/90d38985-6db4-406d-97fc-d825ff6d3007/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Heatmap&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Set the width and height of the figure
plt.figure(figsize=(14,7))

# Add title
plt.title(&amp;quot;Average Arrival Delay for Each Airline, by Month&amp;quot;)

# Heatmap showing average arrival delay for each airline by month
sns.heatmap(data=flight_data, annot=True)

# Add label for horizontal axis
plt.xlabel(&amp;quot;Airline&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/553b05c8-e197-47a1-8efa-f0bfd3d664ed/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;히트맵을 보면 상대적으로 연말에 (9-11월쯤) 어두운 것을 확인할 수 있다. 이것을 통해 평균적으로 항공사들은 연말에 스케줄을 잘 지킨다는 것을 알 수 있다. (i.e. 항공편이 Delay 되지 않는다.)&lt;/p&gt;</description>
      <category>Data Science</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/49</guid>
      <comments>https://jadon.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 9 May 2022 16:42:35 +0900</pubDate>
    </item>
    <item>
      <title>Line Charts</title>
      <link>https://jadon.tistory.com/48</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ref: &lt;a href=&quot;https://www.kaggle.com/code/alexisbcook/line-charts&quot;&gt;Kaggle Data Visualization Course&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Data&lt;/h1&gt;
&lt;p&gt;2017 ~ 2018 Spotify의 Daily streams&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/7b82acae-fa94-4e44-b524-25f67953c880/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Line Plot&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;sns.lineplot(data=spotify_data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/bdae5115-d596-410b-be43-bb0b2752fcf0/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;인턴십때 Line plot은 일반적으로 x축에 Time Series, y축에 집계량을 표현하는 것이다는 피드백을 받았다. 항상 Plot을 그릴때는 목적에 맞는 것을 명확하게 사용하자!!&lt;/p&gt;
&lt;h2&gt;Additional information&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Set the width and height of the figure
plt.figure(figsize=(14,6))

# Add title
plt.title(&amp;quot;Daily Global Streams of Popular Songs in 2017-2018&amp;quot;)

# Line chart showing daily global streams of each song 
sns.lineplot(data=spotify_data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/4170510e-596f-4fcb-a41d-f7bfa5a7ef80/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Plot a subset of the data&lt;/h1&gt;
&lt;p&gt;데이터 일부분만 그리기&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Set the width and height of the figure
plt.figure(figsize=(14,6))

# Add title
plt.title(&amp;quot;Daily Global Streams of Popular Songs in 2017-2018&amp;quot;)

# Line chart showing daily global streams of &amp;#39;Shape of You&amp;#39;
sns.lineplot(data=spotify_data[&amp;#39;Shape of You&amp;#39;], label=&amp;quot;Shape of You&amp;quot;)

# Line chart showing daily global streams of &amp;#39;Despacito&amp;#39;
sns.lineplot(data=spotify_data[&amp;#39;Despacito&amp;#39;], label=&amp;quot;Despacito&amp;quot;)

# Add label for horizontal axis
plt.xlabel(&amp;quot;Date&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/ac12cfbd-4f2b-4180-959a-cc4c962eef5e/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</description>
      <category>Data Science</category>
      <category>linechart</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/48</guid>
      <comments>https://jadon.tistory.com/48#entry48comment</comments>
      <pubDate>Mon, 9 May 2022 16:41:38 +0900</pubDate>
    </item>
    <item>
      <title>Scatter Plot</title>
      <link>https://jadon.tistory.com/47</link>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ref: &lt;a href=&quot;https://www.kaggle.com/code/alexisbcook/scatter-plots/tutorial&quot;&gt;Kaggle Data Visualization Course&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;Data&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/2b5279ab-424e-4c6b-ae26-2787d08b44fa/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Basic Scatter Plot&lt;/h1&gt;
&lt;p&gt;위 데이터 중 &lt;code&gt;bmi&lt;/code&gt;와 &lt;code&gt;charges&lt;/code&gt;를 scatter plot으로 시각화 해보자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import seaborn as sns

sns.scatterplot(x=data[&amp;#39;bmi&amp;#39;], y=data[&amp;#39;charges&amp;#39;])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/8ed07e17-59c9-4325-9680-bc03296e4542/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;BMI와 Charges(보험금 청구료)는 어느정도 Positively Correlated 하다고 볼 수 있다. BMI가 높아질수록 Charges도 높아지기 때문.&lt;/p&gt;
&lt;p&gt;확실하게 상관관계를 시각화하기 위해 Regression Line을 추가해보자.&lt;br&gt;회귀선을 추가하려면 &lt;code&gt;regplot&lt;/code&gt;을 사용하면 된다. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;sns.regplot(x=data[&amp;#39;bmi&amp;#39;], y=data[&amp;#39;charges&amp;#39;])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/fd269818-3541-4d4b-95fb-c87c6ecbd13c/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Color-coded Scatter Plot&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;bmi&lt;/code&gt;, &lt;code&gt;charges&lt;/code&gt;, &lt;code&gt;smoker&lt;/code&gt; 세 가지 변수를 한 번에 시각화하고 싶다면?&lt;br&gt;&lt;code&gt;hue&lt;/code&gt;를 사용하면 됨.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;sns.scatterplot(x=data[&amp;#39;bmi&amp;#39;], \
                y=data[&amp;#39;charges&amp;#39;], \
                hue=data[&amp;#39;smoker&amp;#39;])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/08712004-186e-4f7c-a125-197fba4d4411/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;비흡연자보다 흡연자가 보험료를 더 많이 냄.&lt;/li&gt;
&lt;li&gt;BMI가 높고 흡연을 하는 사람들이 보험료를 가장 많이 냄.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2개의 Regression Line을 그리고 싶다면 &lt;code&gt;lmplot&lt;/code&gt;을 사용하자.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;sns.lmplot(x=&amp;quot;bmi&amp;quot;, y=&amp;quot;charges&amp;quot;, hue=&amp;quot;smoker&amp;quot;, data=data)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/f93c8a1f-2bee-49fe-b264-35dce6c700d9/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;정리&lt;/h1&gt;
&lt;p&gt;일반적으로 scatter plot은 두 continuous variable 간의 관계를 보여주기 위해 사용한다(e.g. bmi &amp;amp; charges).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sns.scatterplot&lt;/li&gt;
&lt;li&gt;x, y, hue&lt;/li&gt;
&lt;li&gt;sns.regplot (one reg line)&lt;/li&gt;
&lt;li&gt;lmplot (two reg lines)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Data Science</category>
      <category>Scatterplot</category>
      <category>Visualization</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/47</guid>
      <comments>https://jadon.tistory.com/47#entry47comment</comments>
      <pubDate>Mon, 9 May 2022 16:39:21 +0900</pubDate>
    </item>
    <item>
      <title>Docker 문법 정리</title>
      <link>https://jadon.tistory.com/46</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dockerfile에서 사용되는 문법 정리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) syntax&lt;/h3&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# syntax=docker/dockerfile:1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 &lt;code&gt;Dockerfile&lt;/code&gt; 첫 번째 줄에 적어야한다. Parser directive라고 표현하며 도커 빌더에게 도커 파일을 파싱할 때 어떤 문법으로 파싱해야하는지 알려주는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;docker/dockerfile:1&lt;/code&gt;은 항상 가장 최신의 version 1 syntax로 설정해주기 때문에 공식 문서에서 권장하고 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) FROM&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;FROM python:3.8-slim-buster&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지는 다른 이미지로 부터 상속받을 수 있다. 따라서 스스로 &lt;code&gt;Base Image&lt;/code&gt;를 구축하는 것보다 Official 하게 제공되는 &lt;code&gt;Base Image&lt;/code&gt;를 사용하는 것을 권장한다. 여기서는 Python 3.8 버전의 Base Image를 기준으로 예를 든다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) WORKDIR&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;WORKDIR /app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;Working Directory&lt;/code&gt;를 설정하는 표현이다. 이것이 도커에게 default location으로 &lt;code&gt;/app&lt;/code&gt; 을 사용하라고 알려주는 역할을 한다. 이렇게 함으로써 개발자들은 도커 파일을 작성하면서 &lt;code&gt;Full Path&lt;/code&gt;를 적어야하는 불편함을 방지할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) COPY&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;COPY requirements.txt requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 파일에 requirements.txt 라는 파일을 설치하는 명령을 적고 싶다면 해당 파일을 도커 이미지에 복사해주어야 한다. COPY를 하지 않는다면 이미지는 해당 파일의 위치를 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;COPY는 두 개의 파라미터를 가진다.&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지에 복사할 파일&lt;/li&gt;
&lt;li&gt;파일을 어디에 복사할지&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 위 명령은 &lt;b&gt;*&quot;현재 폴더 밑의 requirements.txt를 이미지의 현재 폴더의 requirements.txt에 복사하겠다&quot;*&lt;/b&gt; 는 말이 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5) RUN&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;RUN pip3 install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;COPY&lt;/code&gt;로 이미지에 &lt;code&gt;requirements.txt&lt;/code&gt;가 복사되고 나면 &lt;code&gt;RUN&lt;/code&gt; 명령어로 &lt;code&gt;pip3 install&lt;/code&gt;을 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어가 실행되면 이미지에 requirements.txt 내부에 있는 라이브러리들이 설치가 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6) COPY . .&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;COPY . .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지의 과정을 통해, 우리는 &lt;code&gt;Python 3.8&lt;/code&gt; 버전의 이미지를 갖게 되었고 Dependencies를 설치 완료 되었다. 다음 단계는 우리의 전체 소스코드를 이미지에 쓰는 것이다. COPY 명령어를 사용하여 (. 은 현재 위치를 의미) 현재의 전체 코드를 복사하여 이미지에 넣어준다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7) CMD&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;CMD [&quot;python3&quot;, &quot;-m&quot;, &quot;flask&quot;, &quot;run&quot;, &quot;--host=0.0.0.0&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 우리가 해야할 일은 도커에게 이미지가 컨테이너 내부에서 실행되었을 때 어떤 명령어를 실행해야할지 알려주는 것뿐이다. &lt;code&gt;CMD&lt;/code&gt; 명령어를 사용하여 터미널에서 사용하는 코드를 그대로 넣어주면 터미널과 동일하게 동작한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ &quot;python3&quot;, &quot;-m&quot; , &quot;flask&quot;, &quot;run&quot;, &quot;--host=0.0.0.0&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/language/python/build-images/&quot;&gt;Docker Official Document&lt;/a&gt;&lt;/p&gt;</description>
      <category>MLOps</category>
      <category>docker</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/46</guid>
      <comments>https://jadon.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 9 May 2022 16:36:02 +0900</pubDate>
    </item>
    <item>
      <title>Docker 튜토리얼 [파이썬] - 2</title>
      <link>https://jadon.tistory.com/45</link>
      <description>&lt;h1&gt;Run your image as a container&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Overview&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 튜토리얼에서 간단한 파이썬 애플리케이션을 만들었고 image를 만드는 &lt;code&gt;Dockerfile&lt;/code&gt;을 생성했다. 말아놓은 이미지를 &lt;code&gt;Run&lt;/code&gt;하여 애플리케이션이 정상적으로 동작시킬 수 있었다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A container is a normal operating system process except that this process is isolated in that it has its own file system, its own networking, and its own isolated process tree separate from the host.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너는 쉽게 말해 HOST OS와 독립적으로 존재하는 환경이라고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지를 컨테이너 안에서 실행하고 싶으면 &lt;code&gt;docker run&lt;/code&gt; 명령어를 사용하면 된다.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;$ docker run python-docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행되면 app.py에서 만든 애플리케이션이 로컬호스트 5000포트에서 실행이 되고 있다고 뜬다. 하지만 해당 링크로 접속해보면 아무것도 뜨지 않는다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ curl localhost:5000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어를 입력하면 Fail to connect 에러가 뜬다. localhost:5000에 연결할 수 없다는 말이다. 공식 문서에서는 isolation 환경에서 컨테이너가 띄워져있기 때문이라고 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 해결하기 위해서 &lt;code&gt;--publish flag&lt;/code&gt;를 사용해보자.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행중인 컨테이너를 종료하고 싶다면 ctrl + c를 입력하자.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ docker run --publish 8000:5000 python-docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어는 expose port 5000 inside the container to port 8000 outside the container 를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flask application을 실행시킬때 포트를 따로 지정해주지 않았고 기본값이 5000이다. --publish를 사용하여 로컬호스트 8000포트를 컨테이너 5000포트로 연결해준 것이다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/a22eac15-004c-4670-bb7f-d32adcc10348/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl 명령어를 날려보면 제대로 동작하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;List containers&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행중인 컨테이너 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행중인 컨테이너 멈추기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;$ docker stop [container name]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;존재하는 컨테이너 모두 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너 지우기&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;$ docker rm [container name]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특정 이름으로 컨테이너 실행하기&lt;/b&gt;&lt;br /&gt;Options&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;d: detached mode&lt;/li&gt;
&lt;li&gt;p: publish
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ docker run -d -p 8000:5000 --name rest-server python docker&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Next steps&lt;/h2&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;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/language/python/build-images/&quot;&gt;Docker Official Document&lt;/a&gt;&lt;/p&gt;</description>
      <category>MLOps</category>
      <category>docker</category>
      <category>mlops</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/45</guid>
      <comments>https://jadon.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 9 May 2022 16:30:53 +0900</pubDate>
    </item>
    <item>
      <title>Docker 튜토리얼 [파이썬] - 1</title>
      <link>https://jadon.tistory.com/44</link>
      <description>&lt;h1&gt;Build you Python image&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 &quot;도커 이미지를 말아서 어쩌구 저쩌구&quot;라는 표현을 쓴다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Overview&lt;/h2&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;Python 3.8 이상&lt;/li&gt;
&lt;li&gt;Docker running locally. &lt;a href=&quot;https://docs.docker.com/desktop/&quot;&gt;installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Sample application&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flask framework를 사용하는 간단한 파이썬 애플리케이션을 만들어보자.&lt;br /&gt;먼저 로컬에 &lt;code&gt;python-docker&lt;/code&gt; 라는 이름의 폴더를 만들고 간단한 웹서버를 만들기 위해 아래 스텝을 따라해보자.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;$ cd /path/to/python-docker
$ pip3 install Flask
$ pip3 freeze | grep Flask &amp;gt;&amp;gt; requirements.txt
$ touch app.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VS Code를 열어서 &lt;code&gt;python-docker&lt;/code&gt; 디렉토리에 &lt;code&gt;app.py&lt;/code&gt;를 생성하고 아래의 코드를 추가해준다.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker!'&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Test the application&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 동작하는지 확인해보자.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;$ python3 -m flask run&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;http://localhost:5000&lt;/code&gt; 링크에 접속하면 'Hello, Docker!'가 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Create a Dockerfile for Python&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션이 제대로 동작하고 있다면, &lt;code&gt;Dockerfile&lt;/code&gt;을 만들어보자. 파일명은 반드시 &lt;code&gt;Dockerfile&lt;/code&gt;로 해야하는 것은 아니지만 Official Docs에서 Dockerfile로 만드는 것을 권장하고 있다. 도커 파일 내부의 코드는 &lt;a title=&quot;여기&quot; href=&quot;https://jadon.tistory.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;에서 확인해보자.&lt;/p&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;# syntax=docker/dockerfile:1

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

CMD [ &quot;python3&quot;, &quot;-m&quot; , &quot;flask&quot;, &quot;run&quot;, &quot;--host=0.0.0.0&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 완료했다면 directory structure는 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;python-docker
|____ app.py
|____ requirements.txt
|____ Dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Build an image&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 말아보자.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;docker build --tag python-docker&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완료가 되었다면 &lt;code&gt;docker images&lt;/code&gt; 명령어로 제대로 생성되었는지 확인해보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Tag Images&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 태그를 바꿔보자.&lt;br /&gt;현재 python-docker의 태그가 latest로 되어있을텐데 이것을 v1.0.0으로 변경해보자.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;docker tag python-docker:latest python-docker:v1.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 아래와 같은데, TAG은 다르지만 Image ID는 같다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/jadon/post/7e72f63c-ca7a-4f91-85fc-2b7b89d225f2/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 지우고 싶다면&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;docker rmi python-docker:v1.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 도커 이미지를 마는 방법에 대해 알아보았고 다음 포스팅에서는 이미지를 컨테이너로 실행하는 방법에 대해 알아보자.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/language/python/build-images/&quot;&gt;Docker Official Document&lt;/a&gt;&lt;/p&gt;</description>
      <category>MLOps</category>
      <category>docker</category>
      <category>mlops</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/44</guid>
      <comments>https://jadon.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 9 May 2022 16:29:48 +0900</pubDate>
    </item>
    <item>
      <title>F1 score란?</title>
      <link>https://jadon.tistory.com/43</link>
      <description>&lt;p&gt;&lt;img src=&quot;https://images.velog.io/images/jadon/post/f06f1d40-605d-4f13-b6ce-35c220c82968/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 &lt;a href=&quot;https://towardsdatascience.com/the-f1-score-bec2bbc38aa6&quot;&gt;Article&lt;/a&gt;을 읽게 되어 헷갈리던 ML metrics에 대해 정리해보고자 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;F1 score 소개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F1 score는 분류 모델에서 사용되는 머신러닝 metric(평가지표)이다. 분류 모델에 사용되는 다양한 metric이 존재하지만, F1 score를 사용하는 이유는 뭘까? F1 score를 알아보기전 Accuracy에 대해 알아보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Accuracy&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확도는 말 그대로 얼마나 정확하냐를 측정하는 지표이다. 예를 들어, 개와 고양이를 분류하는 모델에서 전체 (개 5장, 고양이 5장) 10장 중 9장을 올바르게 분류하고 1장을 다르게 분류했다면 해당 모델의 정확도는 90%가 된다. 이를 보다 정확하게 표현하면 아래와 같은 그림이 된다. (# = the number of = ~의 수)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.velog.io/images/jadon/post/fee669ee-121a-4746-a3e9-4454c33dec0e/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확도는 분류 문제에서 클래스들이 동일한 분포를 갖고 있을 때 유용하게 쓰인다. 쉽게 말해 개의 사진이 100장 고양이 사진이 100장 있다면 &lt;code&gt;equal distribution&lt;/code&gt;이라고 할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Imbalanced data example&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹사이트에서 판매량 데이터를 분석하고 있다고 가정해보자. 99%의 방문자들은 물건을 사지 않고 1%의 방문자만 물건을 구입한다. 여기서 어떤 방문자가 물건을 구입하고 어떤 방문자가 그냥 보기만 하는지 분류하는 모델을 개발한다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자, 이제 개발한 모델이 제대로 예측하지 못한다고 생각해보자. 모델은 모든 방문자가 looker(보기만 하는 사람)라고 예측했다. 이는 명백히 틀렸고 쓸모없는 모델일 것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Accuracy is not a good metric to use when you have class imbalance&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역하자면 정확도는 클래스가 불균형할 때는 좋은 메트릭이 아니다는 말이다. 위 분류 문제에서 정확도(Accuracy)를 평가지표로 쓴다면 어떻게 될까, 모델의 정확도는 99%가 된다. 99%(looker)는 올바르게 분류했고 1%(buyer-&amp;gt;looker로 예측한 경우)만 잘못 분류한 것이 된다. 이 말을 잘 이해해야 한다. &lt;b&gt;여기서 문제는 모델이 매우 나쁜 성능이지만 99%의 정확도는 매우 좋은 결과처럼 들린다는 것이다.&lt;/b&gt; 결론적으로 데이터가 불균형할 때는 정확도가 좋지 않은 지표라는 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Solving imbalanced data through metrics&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 불균형 문제를 해결하는 하나의 방법은 &lt;b&gt;F1 Score&lt;/b&gt;를 사용하는 것이다. F1 Score는 예측 오류 개수만 관련되는 것이 아니라 발생한 오류의 종류도 관여하게 된다. 뒤에서 쉽게 알아보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Precision and Recall: foundations of the F1 Score&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Precision(정밀도)과 Recall(재현율)은 데이터가 불균형할 때 사용하는 가장 대표적인 2가지 메트릭이고 F1 score의 기초가 된다. 하나씩 알아보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Precision: the first part of the F1 score&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Precision은 독립적인 메트릭으로도 사용될 수 있다. 공식은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.velog.io/images/jadon/post/355f2678-6504-48ec-aaaa-2dac7848d9a5/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 해석하자면, 모델이 True라고 분류한 것 중에서 실제로 True인 것의 비율이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확하지 않은 모델은 많은 것을 positive라고 예측할 것이다. 하지만 negative인 것을 positive로 예측한 노이즈가 많이 껴있을 것이다.&lt;/li&gt;
&lt;li&gt;정확한 모델은 &quot;pure&quot;, 즉 순수하다. 모든 positive를 찾지는 못하더라도 최소한 positive라고 예측한 것은 모두 positive인 것을 의미한다. 쉽게 말해, 암에 걸렸다고 판단한 데이터가 100명이라면 100명 모두 실제로 암에 걸린 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Recall: the second part of the F1 score&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Recall 또한 독립적인 메트릭으로도 사용할 수 있다. 공식은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.velog.io/images/jadon/post/ae2e6ed1-5c05-4033-9cda-b6c0c42e0fe5/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 해석하자면, 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Recall이 높으면 몇 개의 negative를 positive로 분류할지라도 data에서 positive case를 잘 찾은것을 의미한다.&lt;/li&gt;
&lt;li&gt;Recall이 낮으면 데이터에서 positive case들을 전혀 찾을 수 없다는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Precision vs Recall&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 뭐가 어떻게 다를까? 명백히 하자면, 슈퍼마켓에서 문제가 있는 제품을 팔았을 때, 그들은 문제가 있는 제품들을 회수(recall)하고 싶을 것이다. Precision과 Recall의 차이는 분모에 FP가 들어가냐 FN이 들어가냐 이다. 여기서 True Postive, True Negative, False Positive, False Negative를 알아보자.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.velog.io/images/jadon/post/6234808d-df0a-4ad4-82e9-d3997bad1d39/image.png&quot; alt=&quot;&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;True Postive: 문제가 있는(positive) 제품을 문제가 있다고(positive) 잘(true) 판별한 것.&lt;/li&gt;
&lt;li&gt;True Negative: 문제가 없는(negative) 제품을 문제가 없다고(negative) 잘(true) 판별한 것.&lt;/li&gt;
&lt;li&gt;False Positive: 문제가 없는(negative) 제품을 문제가 있다고(positive) 잘못(false) 판단한 것.&lt;/li&gt;
&lt;li&gt;False Negative: 문제가 있는(positive) 제품을 문제가 없다고(negative) 잘못(false) 판단한 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그들은 오직 문제가 있는 모든 제품을 다시 되돌려 받는 것에만 관심이 있고 몇 클라이언트가 문제가 없는 제품을 되돌려주어도 상관이 없다면 precision은 이 슈퍼마켓의 관심사가 아닌 것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직도 이해가 어려울 수 있으니 다시 한 번 설명하자면, 문제가 있는 모든 제품을 다시 되돌려 받기만 하면 된다면, 문제가 없는 제품을 문제가 있다고 잘못 판단하여 되돌려 주는것은 전혀 상관이 없다. 하지만, 문제가 있는 제품을 문제가 없다고 잘못 판단하여 돌려주지 않게 되면 나중에 고소를 당하는 등, 문제가 발생할 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Precision-Recall Trade-Off&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상적으로, 좋은 모델은 positive한 것을 모두 제대로 분류하고, positive한 것만 제대로 분류하면 된다. 하지만 현실에서는 두 가지 모두 높이는 것은 힘들다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;The F1 score: combining Precision and Recall&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Precision과 Recall으로 F1 score가 구성되고 불균형한 데이터에서 잘 동작하는 평가지표가 된다. F1 score는 precision과 recall의 조화평균이 되고 공식은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://images.velog.io/images/jadon/post/b6fe1c3a-5919-41d0-b31d-0a739a5f3845/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 F1 score는 precision과 recall이 모두 높으면 높고 0.0 ~ 1.0 사이의 값을 가진다(e.g. 0.87, %아님 주의).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 슈퍼마켓 예시는 precision을 무시한다. 따라서 슈퍼마켓 입장에서는 문제가 없는 제품까지 돌려받게 되어 손해가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 언급했던 웹사이트에서 buyer와 looker를 분류하는 예시에서 99명이 looker(negative)이고 1명이 buyer(positive)인 경우 모두 looker로 분류한 모델을 Accuracy(정확도)로 평가하면 99%의 정확도라는 썩 괜찮은 모델같지만, F1 score로 평가하게 되면 0이 나온다. 좋지 않은 모델이라는 것을 판단할 수 있게 되었다.&lt;/p&gt;</description>
      <category>Data Science</category>
      <category>f1-score</category>
      <category>metric</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/43</guid>
      <comments>https://jadon.tistory.com/43#entry43comment</comments>
      <pubDate>Mon, 9 May 2022 16:24:21 +0900</pubDate>
    </item>
    <item>
      <title>'xxx' object is not callable</title>
      <link>https://jadon.tistory.com/42</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;'DataFrame' object is not callable 오류 해결 방법 정리하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 오류가 발생하는 이유는 객체를 &lt;code&gt;call&lt;/code&gt;했기 때문이다. 쉽게 말해 Dataframe[] 을 해야하는데 Dataframe()으로 소괄호로 작성한다면 위 오류가 발생한다.&lt;/p&gt;
&lt;pre class=&quot;subunit&quot;&gt;&lt;code&gt;d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
df('col1')

Error 발생&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결방법은 아래와 같다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;df['col1']

# Output
# [1,2]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Trouble shooting</category>
      <category>dataframe</category>
      <category>pandas</category>
      <author>Jadon Yang</author>
      <guid isPermaLink="true">https://jadon.tistory.com/42</guid>
      <comments>https://jadon.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 9 May 2022 16:21:26 +0900</pubDate>
    </item>
  </channel>
</rss>