<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Developer's Delight</title>
    <link>https://sonseungha.tistory.com/</link>
    <description>I want to be a S/W developer who benefits people.
</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 15:26:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Linuxias</managingEditor>
    <image>
      <title>Developer's Delight</title>
      <url>https://tistory1.daumcdn.net/tistory/1135772/attach/d65b83f062bf47058ae771a1f6212df6</url>
      <link>https://sonseungha.tistory.com</link>
    </image>
    <item>
      <title>연속형 변수 간 독립성 및 동질성 검정 방법</title>
      <link>https://sonseungha.tistory.com/736</link>
      <description>&lt;p&gt;연속형 변수 간 독립성과 동질성을 검정할 때, 사용되는 통계적 기법들을 정리합니다. 각 검정 방법은 데이터의 특성과 상황에 따라 적절히 선택해야 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. 연속형 변수 간 독립성 검정&lt;/h2&gt;
&lt;p&gt;연속형 변수 간 독립성을 검정하기 위해 주로 상관관계 분석 방법을 사용합니다. 주요 방법은 다음과 같습니다.&lt;/p&gt;
&lt;h3&gt;(1) 피어슨 상관계수 (Pearson Correlation Coefficient)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 두 연속형 변수가 정규분포를 따르고, 선형 관계를 가정하는 경우.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 상관계수(r)를 계산한 뒤, 귀무가설 $H_0$: &amp;quot;두 변수는 독립이다.&amp;quot;를 검정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import pearsonr
corr, p_value = pearsonr(x, y)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(2) 스피어만 상관계수 (Spearman Rank Correlation Coefficient)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 변수 간 선형 관계를 가정하지 않거나, 데이터가 정규성을 따르지 않을 때.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 순위 기반 상관계수(rho)를 계산하고, 귀무가설 $H_0$: &amp;quot;두 변수는 독립이다.&amp;quot;를 검정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import spearmanr
corr, p_value = spearmanr(x, y)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(3) 켄달 타우 상관계수 (Kendall Tau Correlation)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 순위 기반 상관 분석으로, 작은 데이터셋에 적합.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 켄달의 tau를 계산하여 두 변수 간 독립성을 평가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import kendalltau
tau, p_value = kendalltau(x, y)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(4) 교차상관 분석 (Cross-Correlation Analysis)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 시계열 데이터에서 두 연속형 변수 간 시점 차이에 따른 상관성을 평가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 시계열 상관성을 계산하고 시점별 독립성을 평가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
cross_corr = np.correlate(x, y, mode=&amp;quot;full&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;2. 연속형 변수 간 동질성 검정&lt;/h2&gt;
&lt;p&gt;동질성 검정은 두 연속형 변수 집단의 분포가 동일한지 확인하는 데 사용됩니다. 주요 방법은 다음과 같습니다.&lt;/p&gt;
&lt;h3&gt;(1) t-검정 (t-Test)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 두 집단의 평균이 동일한지 비교하며, 데이터가 정규분포를 따르고 분산이 동일한 경우.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 귀무가설 $H_0$: &amp;quot;두 집단의 평균은 동일하다.&amp;quot;를 검정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import ttest_ind
t_stat, p_value = ttest_ind(group1, group2)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(2) 윌콕슨 순위합 검정 (Wilcoxon Rank-Sum Test)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 데이터가 정규성을 따르지 않거나 비모수적인 경우.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 두 집단의 중위수가 동일한지 평가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import ranksums
stat, p_value = ranksums(group1, group2)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(3) 콜모고로프-스미르노프 검정 (Kolmogorov-Smirnov Test)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 두 집단의 분포가 동일한지 검정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 귀무가설 $H_0$: &amp;quot;두 집단은 동일한 분포를 가진다.&amp;quot;를 검정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import ks_2samp
stat, p_value = ks_2samp(group1, group2)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;(4) 레빈 검정 (Levene&amp;#39;s Test)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;적합한 경우&lt;/strong&gt;: 두 집단의 분산(동질성)이 동일한지 평가.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검정 방법&lt;/strong&gt;: 귀무가설 $H_0$: &amp;quot;두 집단의 분산은 동일하다.&amp;quot;를 검정.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;코드 예제&lt;/strong&gt;:&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import levene
stat, p_value = levene(group1, group2)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;독립성 검정&lt;/strong&gt;: 상관관계 분석 (피어슨, 스피어만, 켄달 등)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동질성 검정&lt;/strong&gt;: t-검정, 콜모고로프-스미르노프 검정, 레빈 검정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;데이터의 특성(정규성, 분산의 동질성 등)을 고려하여 적절한 검정 방법을 선택하는 것이 중요합니다.&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/736</guid>
      <comments>https://sonseungha.tistory.com/736#entry736comment</comments>
      <pubDate>Sun, 29 Dec 2024 17:58:23 +0900</pubDate>
    </item>
    <item>
      <title>python exception 일반적인 처리 방식과 Contextlib.suppress와의 차이</title>
      <link>https://sonseungha.tistory.com/735</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Python에서 예외 처리를 처리하는 방식에는 일반적으로 try-except 블록을 사용하며, 간단한 경우에는 contextlib.suppress를 사용할 수 있습니다. 이 두 가지 방식의 비교와 장단점을 정리해 보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;try-except 블록&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;일반적인 예외 처리 방식&lt;/h4&gt;
&lt;pre class=&quot;nimrod&quot;&gt;&lt;code&gt;try:
    result = 10 / 0  # 예외 발생
except ZeroDivisionError:
    result = None
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul 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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;:
&lt;ul 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;li&gt;가독성: 복잡한 예외 처리를 명확히 표현할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 길이가 길어질 수 있음: 예외가 많아지면 except 블록이 많아져 가독성이 떨어질 수 있습니다.&lt;/li&gt;
&lt;li&gt;단순한 경우에도 다소 과한 구조일 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;contextlib.suppress 사용&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;간단한 예외 처리 방식&lt;/h4&gt;
&lt;pre class=&quot;nimrod&quot;&gt;&lt;code&gt;from contextlib import suppress

with suppress(ZeroDivisionError):
    result = 10 / 0  # 예외 발생, 무시됨
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;동작&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;with 블록 내에서 특정 예외가 발생하면 이를 자동으로 무시합니다.&lt;/li&gt;
&lt;li&gt;예외를 무시하고 나머지 코드 실행을 이어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간결함: 코드가 매우 단순하고 짧습니다.&lt;/li&gt;
&lt;li&gt;특정 예외를 무시하기 좋음: &quot;아무 작업도 필요 없는&quot; 경우 유용합니다.&lt;/li&gt;
&lt;li&gt;가독성: 불필요한 try-except 블록을 줄여 코드가 깔끔합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;:
&lt;ul 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;li&gt;디버깅 어려움: 예외가 무조건 무시되므로 문제를 추적하기 어려울 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;비교&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 try-except contextlib.suppress&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;주요 목적&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;예외 처리 및 복잡한 로직 처리&lt;/td&gt;
&lt;td&gt;단순히 특정 예외를 무시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;코드 길이&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;상대적으로 길어질 수 있음&lt;/td&gt;
&lt;td&gt;매우 간결&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;가독성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;복잡한 로직에서 더 명확&lt;/td&gt;
&lt;td&gt;단순 예외 무시에서 더 좋음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;예외 세분화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;여러 예외 처리 가능&lt;/td&gt;
&lt;td&gt;하나의 예외만 처리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;후속 작업&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;추가 로직 구현 가능&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용 사례&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;예외에 따른 대응이 필요할 때&lt;/td&gt;
&lt;td&gt;예외를 무시하고 넘어갈 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;사용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;try-except 사용:&lt;/h4&gt;
&lt;ul 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;/ul&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;try:
    value = int(input(&quot;숫자를 입력하세요: &quot;))
except ValueError:
    print(&quot;유효하지 않은 입력입니다.&quot;)
except KeyboardInterrupt:
    print(&quot;사용자가 입력을 중단했습니다.&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;contextlib.suppress 사용:&lt;/h4&gt;
&lt;ul 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;/ul&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;from contextlib import suppress

with suppress(FileNotFoundError):
    with open(&quot;non_existent_file.txt&quot;) as f:
        content = f.read()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**try-except**은 더 강력하고 세부적인 예외 처리를 가능하게 하지만, 코드가 길어질 수 있습니다.&lt;/li&gt;
&lt;li&gt;**contextlib.suppress**는 간단한 예외를 무시하고 싶을 때 더 깔끔하고 효율적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;상황에 따라 적절한 방식을 선택&lt;/b&gt;하는 것이 중요합니다.&lt;/p&gt;</description>
      <category>Language/Python</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/735</guid>
      <comments>https://sonseungha.tistory.com/735#entry735comment</comments>
      <pubDate>Sat, 7 Dec 2024 00:26:48 +0900</pubDate>
    </item>
    <item>
      <title>Python 정적 코드 분석 도구: MyPy와 PyType 비교</title>
      <link>https://sonseungha.tistory.com/734</link>
      <description>&lt;p&gt;Python은 동적 타입 언어로서 코드 작성이 간결하고 빠르지만, 타입 안정성과 정적 검증의 부재로 인해 런타임 오류가 발생할 수 있습니다. 이를 보완하기 위해 &lt;code&gt;Mypy&lt;/code&gt;와 &lt;code&gt;Pytype&lt;/code&gt; 같은 정적 타입 분석 도구가 개발되었습니다. 이 글에서는 두 도구의 특징과 사용법, 그리고 비교 분석을 통해 어떤 상황에서 적합한지 알아보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. Mypy란?&lt;/h2&gt;
&lt;p&gt;Mypy는 Python의 정적 타입 분석 도구로, &lt;strong&gt;PEP 484&lt;/strong&gt;에서 도입된 타입 힌트를 기반으로 코드를 분석합니다. Python 코드에서 타입 오류를 검출하여 런타임 전에 문제를 해결하도록 도와줍니다.&lt;/p&gt;
&lt;h3&gt;주요 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PEP 484와 같은 표준 타입 힌트 지원.&lt;/li&gt;
&lt;li&gt;점진적 타입 검사를 지원하여 기존 코드와 통합 가능.&lt;/li&gt;
&lt;li&gt;IDE와의 호환성 우수 (PyCharm, VSCode 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;설치 방법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install mypy&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;사용법&lt;/h3&gt;
&lt;p&gt;Mypy는 Python 파일에 타입 힌트를 추가한 후 이를 검사합니다.&lt;/p&gt;
&lt;h4&gt;코드 예제&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_numbers(a: int, b: int) -&amp;gt; int:
    return a + b

# 타입이 맞지 않으면 Mypy가 경고를 표시합니다.
add_numbers(1, &amp;quot;2&amp;quot;)  # 런타임 오류가 발생할 코드&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Mypy 실행&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mypy example.py&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;결과&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;example.py:5: error: Argument 2 to &amp;quot;add_numbers&amp;quot; has incompatible type &amp;quot;str&amp;quot;; expected &amp;quot;int&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;2. Pytype이란?&lt;/h2&gt;
&lt;p&gt;Pytype은 Google이 개발한 정적 타입 분석 도구로, 타입 힌트가 없는 코드도 자동으로 타입 추론을 수행합니다. &lt;/p&gt;
&lt;h3&gt;주요 특징&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;타입 힌트가 없어도 타입 추론 가능.&lt;/li&gt;
&lt;li&gt;코드 실행 없이도 동작하며 빠른 속도 제공.&lt;/li&gt;
&lt;li&gt;Google 내부 코드베이스에 적합하도록 설계.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;설치 방법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install pytype&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;사용법&lt;/h3&gt;
&lt;p&gt;Pytype은 Python 파일에서 타입 추론과 검사를 수행합니다.&lt;/p&gt;
&lt;h4&gt;코드 예제&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def multiply(a, b):
    return a * b

result = multiply(2, &amp;quot;3&amp;quot;)  # 런타임 오류가 발생할 코드&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Pytype 실행&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pytype example.py&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;결과&lt;/h4&gt;
&lt;p&gt;Pytype은 타입 힌트가 없더라도 문제를 감지합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;example.py:2: error: Function &amp;quot;multiply&amp;quot; was called with arguments of incompatible types&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;3. Mypy와 Pytype 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;특징&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Mypy&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Pytype&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;타입 힌트 의존성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;타입 힌트 필요&lt;/td&gt;
&lt;td&gt;타입 힌트 없어도 작동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;타입 추론&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;제한적 (타입 힌트를 기본으로 사용)&lt;/td&gt;
&lt;td&gt;자동으로 타입을 추론&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;유연성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;점진적 타입 검사 가능&lt;/td&gt;
&lt;td&gt;타입 힌트가 없어도 분석 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;속도&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;더 빠른 성능 제공&lt;/td&gt;
&lt;td&gt;상대적으로 느리지만 강력한 추론 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 사례&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;타입 힌트를 많이 사용하는 프로젝트&lt;/td&gt;
&lt;td&gt;기존 코드베이스에 타입 힌트가 부족한 프로젝트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;4. 어떤 도구를 선택해야 할까?&lt;/h2&gt;
&lt;h3&gt;Mypy가 적합한 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;프로젝트에서 타입 힌트를 이미 사용 중이거나 추가할 계획이 있는 경우.&lt;/li&gt;
&lt;li&gt;IDE와의 통합을 통해 실시간 타입 오류를 확인하고 싶은 경우.&lt;/li&gt;
&lt;li&gt;정적 타입 검사가 개발 워크플로의 중요한 부분인 경우.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Pytype이 적합한 경우&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;타입 힌트 없이도 기존 코드를 검사해야 하는 경우.&lt;/li&gt;
&lt;li&gt;자동 타입 추론이 필요한 큰 규모의 코드베이스를 관리하는 경우.&lt;/li&gt;
&lt;li&gt;Google 스타일 가이드에 따라 개발되는 프로젝트.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;5. 결론&lt;/h2&gt;
&lt;p&gt;Mypy와 Pytype은 각각의 강점과 약점을 가지고 있으며, 프로젝트의 요구 사항에 따라 선택할 수 있습니다. Mypy는 타입 힌트를 사용하는 개발자들에게 적합하며, Pytype은 기존 코드베이스에서 타입 안정성을 확보하고자 하는 경우 유용합니다.&lt;/p&gt;
&lt;p&gt;두 도구 모두 Python 코드의 품질과 안정성을 높이는 데 큰 도움을 줄 수 있으니, 필요에 따라 적절히 활용해 보는 것을 추천합니다.&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>mypy</category>
      <category>pytype</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/734</guid>
      <comments>https://sonseungha.tistory.com/734#entry734comment</comments>
      <pubDate>Thu, 5 Dec 2024 15:56:52 +0900</pubDate>
    </item>
    <item>
      <title>윤성우의 열혈 파이썬 중급편</title>
      <link>https://sonseungha.tistory.com/733</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biqXSg/btsK2V7ejgc/uaSRFVo0owjd6p1Kkbxpl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biqXSg/btsK2V7ejgc/uaSRFVo0owjd6p1Kkbxpl1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biqXSg/btsK2V7ejgc/uaSRFVo0owjd6p1Kkbxpl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiqXSg%2FbtsK2V7ejgc%2FuaSRFVo0owjd6p1Kkbxpl1%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;400&quot; height=&quot;517&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윤성우 저자는 다양한 IT 서적을 출간하고 많은 분들이 이 분의 서적으로 공부한 경험이 있을걸로 생각된다. 오랜만에 파이썬을 활용한 프로젝트를 진행하며 가볍게 윤성우님 서적이 생각나 구매하게 된 책.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Book</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/733</guid>
      <comments>https://sonseungha.tistory.com/733#entry733comment</comments>
      <pubDate>Sun, 1 Dec 2024 16:20:32 +0900</pubDate>
    </item>
    <item>
      <title>setdefault vs defaultdict</title>
      <link>https://sonseungha.tistory.com/732</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python에서 &lt;code&gt;setdefault()&lt;/code&gt;와 &lt;code&gt;defaultdict()&lt;/code&gt; 활용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python에서 딕셔너리를 사용할 때 키가 이미 존재하거나 존재하지 않을 때의 동작을 처리하는 방법은 중요합니다. 이 글에서는 &lt;code&gt;setdefault()&lt;/code&gt;와 &lt;code&gt;defaultdict()&lt;/code&gt;를 활용해 효율적으로 딕셔너리를 다루는 방법을 알아보고, 코드 예제를 통해 차이점과 사용 사례를 설명하겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;setdefault()란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;dict.setdefault()&lt;/code&gt;는 딕셔너리에서 키를 조회할 때, 해당 키가 없으면 지정된 기본값을 추가하고 반환하는 메서드입니다. 키가 이미 존재하면 기존 값을 반환합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문법&lt;/h3&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;dict.setdefault(key, default=None)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt;: 조회할 키&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default&lt;/code&gt;: 키가 없을 경우 삽입할 기본값 (기본값은 &lt;code&gt;None&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 예제&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 예제: 학생 점수 관리
scores = {&quot;Alice&quot;: 90, &quot;Bob&quot;: 85}

# 기존 키 조회
print(scores.setdefault(&quot;Alice&quot;, 100))  # 출력: 90

# 없는 키 추가
print(scores.setdefault(&quot;Charlie&quot;, 75))  # 출력: 75
print(scores)  # 출력: {'Alice': 90, 'Bob': 85, 'Charlie': 75}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 키가 없는 경우 동시 삽입 및 조회가 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의점&lt;/b&gt;: 키가 없으면 기본값이 항상 추가됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;defaultdict()란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;collections.defaultdict&lt;/code&gt;는 딕셔너리를 생성할 때, 기본값을 반환하는 함수를 지정하여 키가 없을 경우 자동으로 기본값을 생성해주는 클래스입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문법&lt;/h3&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;from collections import defaultdict
defaultdict(default_factory)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;default_factory&lt;/code&gt;: 기본값을 생성하는 함수 (예: &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;set&lt;/code&gt; 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용 예제&lt;/h3&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;from collections import defaultdict

# 기본값이 리스트인 defaultdict 생성
grouped_items = defaultdict(list)

# 값 추가
grouped_items[&quot;fruits&quot;].append(&quot;apple&quot;)
grouped_items[&quot;fruits&quot;].append(&quot;banana&quot;)
grouped_items[&quot;vegetables&quot;].append(&quot;carrot&quot;)

print(grouped_items)
# 출력: {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 키를 미리 확인하거나 초기화하지 않아도 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의점&lt;/b&gt;: 모든 키의 기본값은 동일한 &lt;code&gt;default_factory&lt;/code&gt;를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;code&gt;setdefault()&lt;/code&gt;와 &lt;code&gt;defaultdict()&lt;/code&gt;의 차이점&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;특성&lt;/th&gt;
&lt;th&gt;&lt;code&gt;setdefault()&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;defaultdict()&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;키가 없을 때 기본값을 추가&lt;/td&gt;
&lt;td&gt;키가 없을 때 자동으로 기본값 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;기본값 추가&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메서드 호출 시 지정&lt;/td&gt;
&lt;td&gt;초기화 시 &lt;code&gt;default_factory&lt;/code&gt;로 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용 시점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;키를 조건부로 추가해야 할 때&lt;/td&gt;
&lt;td&gt;키-값 쌍을 동적으로 관리할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;두 방법의 활용 사례&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;setdefault()&lt;/code&gt;를 활용한 키별 초기화&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;# 문자 개수 세기
text = &quot;hello world&quot;
char_count = {}

for char in text:
    if char != &quot; &quot;:
        char_count.setdefault(char, 0)
        char_count[char] += 1

print(char_count)  
# 출력: {'h': 1, 'e': 1, 'l': 3, 'o': 2, 'w': 1, 'r': 1, 'd': 1}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;defaultdict()&lt;/code&gt;를 활용한 키별 리스트 관리&lt;/h3&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;from collections import defaultdict

# 데이터 분류
data = [(&quot;fruit&quot;, &quot;apple&quot;), (&quot;fruit&quot;, &quot;banana&quot;), (&quot;vegetable&quot;, &quot;carrot&quot;)]

grouped_data = defaultdict(list)

for category, item in data:
    grouped_data[category].append(item)

print(grouped_data)
# 출력: {'fruit': ['apple', 'banana'], 'vegetable': ['carrot']}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;언제 사용해야 할까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;setdefault()&lt;/code&gt;&lt;/b&gt;: 단일 키에 대한 조건부 초기화가 필요한 경우.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;defaultdict()&lt;/code&gt;&lt;/b&gt;: 동일한 기본값으로 다수의 키를 처리해야 하는 경우.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 가지 방법을 적절히 활용하면 코드의 가독성과 효율성을 크게 향상시킬 수 있습니다. 필요에 따라 상황에 맞는 방식을 선택하면 됩니다.&lt;/p&gt;</description>
      <category>Language/Python</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/732</guid>
      <comments>https://sonseungha.tistory.com/732#entry732comment</comments>
      <pubDate>Sat, 30 Nov 2024 16:13:27 +0900</pubDate>
    </item>
    <item>
      <title>어느 날의 우리가 여느 날의 우리에게 | 문현기 저</title>
      <link>https://sonseungha.tistory.com/731</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cukiV2/btsK2VyFsxd/hQ0jKA5yUqCnKXtrfKcIo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cukiV2/btsK2VyFsxd/hQ0jKA5yUqCnKXtrfKcIo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cukiV2/btsK2VyFsxd/hQ0jKA5yUqCnKXtrfKcIo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcukiV2%2FbtsK2VyFsxd%2FhQ0jKA5yUqCnKXtrfKcIo1%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;400&quot; height=&quot;585&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;1200&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;이 편지를 받은 주인공을 얼마나 설래었을까, 그리고 매 편지를 얼마나 기다렸을까.&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;</description>
      <category>Book</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/731</guid>
      <comments>https://sonseungha.tistory.com/731#entry731comment</comments>
      <pubDate>Fri, 29 Nov 2024 18:37:41 +0900</pubDate>
    </item>
    <item>
      <title>Flax: JAX 기반 딥러닝 프레임워크의 특징과 미래</title>
      <link>https://sonseungha.tistory.com/730</link>
      <description>&lt;h1&gt;Flax: JAX 기반 딥러닝 프레임워크의 특징과 미래&lt;/h1&gt;
&lt;p&gt;Flax는 &lt;strong&gt;Google&lt;/strong&gt;에서 개발한 JAX 기반의 딥러닝 프레임워크로, 연구자와 엔지니어들이 고성능 딥러닝 모델을 실험하고 구축할 수 있도록 설계된 경량화된 도구입니다. PyTorch와 TensorFlow에 이어 Flax는 JAX의 강력한 성능을 기반으로 딥러닝 연구에 최적화된 옵션을 제공합니다. 본 글에서는 Flax의 특징, 장단점, 그리고 TensorFlow 및 PyTorch와의 비교를 통해 Flax의 가능성과 한계를 살펴보고자 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Flax의 특징&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;JAX의 성능 최적화&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Flax는 JAX를 기반으로 설계되어 다음과 같은 성능 이점을 제공합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XLA 컴파일러 활용&lt;/strong&gt;: 다양한 하드웨어(CPU, GPU, TPU)에서 최적화된 성능을 발휘합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JIT(Just-In-Time) 컴파일&lt;/strong&gt;: 계산 그래프를 실시간으로 컴파일하여 높은 처리 속도를 자랑합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic Differentiation&lt;/strong&gt;: JAX의 자동 미분 기능을 통해 복잡한 수학 연산을 효율적으로 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;함수형 프로그래밍 철학&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Flax는 함수형 프로그래밍 패러다임을 따릅니다. 이는 모델의 상태와 파라미터를 명시적으로 관리하며 코드의 가독성과 재현성을 높입니다. 함수형 프로그래밍은 특히 다음과 같은 장점이 있습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;코드의 간결성&lt;/strong&gt;: 복잡한 상태 관리를 줄여 코드 유지보수가 쉬워집니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유연성&lt;/strong&gt;: 연구자가 자유롭게 커스터마이징할 수 있는 환경을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;멀티 디바이스 지원&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Flax는 JAX의 기본 기능인 &lt;code&gt;pmap&lt;/code&gt;(병렬화)과 &lt;code&gt;vmap&lt;/code&gt;(벡터화)을 사용하여 GPU와 TPU에서 병렬 학습을 쉽게 수행할 수 있습니다. 이는 대규모 모델 학습과 고성능 연구에 적합합니다.&lt;/p&gt;
&lt;h3&gt;4. &lt;strong&gt;아직은 작은 생태계&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Flax는 PyTorch 및 TensorFlow에 비해 상대적으로 작은 생태계를 가지고 있습니다. 다만, Google의 지원 아래 최신 연구 실험에 필요한 기능들이 빠르게 추가되고 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Flax의 장점&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;고성능과 효율성&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JAX 기반으로 GPU/TPU 활용 성능이 매우 뛰어나며, NumPy와 유사한 인터페이스를 제공합니다.&lt;/li&gt;
&lt;li&gt;XLA 컴파일러를 통해 하드웨어 최적화가 자동으로 이루어집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;연구 친화적인 설계&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;함수형 프로그래밍 기반으로, 연구용 코드 작성과 실험이 용이합니다.&lt;/li&gt;
&lt;li&gt;PyTorch와 유사한 저수준 제어가 가능해 새로운 모델 구조 구현에 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;모듈화된 구조&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코드의 재사용성과 테스트가 용이하며, 명시적인 상태 관리를 통해 디버깅이 쉽습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;멀티 GPU/TPU 학습의 간소화&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JAX의 &lt;code&gt;pmap&lt;/code&gt;과 &lt;code&gt;vmap&lt;/code&gt;을 통해 멀티 디바이스 환경에서의 병렬 처리가 매우 간단합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;Flax의 단점&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;학습 곡선&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;기존 PyTorch나 TensorFlow와 달리 함수형 프로그래밍 방식에 익숙하지 않은 사용자에게는 처음 배우기가 어려울 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;작은 생태계&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TensorFlow와 PyTorch에 비해 관련 라이브러리, 툴, 문서가 부족합니다.&lt;/li&gt;
&lt;li&gt;데이터 전처리나 모델 서빙과 같은 산업용 도구는 제한적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;프로덕션 활용 제한&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flax는 연구와 실험에 초점이 맞춰져 있어 대규모 프로덕션 환경에서의 활용 사례는 상대적으로 적습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;TensorFlow 및 PyTorch와의 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;특성&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Flax&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;TensorFlow&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;철학&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;함수형 프로그래밍&lt;/td&gt;
&lt;td&gt;선언형 (TF 2.x)&lt;/td&gt;
&lt;td&gt;명령형 프로그래밍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;사용 용이성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;높은 유연성, 하지만 학습 난이도 있음&lt;/td&gt;
&lt;td&gt;직관적이고 높은 생산성&lt;/td&gt;
&lt;td&gt;직관적이며 배우기 쉬움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;성능 최적화&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XLA/JIT 활용, 뛰어난 하드웨어 지원&lt;/td&gt;
&lt;td&gt;XLA 지원 (선택적)&lt;/td&gt;
&lt;td&gt;GPU 최적화 및 TorchScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;생태계&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;풍부한 라이브러리와 도구&lt;/td&gt;
&lt;td&gt;다양한 모델 및 커뮤니티 지원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;연구/실험 적합성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;매우 적합&lt;/td&gt;
&lt;td&gt;적합&lt;/td&gt;
&lt;td&gt;매우 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;프로덕션 적합성&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;제한적&lt;/td&gt;
&lt;td&gt;매우 적합&lt;/td&gt;
&lt;td&gt;적합&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;Flax의 미래와 전망&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;연구 중심 프레임워크로 자리 잡을 가능성&lt;/strong&gt;&lt;br&gt;Flax는 연구자와 개발자가 고성능 모델을 실험할 수 있는 강력한 도구로 성장하고 있습니다. JAX의 성능과 유연성을 바탕으로 연구 중심의 생태계를 확장해 나갈 것입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JAX 생태계와의 동반 성장&lt;/strong&gt;&lt;br&gt;Flax는 JAX의 성공에 크게 의존하고 있습니다. JAX가 점점 더 많은 사용자와 도구를 확보하면 Flax도 그에 따라 성장할 가능성이 높습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google의 지원&lt;/strong&gt;&lt;br&gt;TensorFlow와 함께 Flax는 Google의 주요 딥러닝 프레임워크로 자리 잡고 있습니다. 연구와 프로덕션의 균형을 맞추기 위한 새로운 도구들이 계속해서 추가될 것입니다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PyTorch와의 경쟁&lt;/strong&gt;&lt;br&gt;PyTorch가 이미 연구와 산업 분야에서 큰 입지를 차지하고 있는 가운데, Flax는 JAX의 고유한 장점으로 연구 커뮤니티를 점차 흡수할 가능성이 있습니다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;p&gt;Flax는 JAX의 강력한 성능과 함수형 프로그래밍 철학을 기반으로 설계된 딥러닝 프레임워크로, 특히 연구와 실험 중심의 워크플로우에 적합합니다. PyTorch와 TensorFlow에 비해 생태계가 아직 작지만, Google의 지원과 JAX의 성장에 따라 점차 영향력을 확대해 나갈 것으로 보입니다.&lt;br&gt;연구와 고성능 실험을 목표로 하는 사용자라면 Flax를 활용해 보는 것을 추천합니다.&lt;/p&gt;</description>
      <category>AI/Framework</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/730</guid>
      <comments>https://sonseungha.tistory.com/730#entry730comment</comments>
      <pubDate>Mon, 18 Nov 2024 23:54:30 +0900</pubDate>
    </item>
    <item>
      <title>S/W Architecture - 시스템 구조 설명 View</title>
      <link>https://sonseungha.tistory.com/728</link>
      <description>&lt;p&gt;SW 아키텍처 문서 작성 시 다양한 관점(View)을 통해 시스템의 구조와 동작을 설명할 수 있는데, 주로 사용되는 View는 &lt;strong&gt;Context View&lt;/strong&gt;, &lt;strong&gt;Module View&lt;/strong&gt;, &lt;strong&gt;Behavior View&lt;/strong&gt;, &lt;strong&gt;Deployment View&lt;/strong&gt;입니다. 각 View는 서로 다른 측면에서 시스템을 분석하고 설명하는 역할을 하며, 차이점을 비교해보면 다음과 같습니다:&lt;/p&gt;
&lt;h3&gt;1. &lt;strong&gt;Context View&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;목적&lt;/strong&gt;: 시스템의 외부 환경과 상호작용을 설명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주요 내용&lt;/strong&gt;: 시스템이 외부 엔티티(사용자, 다른 시스템 등)와 어떻게 상호작용하는지를 다룬다. 즉, 시스템의 경계를 정의하고 외부에서 시스템으로 들어오거나 나가는 데이터를 설명한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;예시&lt;/strong&gt;: 시스템이 어떤 외부 서비스와 통신하는지, 사용자 인터페이스(UI)와의 상호작용은 어떤 방식으로 이루어지는지를 설명하는 다이어그램&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 비기술적인 이해관계자(사업팀, 고객 등)도 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;Module View&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;목적&lt;/strong&gt;: 시스템의 내부 구조(모듈 또는 컴포넌트)를 설명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주요 내용&lt;/strong&gt;: 시스템을 여러 모듈로 나누고, 각 모듈이 어떤 역할을 하는지, 모듈 간 상호작용 및 의존성을 다룬다. 모듈은 시스템의 코드, 클래스, 함수, 서브시스템 등의 논리적 구조로 볼 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;예시&lt;/strong&gt;: 클래스 다이어그램, 패키지 다이어그램 등 모듈 간의 관계 및 상호작용을 설명하는 자료&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 개발자나 설계자 같은 기술적인 이해관계자&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;Behavior View&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;목적&lt;/strong&gt;: 시스템의 동작 방식과 흐름을 설명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주요 내용&lt;/strong&gt;: 시스템이 어떻게 동작하고 처리 흐름이 어떤 방식으로 흘러가는지에 중점을 둔다. 이벤트가 발생할 때 시스템이 어떻게 반응하는지를 나타내며, 시스템의 내부 로직을 이해하는 데 중점을 둔다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;예시&lt;/strong&gt;: 시퀀스 다이어그램, 상태 다이어그램, 활동 다이어그램 등이 사용된다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 시스템의 내부 로직에 대한 이해가 필요한 기술적인 이해관계자(개발자, QA 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. &lt;strong&gt;Deployment View&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;목적&lt;/strong&gt;: 시스템의 물리적인 배포 환경을 설명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주요 내용&lt;/strong&gt;: 시스템이 실제로 어떤 하드웨어나 네트워크 환경에 배포되는지를 다루며, 서버, 데이터베이스, 네트워크 구성, 물리적인 컴퓨터 자원에 대한 정보를 제공한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;예시&lt;/strong&gt;: 서버 배포 다이어그램, 네트워크 구성도 등 배포 환경을 설명하는 자료&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;대상 독자&lt;/strong&gt;: 인프라 엔지니어, 네트워크 관리자, 시스템 운영팀 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;요약 비교&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;View&lt;/th&gt;
&lt;th&gt;목적&lt;/th&gt;
&lt;th&gt;주요 내용&lt;/th&gt;
&lt;th&gt;대상 독자&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시스템과 외부 상호작용 설명&lt;/td&gt;
&lt;td&gt;외부 시스템, 사용자와의 인터페이스, 상호작용&lt;/td&gt;
&lt;td&gt;비기술적 이해관계자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Module View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시스템의 내부 논리적 구조 설명&lt;/td&gt;
&lt;td&gt;모듈 간 관계, 역할 및 의존성&lt;/td&gt;
&lt;td&gt;개발자, 설계자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Behavior View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시스템의 동작 및 처리 흐름 설명&lt;/td&gt;
&lt;td&gt;이벤트 처리, 시스템 반응 방식&lt;/td&gt;
&lt;td&gt;기술적 이해관계자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시스템의 물리적 배포 환경 설명&lt;/td&gt;
&lt;td&gt;서버, 네트워크, 배포 인프라&lt;/td&gt;
&lt;td&gt;인프라 엔지니어, 운영팀&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;이처럼 각 View는 시스템의 다양한 측면을 다루며, 서로 다른 목적과 독자를 대상으로 한다는 점에서 차이가 있습니다.&lt;/p&gt;</description>
      <category>Software Architecture</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/728</guid>
      <comments>https://sonseungha.tistory.com/728#entry728comment</comments>
      <pubDate>Sat, 21 Sep 2024 22:58:52 +0900</pubDate>
    </item>
    <item>
      <title>[Tensorflow] ReduceLROnPlateau CallBack 정리</title>
      <link>https://sonseungha.tistory.com/727</link>
      <description>&lt;p&gt;&lt;code&gt;ReduceLROnPlateau&lt;/code&gt; 콜백은 Keras에서 학습 과정 중에 &lt;strong&gt;모델의 성능이 향상되지 않을 때 학습률(Learning Rate)을 줄여주는 역할&lt;/strong&gt;을 합니다. 학습률을 적절하게 조정하면 모델이 더 나은 성능을 낼 수 있는데, 이 콜백은 성능이 개선되지 않으면 학습률을 자동으로 감소시켜 &lt;strong&gt;학습의 안정성&lt;/strong&gt;과 &lt;strong&gt;최적화 효율성&lt;/strong&gt;을 높여줍니다.&lt;/p&gt;
&lt;h3&gt;주요 파라미터:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;monitor&lt;/code&gt;: 성능을 평가할 지표(예: &lt;code&gt;val_loss&lt;/code&gt;나 &lt;code&gt;accuracy&lt;/code&gt;)를 지정합니다. 기본값은 &lt;code&gt;val_loss&lt;/code&gt;입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;factor&lt;/code&gt;: 학습률을 얼마나 줄일지 설정합니다. 예를 들어, &lt;code&gt;factor=0.1&lt;/code&gt;이면 학습률을 10%로 줄입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;patience&lt;/code&gt;: 성능 개선이 없을 때 학습률을 줄이기 전에 기다릴 에포크 수를 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min_lr&lt;/code&gt;: 학습률이 이 값 이하로 내려가지 않도록 최소 학습률을 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cooldown&lt;/code&gt;: 학습률이 조정된 후 다시 지표를 모니터링하기 전에 기다리는 기간입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mode&lt;/code&gt;: &lt;code&gt;&amp;#39;auto&amp;#39;&lt;/code&gt;, &lt;code&gt;&amp;#39;min&amp;#39;&lt;/code&gt;, &lt;code&gt;&amp;#39;max&amp;#39;&lt;/code&gt; 중 선택할 수 있습니다. &lt;code&gt;&amp;#39;min&amp;#39;&lt;/code&gt;은 성능 지표의 최소값을 모니터링하고, &lt;code&gt;&amp;#39;max&amp;#39;&lt;/code&gt;는 최대값을 모니터링합니다. &lt;code&gt;&amp;#39;auto&amp;#39;&lt;/code&gt;는 지표 이름에 따라 자동으로 선택됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;예시 코드:&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from tensorflow.keras.callbacks import ReduceLROnPlateau

reduce_lr = ReduceLROnPlateau(monitor=&amp;#39;val_loss&amp;#39;, factor=0.2, patience=3, min_lr=0.001)

model.fit(X_train, y_train, epochs=50, validation_data=(X_val, y_val), callbacks=[reduce_lr])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 예시에서는 &lt;code&gt;val_loss&lt;/code&gt;가 3번 연속으로 향상되지 않으면 학습률을 20%로 감소시키며, 최소 학습률은 0.001입니다.&lt;/p&gt;</description>
      <category>AI/Framework</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/727</guid>
      <comments>https://sonseungha.tistory.com/727#entry727comment</comments>
      <pubDate>Mon, 9 Sep 2024 22:00:59 +0900</pubDate>
    </item>
    <item>
      <title>[차원축소] LDA (Linear Discriminant Analysis)</title>
      <link>https://sonseungha.tistory.com/726</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;차원 축소는 데이터 분석과 머신러닝에서 중요한 역할을 하는 기법입니다. 차원이 높은 데이터는 분석하기 어렵고, 과적합 문제나 계산 복잡도를 증가시킬 수 있기 때문에 이를 효과적으로 낮추는 방법이 필요합니다. &lt;b&gt;LDA&lt;/b&gt;는 차원 축소 기법 중 하나로, 특히 분류 문제에서 강력한 성능을 발휘합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA는 데이터의 차원을 줄이면서도 각 클래스 간의 분리도를 최대화하는 방법을 찾습니다. 이는 학습 데이터의 선형 조합을 사용하여 새 좌표 공간을 만들고, 그 공간에서 클래스 간의 경계를 명확하게 정의할 수 있도록 합니다. LDA는 주로 데이터가 여러 개의 클래스로 구분되어 있는 경우에 유용하며, 새로운 차원에서 클래스 간의 분리도를 최대화하는 방식으로 차원을 축소합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 아이디어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA의 핵심은 차원 축소를 통해 데이터의 분류 성능을 극대화하는 것입니다. 이를 위해 두 가지 중요한 행렬을 고려합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스 내 분산 (Within-class scatter)&lt;/b&gt;: 각 클래스 내부의 데이터 포인트들이 얼마나 퍼져 있는지를 측정합니다. 이는 데이터가 각 클래스 내에서 얼마나 비슷한지, 또는 얼마나 산포되어 있는지를 의미합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클래스 간 분산 (Between-class scatter)&lt;/b&gt;: 각 클래스의 중심점들이 서로 얼마나 떨어져 있는지를 측정합니다. 즉, 클래스 간의 차이를 나타냅니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA의 목표는 클래스 내 분산은 최소화하고, 클래스 간 분산은 최대화하는 방향으로 데이터의 투영 벡터를 찾는 것입니다. 이를 통해 클래스 간의 경계를 더 명확하게 구분할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알고리즘&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA는 다음과 같은 단계로 작동합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스 내 분산 행렬과 클래스 간 분산 행렬 계산&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 내 분산 행렬 (S_W)와 클래스 간 분산 행렬 (S_B)를 계산합니다.&lt;/li&gt;
&lt;/ul&gt;
클래스 내 분산 행렬:&lt;br /&gt;$$&lt;br /&gt;S_W = \sum_{i=1}^{c} \sum_{x \in X_i} (x - \mu_i)(x - \mu_i)^T&lt;br /&gt;$$&lt;br /&gt;여기서 (X_i)는 클래스 (i)에 속하는 데이터, (\mu_i)는 클래스 (i)의 평균입니다.&lt;/li&gt;
&lt;li&gt;클래스 간 분산 행렬:&lt;br /&gt;$$&lt;br /&gt;S_B = \sum_{i=1}^{c} N_i (\mu_i - \mu)(\mu_i - \mu)^T&lt;br /&gt;$$&lt;br /&gt;여기서 (N_i)는 클래스 (i)에 속하는 데이터 포인트의 개수, (\mu)는 전체 데이터의 평균입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적의 투영 벡터 찾기&lt;/b&gt;&lt;br /&gt;LDA는 클래스 간 분산을 최대화하고 클래스 내 분산을 최소화하는 투영 벡터 (w)를 찾습니다. 이를 위해 &lt;b&gt;일반화 고유값 문제&lt;/b&gt;를 풀어야 합니다:&lt;br /&gt;$$&lt;br /&gt;S_W^{-1} S_B w = \lambda w&lt;br /&gt;$$&lt;br /&gt;여기서 (S_W^{-1} S_B)는 분산 행렬의 비율을 나타내며, 이 비율을 통해 최적의 투영 방향을 결정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 투영&lt;/b&gt;&lt;br /&gt;최적의 투영 벡터를 찾은 후, 데이터는 그 벡터에 투영됩니다. 이를 통해 차원이 축소되고, 투영된 데이터는 새로운 좌표 공간에서 더 명확하게 구분될 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PCA와의 차이점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA와 PCA(주성분 분석)는 모두 차원 축소 기법이지만, 그 목적과 방법에서 큰 차이가 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;목적&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;PCA&lt;/b&gt;는 데이터의 분산을 최대화하는 방향을 찾습니다. 이는 모든 데이터 포인트 간의 변동성을 최대화하려는 목적을 가집니다. 즉, 데이터를 설명하는 가장 중요한 방향을 찾는 것이 목표입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LDA&lt;/b&gt;는 클래스 간의 분리를 최대화하는 방향을 찾습니다. 이는 분류 문제에서 각 클래스를 명확히 구분할 수 있는 방향을 찾는 데 집중합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터의 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;PCA&lt;/b&gt;는 클래스 정보를 사용하지 않습니다. 데이터의 전체적인 분포를 기준으로 차원을 축소합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LDA&lt;/b&gt;는 클래스 정보를 적극적으로 사용하여, 각 클래스 간의 차이를 극대화하는 방향으로 차원을 축소합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차원 축소 방식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;PCA&lt;/b&gt;는 데이터의 총 분산을 기준으로 차원을 축소합니다. 즉, 데이터의 가장 큰 변동성을 설명하는 주성분을 찾습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LDA&lt;/b&gt;는 클래스 간 분산과 클래스 내 분산을 모두 고려하여 차원을 축소합니다. LDA는 클래스 간 분리를 최대화하면서도 데이터의 구조를 유지하려 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;차원의 제한&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;PCA&lt;/b&gt;는 데이터의 차원 수만큼 주성분을 찾을 수 있습니다. 하지만 LDA는 클래스의 개수에 따라 찾을 수 있는 축의 개수가 제한됩니다. LDA에서 찾을 수 있는 최대 투영 차원 수는 (c - 1)입니다. 여기서 (c)는 클래스의 수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA는 데이터 분류 문제에서 매우 효과적인 차원 축소 기법입니다. 클래스 간 분리를 극대화하여 분류 성능을 향상시킬 수 있으며, PCA와는 달리 클래스 정보를 활용해 데이터를 더 명확히 구분할 수 있는 특징을 가집니다. 이를 통해 고차원 데이터에서도 효율적인 차원 축소가 가능하며, 많은 머신러닝 알고리즘과 함께 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LDA는 특히 데이터의 선형성을 가정할 때 매우 강력한 도구로, 다양한 분야에서 활발히 활용되고 있습니다.&lt;/p&gt;</description>
      <category>AI/Machine Learning</category>
      <category>LDA</category>
      <category>차원축소</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/726</guid>
      <comments>https://sonseungha.tistory.com/726#entry726comment</comments>
      <pubDate>Sat, 7 Sep 2024 18:45:46 +0900</pubDate>
    </item>
    <item>
      <title>선형회귀 Regularization(Lasso, Ridge 등) 수행 시 연속형 변수의 표준화가 수렴속도에 미치는 영향</title>
      <link>https://sonseungha.tistory.com/725</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;선형 회귀에서 회귀계수에 대해 Regularization(정규화)을 할 때, 연속형 변수에 대한 표준화 또는 정규화가 매우 중요합니다. 그 이유는 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;회귀계수의 크기&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정규화 기법들(L1 정규화(Lasso)나 L2 정규화(Ridge))은 회귀계수의 크기를 제어하는 데 사용됩니다. 만약 독립 변수들의 스케일이 다르면, 스케일이 큰 변수는 더 큰 회귀계수를 가지게 되어 정규화의 효과가 비대칭적으로 적용될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정규화 페널티의 일관성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;L1 및 L2 정규화는 페널티 항을 추가하여 회귀계수를 줄이는 방식입니다. 이 때, 변수들의 스케일이 동일하지 않으면 페널티가 각 변수에 공평하게 적용되지 않아 모델이 왜곡될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수렴 속도&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준화된 데이터는 경사 하강법과 같은 최적화 알고리즘의 수렴 속도를 빠르게 합니다. 이는 학습 시간을 줄이고, 더 나은 해를 찾는 데 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;연속형 변수에 대해 표준화(Standardization) 또는 정규화(Normalization)&lt;/b&gt;를 수행하는 것이 권장됩니다. 표준화는 각 변수의 평균을 0, 표준편차를 1로 변환하는 것이며, 정규화는 값을 특정 범위로 스케일링하는 것입니다. 표준화가 일반적으로 더 자주 사용되며, 특히 정규화 기술을 사용하는 경우에는 필수적이라고 할 수 있습니다.&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;from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge

# 예제 데이터
X = [[1, 2], [2, 3], [4, 5], [6, 8], [10, 12]]
y = [1, 2, 3, 4, 5]

# 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 정규화 회귀 모델
model = Ridge(alpha=1.0)
model.fit(X_scaled, y)

print(&quot;회귀계수:&quot;, model.coef_)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예제에서는 &lt;code&gt;StandardScaler&lt;/code&gt;를 사용하여 데이터를 표준화한 후, Ridge 회귀 모델을 학습시켰습니다. 이렇게 하면 정규화의 효과가 변수들에 공평하게 적용되어 보다 안정적이고 해석 가능한 모델을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준화된 데이터가 경사 하강법의 수렴 속도를 빠르게 하는 이유는 주로 &lt;b&gt;조건수(Condition Number)&lt;/b&gt;와 관련이 있습니다. 조건수가 낮으면 경사 하강법이 더 빠르게 수렴할 수 있습니다. 자세히 설명하자면:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;조건수(Condition Number)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건수는 행렬이 얼마나 잘 조절되는지, 즉 얼마나 민감하게 반응하는지를 나타내는 지표입니다. 회귀 문제에서 조건수는 설계 행렬(X)의 스케일링과 관련이 있습니다. 표준화되지 않은 데이터는 서로 다른 스케일을 가지기 때문에 설계 행렬의 조건수가 높아질 수 있습니다. 이는 경사 하강법이 최적의 값에 도달하는 데 더 많은 시간이 걸리게 만듭니다.&lt;/li&gt;
&lt;li&gt;반면, 데이터를 표준화하면 각 변수의 스케일이 비슷해지면서 설계 행렬의 조건수가 낮아져 경사 하강법의 수렴 속도가 빨라집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경사 하강법의 방향과 크기&lt;/b&gt;:
&lt;ul 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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;등고선의 모양&lt;/b&gt;:
&lt;ul 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;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 표준화된 데이터와 표준화되지 않은 데이터에 대한 경사 하강법의 수렴 속도를 비교하는 예제입니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt

# 데이터 생성
X, y = make_regression(n_samples=1000, n_features=2, noise=0.1, random_state=42)

# 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 경사 하강법 모델
model_unscaled = SGDRegressor(max_iter=1, tol=None, learning_rate='constant', eta0=0.01, random_state=42)
model_scaled = SGDRegressor(max_iter=1, tol=None, learning_rate='constant', eta0=0.01, random_state=42)

# 손실 값을 저장할 리스트
loss_unscaled = []
loss_scaled = []

# 에폭 수
epochs = 100

# 학습 및 손실 값 기록
for epoch in range(epochs):
    model_unscaled.partial_fit(X, y)
    model_scaled.partial_fit(X_scaled, y)

    # 예측값 계산
    y_pred_unscaled = model_unscaled.predict(X)
    y_pred_scaled = model_scaled.predict(X_scaled)

    # MSE 계산
    mse_unscaled = np.mean((y - y_pred_unscaled) ** 2)
    mse_scaled = np.mean((y - y_pred_scaled) ** 2)

    loss_unscaled.append(mse_unscaled)
    loss_scaled.append(mse_scaled)

# 손실 값 그래프
plt.plot(loss_unscaled, label='Unscaled Data')
plt.plot(loss_scaled, label='Scaled Data')
plt.xlabel('Epochs')
plt.ylabel('Mean Squared Error')
plt.legend()
plt.title('Comparison of Convergence Speed')
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예제에서 &lt;code&gt;SGDRegressor&lt;/code&gt;를 사용하여 표준화된 데이터와 표준화되지 않은 데이터에 대해 경사 하강법을 적용하고 손실 함수 값을 비교합니다. 표준화된 데이터는 더 빠르게 최적의 손실 값에 도달하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xhtot/btsIfVJSWMl/vzNut4PaburDKOQg54mjkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xhtot/btsIfVJSWMl/vzNut4PaburDKOQg54mjkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xhtot/btsIfVJSWMl/vzNut4PaburDKOQg54mjkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxhtot%2FbtsIfVJSWMl%2FvzNut4PaburDKOQg54mjkK%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;602&quot; height=&quot;455&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;455&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>AI/Machine Learning</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/725</guid>
      <comments>https://sonseungha.tistory.com/725#entry725comment</comments>
      <pubDate>Fri, 28 Jun 2024 19:27:40 +0900</pubDate>
    </item>
    <item>
      <title>데이터 스누핑 편향이란?</title>
      <link>https://sonseungha.tistory.com/724</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 스누핑 편향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 과학과 머신러닝 프로젝트를 진행하다 보면, 데이터를 탐색하고 분석하는 과정에서 주의해야 할 여러 가지 편향이 발생할 수 있습니다. 그 중 하나가 바로 &lt;b&gt;데이터 스누핑 편향(data snooping bias)&lt;/b&gt;입니다. 이 글에서는 데이터 스누핑 편향이 무엇인지, 왜 발생하는지, 그리고 이를 방지하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 스누핑 편향이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 스누핑 편향은 데이터를 반복적으로 탐색하고 분석하여 얻은 결과를 바탕으로 모델을 구축함으로써 발생하는 통계적 편향입니다. 이는 데이터를 과도하게 탐색한 결과, 실제로는 존재하지 않는 패턴을 발견하게 되어 모델이 잘못된 결론을 도출하게 되는 현상입니다. 이러한 편향은 특히 모델을 평가할 때 문제가 되며, 과적합(overfitting)의 원인이 되기도 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 스누핑 편향이 발생하는 이유&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;모델 선택 및 튜닝 과정에서의 데이터 사용&lt;/b&gt;: 데이터를 여러 번 탐색하여 최적의 모델이나 하이퍼파라미터를 선택하는 과정에서 데이터의 노이즈에 적합한 모델을 선택하게 되어, 실제 성능보다 높아 보이는 성능이 나타날 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;과도한 특성 공학&lt;/b&gt;: 데이터를 반복적으로 분석하고 새로운 특징(feature)을 만들어내는 과정에서 데이터의 특성을 과하게 반영하게 되어, 모델이 데이터셋에 과적합될 가능성이 높아집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터에 의한 후진 분석&lt;/b&gt;: 특정 패턴이나 관계를 찾기 위해 데이터를 반복적으로 탐색하다 보면, 실제로는 존재하지 않는 우연한 패턴을 모델이 학습하게 되는 경우가 발생할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 스누핑 편향의 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 주식 시장 데이터를 사용하여 미래 주가를 예측하는 모델을 개발한다고 가정해봅시다. 전체 데이터를 탐색하며 여러 가지 특징을 만들어내고, 이를 기반으로 여러 가지 모델을 실험해 본다고 가정합니다. 이 과정에서 최적의 모델을 찾기 위해 동일한 데이터를 반복적으로 사용하게 된다면, 모델이 훈련 데이터에 과적합될 가능성이 높아집니다. 결과적으로, 실제 새로운 데이터에 대해 모델의 예측 성능은 낮아질 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 스누핑 편향 방지 방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;훈련 데이터와 테스트 데이터의 분리&lt;/b&gt;: 데이터를 훈련 데이터와 테스트 데이터로 나누어, 모델의 성능 평가를 독립된 테스트 데이터로 수행합니다. 이는 모델이 보지 못한 데이터를 통해 성능을 검증하는 방법입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;검증 세트 사용&lt;/b&gt;: 하이퍼파라미터 튜닝을 위해 훈련 데이터를 다시 훈련 데이터와 검증 데이터로 나누어 사용합니다. 이렇게 하면 모델 평가에 사용되지 않은 데이터로 모델을 튜닝할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교차 검증&lt;/b&gt;: 교차 검증(cross-validation)을 통해 모델의 성능을 평가하고, 데이터 스누핑 편향을 줄입니다. 교차 검증은 데이터를 여러 부분으로 나누어, 각 부분을 한 번씩 테스트 데이터로 사용하여 모델을 평가하는 방법입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 탐색의 제한&lt;/b&gt;: 데이터 탐색과 분석을 신중하게 수행하고, 과도한 탐색을 피합니다. 데이터를 분석할 때는 사전에 정의된 절차와 방법을 따르는 것이 좋습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&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;</description>
      <category>AI/Data Science</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/724</guid>
      <comments>https://sonseungha.tistory.com/724#entry724comment</comments>
      <pubDate>Sat, 22 Jun 2024 19:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Poetry] requirements.txt 파일로 Poetry에 import 하기</title>
      <link>https://sonseungha.tistory.com/723</link>
      <description>&lt;p&gt;먼저, 파이썬 프로젝트 관리를 위해 Poetry를 사용하는 분들이 많습니다. 이 글을 읽으시는 분들은 Poetry를 처음 활용하여 기존의 requirements.txt를 이용한 환경을 변환하기 위한 분일 것이라 생각합니다. Poetry는 훌륭한 선택이며, Poetry가 표준으로 자리 잡기를 희망합니다.&lt;/p&gt;
&lt;p&gt;이제 더 이상 간소한 requirements.txt 파일을 사용하지 않고 의존성을 Poetry로 옮기고, 올바른 버전 추적을 포함한 모든 것을 처리하게 할 차례입니다.&lt;/p&gt;
&lt;p&gt;이미 Poetry 프로젝트를 초기화하고 프로젝트 루트에 pyproject.yml 파일이 있는 것으로 가정합니다. 그렇지 않은 경우 다음 명령을 실행하여 Poetry를 사용하여 파이썬 프로젝트를 초기화합니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;poetry init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이제 requirements.txt에서 Poetry로 의존성을 이동하는 것은 다음과 같이 프로젝트 루트에서 다음 명령을 실행하는 것만큼 쉽습니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;poetry add $(cat requirements.txt)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;간단한 방법으로 requirements.txt 파일을 사용하는 방법에서 Poetry로의 전환을 해보았습니다.&lt;/p&gt;</description>
      <category>AI/MLOps</category>
      <category>poetry</category>
      <category>requirements.txt</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/723</guid>
      <comments>https://sonseungha.tistory.com/723#entry723comment</comments>
      <pubDate>Fri, 17 May 2024 23:10:57 +0900</pubDate>
    </item>
    <item>
      <title>About ME</title>
      <link>https://sonseungha.tistory.com/notice/722</link>
      <description>&lt;h2&gt;Hi there  &lt;/h2&gt;
&lt;p&gt;I&amp;#39;m working as an on-device developer at Samsung Electronics. My job involves analyzing data collected from products and developing AI services to run on-device.&lt;br&gt;As a developer who enjoys learning and sharing new things, I always pursue challenges and growth. Specializing in one field is great, but I strive to become a generalist. I enjoy studying various domains, integrating their knowledge, and applying them to create innovative services.&lt;/p&gt;
&lt;p&gt;I had taken on the role of educating student developers, then I moved on to designing and developing projects in various domains, such as developing Linux-based platforms, conducting system performance analysis and optimization, and creating Android applications. Currently, I am growing as a data analyst and AI developer, focusing on developing AI services through product data-driven user usability, and working on projects like MLOps and AutoML.&lt;/p&gt;
&lt;p&gt;The languages I frequently use are C, C++, Python. And i am a developer who love linux, open-source, s/w architecture. I &lt;/p&gt;
&lt;p&gt;Join me in exploring new technologies and developing innovative solutions! Feel free to reach out if you&amp;#39;d like to collaborate or have any questions or suggestions.&lt;/p&gt;
&lt;h2&gt;Experience&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;2023.02 ~ Present, (OnDevice) AI Developer, Samsung Electronics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I am responsible for analyzing time-series data collected from home appliances and developing new AI services based on that data.&lt;/li&gt;
&lt;li&gt;Role:&lt;ul&gt;
&lt;li&gt;Data Analysis : Conducted data analysis tasks such as diagnosing malfunctions in home appliances and analyzing user patterns for functions like occupancy detection and air conditioner power efficiency.&lt;/li&gt;
&lt;li&gt;OnDeviceAI : Develope and optimize ai-model for ondevice such as diagnosing air conditioner malfunctions and detecting carpet areas for robot vacuum cleaners.&lt;/li&gt;
&lt;li&gt;MLOps : Currently, I am designing and developing a TinyMLOps system for OnDeviceAI. I am particularly interested in AutoML-based services and am working on a project to automatically generate lightweight models for OnDevice AI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Used:&lt;ul&gt;
&lt;li&gt;C, C++, Python&lt;/li&gt;
&lt;li&gt;Tensorflow, PyTorch, PySpark&lt;/li&gt;
&lt;li&gt;AWS SageMaker, Docker, Github, MLFlow, Apache Airflow and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2022.01 ~ 2023.02, S/W Developer, Samsung Electronics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop android application&lt;/li&gt;
&lt;li&gt;Role: &lt;ul&gt;
&lt;li&gt;Responsible for the development of data transmission and reception components between an Android wearable device-based exercise data collection and processing application and a mobile device.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Used:&lt;ul&gt;
&lt;li&gt;Kotlin(Application), C#(for Unity), C++(native library)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2022.02 ~ 2020.02, System S/W Developer, Samsung Electronics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tizen Platform optimization and profiling&lt;/li&gt;
&lt;li&gt;Role:&lt;ul&gt;
&lt;li&gt;Develop profiling tool : Terminal application capable of checking ELF dependency and security information.&lt;/li&gt;
&lt;li&gt;System boot time optimization, application CPU, memory, and runtime optimization and analyze memory curruption, Dead-lock, and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Used:&lt;ul&gt;
&lt;li&gt;C, C++ (Profiling Tool)&lt;/li&gt;
&lt;li&gt;Various tools such as Valgrind, Systemd-analyze, gdb, lldb, etc(strace, top, flamegraph, atrace, ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Blog: &lt;a href=&quot;https://sonseungha.tistory.com/category/Linux/Profiling&quot;&gt;Linux Profiling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2018.03 ~ 2020.02, System S/W Developer, Samsung Electronics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop framework and application for the 5G PHY, MAC layers on modem platform.&lt;/li&gt;
&lt;li&gt;Role:&lt;ul&gt;
&lt;li&gt;As an architect and developer, I participated in task management, log system development, and the creation of a 5G metadata(YANG) framework to ensure smooth operation of the application.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Used:&lt;ul&gt;
&lt;li&gt;C, C++, Shell Script&lt;/li&gt;
&lt;li&gt;Make, pkg-config, Jenkins, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2016.03 ~ 2018.02, System S/W Developer, Samsung Electronics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tizen Platform Application Framework&lt;/li&gt;
&lt;li&gt;Role:&lt;ul&gt;
&lt;li&gt;Develop application utility such as interaction between app and user and IPC framework between each application&lt;/li&gt;
&lt;li&gt;Develop application install, update, uninstall framework&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Used:&lt;ul&gt;
&lt;li&gt;C, C++, C# (Framework and API)&lt;/li&gt;
&lt;li&gt;CMake, Redhat Package Manager, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2014.03 ~ 2016.02, Education Manager, Samsung Electronics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Role:&lt;ul&gt;
&lt;li&gt;Participated in a program aimed at discovering and selecting outstanding student developers for training.&lt;/li&gt;
&lt;li&gt;I conducted software-related education for students and served as a mentor for their software projects, managing tasks and evaluating assignments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Contribution Graph&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://github-readme-activity-graph.vercel.app/graph?username=linuxias&amp;theme=github&amp;area=true&amp;count_private=true&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</description>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/notice/722</guid>
      <pubDate>Tue, 7 May 2024 00:05:54 +0900</pubDate>
    </item>
    <item>
      <title>Time Series Data Augmentation for Deep Learning: A Survey</title>
      <link>https://sonseungha.tistory.com/721</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxeq4S/btsHdgfzwOK/6VzxlemBCdo1Cf8SazxJ10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxeq4S/btsHdgfzwOK/6VzxlemBCdo1Cf8SazxJ10/img.png&quot; data-alt=&quot;https://arxiv.org/abs/2002.12478&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxeq4S/btsHdgfzwOK/6VzxlemBCdo1Cf8SazxJ10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdxeq4S%2FbtsHdgfzwOK%2F6VzxlemBCdo1Cf8SazxJ10%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;811&quot; height=&quot;579&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://arxiv.org/abs/2002.12478&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Time Series Data Augmentation for Deep Learning: A Survey&quot;는 딥러닝에서 시계열 데이터 증강에 대한 연구 동향과 적용 가능한 기법들을 상세히 조사한 논문입니다. 아래는 논문 내용의 상세한 설명입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) paper Information&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;30th International Joint Conference on Artifical Intelligence(IJCAI 2021) Accepted Paper&lt;/li&gt;
&lt;li&gt;Deep Learning 시계열 데이터 분석 전반에 사용될 수 있는 Data Augmentation 기법들을 정리한 논문&lt;/li&gt;
&lt;li&gt;글 작성 시점 (2024. 05. 06) 기준으로 681회 인용된 논문&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) Backgrounds&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6U0cP/btsHaZ0WTSz/7b8aIRQ7uahMGiswRQFzt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6U0cP/btsHaZ0WTSz/7b8aIRQ7uahMGiswRQFzt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6U0cP/btsHaZ0WTSz/7b8aIRQ7uahMGiswRQFzt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6U0cP%2FbtsHaZ0WTSz%2F7b8aIRQ7uahMGiswRQFzt1%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;420&quot; height=&quot;281&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝은 컴퓨터 비전, 자연어 처리 등의 연구 분야에서 큰 성과를 보이고 있습니다. 이러한 성과를 이룰 수 있었던 배경에는 우수한 딥러닝 모델들의 구조와 더불어 충분히 많은 데이터와 데이터 증강을 통해 모델이 과적합 됨을 방지하였기 때문입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.1) 컴퓨터 비전 분야의 Augmentation 기법 종류&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 비전 분야에서는 다양한 데이터 증강 기법이 사용되어 모델의 성능을 향상시키고, 일반화 성능을 향상시키는 데 활용됩니다. 여러 가지 데이터 증강 기법 중 일부를 아래에 설명합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이동(Translation):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 수평 또는 수직으로 이동시켜서 새로운 이미지를 생성하는 기법입니다. 이미지 내의 객체 위치 변화를 모방하고 데이터 다양성을 증가시키는 데 효과적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;회전(Rotation):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 일정한 각도로 회전시켜 새로운 이미지를 생성하는 기법입니다. 회전은 이미지의 각도에 대한 불변성을 학습하고, 다양한 각도에서의 객체 인식을 향상시키는 데 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확대/축소(Scaling):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지의 크기를 확대 또는 축소하여 다양한 크기의 이미지를 생성하는 기법입니다. 크기 변화에 대한 강인한 모델을 학습하고, 다양한 크기의 객체를 인식하는 데 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;밝기 조절(Brightness Adjustment):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지의 밝기를 조절하여 새로운 이미지를 생성하는 기법입니다. 밝기 변화에 대한 강인한 모델을 학습하고, 다양한 조명 조건에서의 객체 인식을 향상시키는 데 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;채도 조절(Saturation Adjustment):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지의 채도를 조절하여 다양한 색상의 이미지를 생성하는 기법입니다. 채도 변화에 대한 강인한 모델을 학습하고, 다양한 환경에서의 객체 인식을 향상시키는 데 도움이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가우시안 노이즈 추가(Gaussian Noise Injection):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지에 가우시안 노이즈를 추가하여 새로운 이미지를 생성하는 기법입니다. 노이즈에 강인한 모델을 학습하고, 다양한 환경에서의 객체 인식을 향상시키는 데 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가로 뒤집기(Horizontal Flip):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 가로로 뒤집어서 새로운 이미지를 생성하는 기법입니다. 객체의 좌우 대칭 변화를 모방하고, 데이터 다양성을 증가시키는 데 효과적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세로 뒤집기(Vertical Flip):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를 세로로 뒤집어서 새로운 이미지를 생성하는 기법입니다. 객체의 상하 대칭 변화를 모방하고, 데이터 다양성을 증가시키는 데 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 다양한 데이터 증강 기법들이 있으며, 이를 조합하여 모델의 학습을 더욱 효과적으로 할 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.2) 시계열&amp;nbsp; 데이터 분석 분야의 데이터 증강(Augmentation)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 데이터 분석 분야에서 딥러닝을 활용한 연구 분야는 많이 이뤄지고 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;TimeSeries Classification&lt;/li&gt;
&lt;li&gt;TimeSeries Anamaly Detection&lt;/li&gt;
&lt;li&gt;TimeSeries Forcasting&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;하지만 시계열 데이터 분석 분야서의 &lt;/span&gt;데이터 증강 관련 연구들은 컴퓨터 비전과 자연어처리와 같은 분야와 달리 활발하게 이뤄지지는 않고 있습니다. 해당 논문에서는시계열 데이터 분석에서의 데이터 증강 연구의 어려움을 아래와 같이 크게 2가지로 정리하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;한계점 1.&amp;nbsp; 현존하는 데이터 증강 기법들은 시계열 데이터의 내재적 특성(Intrinsic property)을 활용하지 못함&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 시계열 데이터는 시간 종속성(Temporal Dependency)이라는 특성을 가집니다.&lt;/li&gt;
&lt;li&gt;이미지나 언어 데이터와는 다르게 시계열 데이터는 크게 시간과 빈도 도메인으로 나눌 수 있는데, 이러한 각각의 Transformed Domain에 적합한 데이터 증강이 수행되어야 하기 때문에 다른 데이터에 비해 비교적 어려움이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한계점 2. 현존하는 데이터 증강 기법들은 Task에 의존적인 경향이 존재함&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TimeSeries Classification에 쓰인 증강기법이, TimeSeries Anomaly Detection에는 적합하지 않을 수 있습니다.&lt;/li&gt;
&lt;li&gt;또한, 데이터 간의 불균형이 큰 데이터와 그렇지 않은 데이터를 활용함에 있어서 다른 접근의 Data Augmention이 필요할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.3) 논문에서 제시하는 시계열 데이터 증강 기법의 분류&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTxMW/btsHbeXYxsa/YmQvfjWsRrg3e5P8ymZHTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTxMW/btsHbeXYxsa/YmQvfjWsRrg3e5P8ymZHTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTxMW/btsHbeXYxsa/YmQvfjWsRrg3e5P8ymZHTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTxMW%2FbtsHbeXYxsa%2FYmQvfjWsRrg3e5P8ymZHTk%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;677&quot; height=&quot;402&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 논문에서는 시계열 데이터 증강 기법을 크게 Basic Approaches와 Advanced Approaches로 나뉠 수 있다고 제시하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Basic Approaches에서는 시간, 주파수 영역에서의 증강 기법에 대해 설명하고 Advanced Approaches에는 확률적 기법이나 학습 기법을 활용한 데이터 증강 기법에 대해 분류하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Basic Approaches&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서 분류하고 있는 Basic Approaches에는 Time Domain, Ferquency Domain, Time-Freq Domain 3가지로 분류하고 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Basic Approaches의 분류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Time Domain, Ferquency Domain, Time-Freq Domain 분류 내의 종류는 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Time Domain
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Window cropping, slicing&lt;/li&gt;
&lt;li&gt;Window warping&lt;/li&gt;
&lt;li&gt;Flipping&lt;/li&gt;
&lt;li&gt;Perturbation &amp;amp; Ensemble&lt;/li&gt;
&lt;li&gt;Noise Injection&lt;/li&gt;
&lt;li&gt;Label Expansion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Frequency Domain
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;APP (Amplitude and Phase Pertubations)&lt;/li&gt;
&lt;li&gt;AAFT (Amplitude Adjusted Fourier Transform) &amp;amp; IAAFT(iterated AAFT)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Time-Frequency Domain
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;STFT (Short Fourier Transform)&lt;/li&gt;
&lt;li&gt;Mel-Frequency&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) Time Domain&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lc5Bx/btsHbhNSGuL/cTdKx0jknVjJUezPyUSF51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lc5Bx/btsHbhNSGuL/cTdKx0jknVjJUezPyUSF51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lc5Bx/btsHbhNSGuL/cTdKx0jknVjJUezPyUSF51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLc5Bx%2FbtsHbhNSGuL%2FcTdKx0jknVjJUezPyUSF51%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;348&quot; height=&quot;451&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 영역 변환은 시계열 데이터에 대한 가장 직관적인 데이터 증강 방법 중 하나입니다. 대부분의 경우 이러한 방법들은 원래 입력 시계열 데이터를 직접 조작합니다. 가우시안 노이즈를 주입하거나 스파이크, 단계적 추세 및 기울기와 같은 더 복잡한 노이즈 패턴을 주입하는 것과 같은 방법입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.1) Window cropping, slicing&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Window cropping, slicing기법은 컴퓨터 비전영역에서의 자르기와 유사합니다. 이는 원래 시계열 데이터에서 연속된 조각을 무작위로 추출하는 샘플링 방법입니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.2) Window warping&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Window warping 기법은 시계열 데이터를 위한 독특한 증강 기법 입니다. 동적 시간 왜곡(DTW)와 유사하게 무작위 시간 범위를 선택한 다음, 해당 범위를 압축(다운 샘플링)하거나 확장(업샘플링) 합니다. 다른 시간 범위는 변경되지 않습니다. Window warping은 원래 시계열의 총 길이를 변경하므로 딥러닝 모델에는 Window slicing과 함께 수행되어야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHMpk2/btsHcT55ST8/VaQGuDCQgYMjI3OKk7S5t0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHMpk2/btsHcT55ST8/VaQGuDCQgYMjI3OKk7S5t0/img.jpg&quot; data-alt=&quot;https://towardsdatascience.com/time-series-augmentations-16237134b29b&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHMpk2/btsHcT55ST8/VaQGuDCQgYMjI3OKk7S5t0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHMpk2%2FbtsHcT55ST8%2FVaQGuDCQgYMjI3OKk7S5t0%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;700&quot; height=&quot;138&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://towardsdatascience.com/time-series-augmentations-16237134b29b&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.3) Perturbation &amp;amp; Ensemble&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Perturbation을 수행한 시계열 데이터에 대하여 DTW를 수행하여 Original data의 길이로 맞춰준 뒤 ensemble하는 DBA(DTW Barycentric Averaging)기법을 통해 데이터를 증강하는 기법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 설명은 해당 링크를 (&lt;a href=&quot;https://arxiv.org/pdf/1808.02455&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/pdf/1808.02455&lt;/a&gt;) 참고해주세요.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.4) Noise Injection&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 데이터 원본에 Noise나 Outlier를 주입하는 방법입니다. Spike, Step-like Trand, Slope-like Trend 등의 기법등이 사용됩니다. 해당 노이즈는 Label의 정보가 변경되지 않는 매우 적은 값으로 설정해야 합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.5) Label Expansion&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 이상치 탐지의 경우 이상치들이 단순히 한 시점이 아니라 연속적으로 길게 나타나는 특성이 있습니다.(Blurry) 이에 단순 한 시점을 이상치로 하지 않고, Label Expansion을 통해 주변까지 이상치로 정의해주는 방법입니다. (&lt;a href=&quot;https://arxiv.org/pdf/2002.09545&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/pdf/2002.09545&lt;/a&gt;)&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) Frequency Domain&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수 영역에 대해 이해하기 위해서는 푸리에 변환(Fourier Transform)에 대해 간단히라고 이해하고 있어야 합니다. 푸리에 변환은 다양한 자료들을 구하기 쉽기에 건너뛰겠습니다. &lt;br /&gt;(추천 자료 : &lt;a href=&quot;https://angeloyeo.github.io/2020/11/08/linear_algebra_and_Fourier_transform.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://angeloyeo.github.io/2020/11/08/linear_algebra_and_Fourier_transform.html&lt;/a&gt;)&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;Amplitude Spectrum (진폭) : 시계열 데이터가 갖는 주파수 성분들의 진폭&lt;/li&gt;
&lt;li&gt;Phase Spectrum (위상) : 각 주파수 성분들의 시간 축 상의 위치를 의미함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용을 기반으로 Frequency Domain에서 사용되는 APP, AAFT 기법에 대해 간략히 정리하겠습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.1) APP (Amplitude and Phase Perturbations)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 소개했던 시계열 데이터의 Amplitude Spectrum과 Phase spectrum에 Perturbation을 수행한 기법입니다. Amplitude Spectrum은 일부 데이터를 원본 데이터의 평균과 분산을 갖는 Gaussian Noise로 대체하고 Phase Spectrum은 일부 데이터에 zero-mean Gaussian Noise를 더합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.2) AAFT (Amplitude Adjusted Fourier Transform) &amp;amp; IAAFT(iterated AAFT)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blqsd9/btsHbfvMNQc/kQUhmXC2QA4kjkQSmLdiXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blqsd9/btsHbfvMNQc/kQUhmXC2QA4kjkQSmLdiXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blqsd9/btsHbfvMNQc/kQUhmXC2QA4kjkQSmLdiXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblqsd9%2FbtsHbfvMNQc%2FkQUhmXC2QA4kjkQSmLdiXk%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;700&quot; height=&quot;196&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AAFT는 푸리에 변환 후 Phase Spectrum에서 무작위로 Phase를 Shuffle한 뒤 Inverse Fourier Transform을 수애하여 Amplitude는 보존되고 Phase만 바뀐 데이터를 생성하는 방법입니다. IAAFT는 AAFT의 발전된 버전으로, iterative step을 통해 AAFT가 좀 더 잘 수렴할 수 있도록 개선시킨 방법입니다. AAFT와 IAAFT 기법의 장점은 해당 기법들로 생성된 시계열 데이터는 대략적으로 기존 시계열 데이터의 시간 상관 관계, 전력 스펙트럼 및 진폭 분포 보존이 가능하는 것입니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) Time-Frequency Domain&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PTqIb/btsHbh8cl1F/XqJrzgu2w2HoVvbE0sRKNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PTqIb/btsHbh8cl1F/XqJrzgu2w2HoVvbE0sRKNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PTqIb/btsHbh8cl1F/XqJrzgu2w2HoVvbE0sRKNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPTqIb%2FbtsHbh8cl1F%2FXqJrzgu2w2HoVvbE0sRKNk%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;266&quot; height=&quot;386&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.1) STFT (Short Fourier Transform)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STFT는 주파수 특성이 시간에 따라 달리지는 특징을 분석하기 위한 방법입니다. 즉 시계열 데이터를 시간 단위로 짧게 분할한뒤 FFT를 수행하는 방법입니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2) Mel Spectrogram&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주파수의 단위를 특정 공식에 맞춰 멜 단위(Mel unit)으로 변경한 스펙트럼입니다. 청각이 저음의 주파수 변화에 민감하고 고음의 주파수 변화에 덜 민감한 특징을 사용하여 만들어진 기법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Advanced Approaches&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Advance Approaches의 분류&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Decomposition
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Seasonal-Trend Decomposition Algorithm for Long Time Series(STL)&lt;/li&gt;
&lt;li&gt;Robust STL&lt;/li&gt;
&lt;li&gt;Bootstrap STL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Statistical
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mixture of Gaussian Trees&lt;/li&gt;
&lt;li&gt;LGT (Local and Global Trend)&lt;/li&gt;
&lt;li&gt;Mixture of AR (MAR) models (AR : AutoRegressive)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(Deep) Learning
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Embedding Space&lt;/li&gt;
&lt;li&gt;Deep Generative Models&lt;/li&gt;
&lt;li&gt;Automated Data Augmentation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) Decomposition&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVEjHZ/btsHdxuWffy/hJX9rwsf2XJrfNaKpNjpKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVEjHZ/btsHdxuWffy/hJX9rwsf2XJrfNaKpNjpKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVEjHZ/btsHdxuWffy/hJX9rwsf2XJrfNaKpNjpKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVEjHZ%2FbtsHdxuWffy%2FhJX9rwsf2XJrfNaKpNjpKk%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;600&quot; height=&quot;273&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decomposition 기법은 시계열 데이터를 Trend, Season, Remainder로 분해하는 STL 기법을 활용한 증강 기법입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Seasonal-Trend Decomposition Algorithm for Long Time Series(STL)&lt;/li&gt;
&lt;li&gt;Robust STL
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;STL을 통해 Trend, Season, Remainder를 분해한 다음 가중치를 조절하여 데이터를 생성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bootstrap STL
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;STL을 거치면서 생긴 Remainder에 BootStrap을 적용하여 데이터를 증강하는 기법으로 Bootstrapping을 적용하여 증강 데이터를 생성한 다음 Trend와 Season을 다시 추가하여 새로운 시계열 데이터를 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) Statistical Generative Model&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Statistical Generative model은 시계열 데이터의 conditional distribution을 반영한 데이터 증강 기법으로 t시점에서의 증강 기법을 통해 생성된 데이터는 이전 포인트의 영향을 받는다고 가정하는 것으로 시작합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mixture of Gaussian Trees
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mixture of Gaussian trees를 활용하여 멀티모달 환경에서의 소수 클래스를 오버 샘플링하여 데이터 불균형 분류 문제를 해결하려고 함.&lt;/li&gt;
&lt;li&gt;이는 TimeSeries correlations between neighboring points를 고려하여 모델링하였다는 점에서 기존 오버샘플링 기법과 차이가 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LGT (Local and Global Trend)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통계 알고리즘으로써 계산된 해당 알고리즘으로 계산된 매개변수 및 예측 경로의 표본을 사용함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mixture of AR (MAR) models (AR : AutoRegressive)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MAR 모델을 활용하여 시계열 집합을 시뮬레이션하고 시계열 Feature space에서 생성된 시계열의 다양성과 적용범위를 조사함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) (Deep) Learning method&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.1) Embedding Space&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oYAlH/btsHdePFun3/1H70FW3idk6UJG7dpawxsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oYAlH/btsHdePFun3/1H70FW3idk6UJG7dpawxsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oYAlH/btsHdePFun3/1H70FW3idk6UJG7dpawxsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoYAlH%2FbtsHdePFun3%2F1H70FW3idk6UJG7dpawxsk%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;879&quot; height=&quot;246&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding Space기법은 데이터 증강을 학습된 Embedding Space로 부터 수행할 수 있다는 연구입니다. Raw input에 대한 데이터 증강보다 embedded input에 대한 데이터 증강이 효과적임을 주장하는 방법입니다.&amp;nbsp;Sequence AutoEncoder를 통해 Encoder를 학습하고, Encoder의 입력에 조금 변형된 데이터를 넣고 데이터 증강을 수행합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4.2) Deep Generative Models&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generative Adversarial Network(GAN)과 RNN을 결합한 모델인 RGAN과 RCGAN을 활용하여 데이터를 증강하는 기법입니다. 이미지 생성에 주로 사용되는 Deep Generative Models(DGM)을 시계열 데이터 생성에 적용한 사례로써 Recurrent GAN(RGAN) 과 TimeGAN 두 알고리즘이 대표적입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mME4A/btsHduSzviX/7L9jOElK6T9nHPyAPf8pD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mME4A/btsHduSzviX/7L9jOElK6T9nHPyAPf8pD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mME4A/btsHduSzviX/7L9jOElK6T9nHPyAPf8pD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmME4A%2FbtsHduSzviX%2F7L9jOElK6T9nHPyAPf8pD0%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;880&quot; height=&quot;263&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&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;RGAN : 실제 시계열 데이터의 시퀀스와 유사한 데이터를 생성함&lt;/li&gt;
&lt;li&gt;RCGAN : 일부 조건부 입력에 따라 실제 시계열 데이터의 시퀀스와 유사한 데이터를 생성함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Conclusion&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시계열 데이터만을 위한 데이터 증강 기법의 필요성은 대두되고 있다. 높은 성능 향상을 가져온 이미지, 자연어, 스피치 등에 적합한 증강 기법은 시계열 데이터에 적용하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 연구에 Basic Approches와 Advanced Approaches를 적용해볼 필요가 있다.&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;Reference&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://dmqm.korea.ac.kr/uploads/seminar/[221216]DMQA_Openseminar_How_to_augment_your_time_series_data.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://dmqm.korea.ac.kr/uploads/seminar/[221216]DMQA_Openseminar_How_to_augment_your_time_series_data.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=iqQc6FJde88&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=iqQc6FJde88&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8903012&amp;amp;casa_token=f7CImV2UZsEAAAAA:4E68XWyoNtc0hbZKbRO7IYEyB-oGp3gsHjcAmzTYIruRvRHfhGzsfBc-AUfLnqphlx1zMOY2-A&amp;amp;tag=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8903012&amp;amp;casa_token=f7CImV2UZsEAAAAA:4E68XWyoNtc0hbZKbRO7IYEyB-oGp3gsHjcAmzTYIruRvRHfhGzsfBc-AUfLnqphlx1zMOY2-A&amp;amp;tag=1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://towardsdatascience.com/time-series-augmentations-16237134b29b&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://towardsdatascience.com/time-series-augmentations-16237134b29b&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://viso.ai/computer-vision/image-data-augmentation-for-computer-vision/&quot;&gt;https://viso.ai/computer-vision/image-data-augmentation-for-computer-vision/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2002.12478&quot;&gt;https://arxiv.org/abs/2002.12478&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/Paper-Review</category>
      <category>augmentation</category>
      <category>Timeseries</category>
      <category>데이터증강</category>
      <category>시계열</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/721</guid>
      <comments>https://sonseungha.tistory.com/721#entry721comment</comments>
      <pubDate>Mon, 6 May 2024 20:28:18 +0900</pubDate>
    </item>
    <item>
      <title>학습률 웜업(Learning Rate WarmUp)에 대한 이해</title>
      <link>https://sonseungha.tistory.com/720</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;소개&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 모델을 효과적으로 학습시키기 위해서는 적절한 학습률(learning rate)을 설정하는 것이 매우 중요합니다. 학습률은 모델이 가중치를 업데이트하는 속도를 조절하는 매개변수로, 너무 높거나 낮으면 학습이 제대로 이루어지지 않을 수 있습니다. 이 중에서도 학습률을 초기에 적절히 설정하는 것이 중요한데, 이를 위해 사용되는 기법 중 하나가 학습률 웜업(Learning Rate WarmUp)입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습률 웜업이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습률 웜업은 딥러닝 모델의 초기 학습 단계에서 학습률을 서서히 증가시키는 기법입니다. 이는 모델이 초기에는 불안정하고 예측이 부정확할 수 있으며, 학습률을 너무 높게 설정하면 그러한 불안정성이 더욱 심해질 수 있기 때문에 사용됩니다. 학습률 웜업을 통해 모델이 초기에 안정성을 유지하면서도 학습 속도를 향상시킬 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습률 웜업의 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습률 웜업은 일반적으로 학습의 초기 몇 epoch 동안 적용됩니다. 이 기간 동안 학습률을 서서히 증가시키고, 이후에는 고정된 학습률을 사용하여 학습을 계속 진행합니다. 구체적으로는 다음과 같은 단계로 구현될 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모델과 최적화 알고리즘 선택: 학습률 웜업을 적용할 모델과 최적화 알고리즘을 선택합니다. 대부분의 딥러닝 프레임워크에서 제공하는 최적화 알고리즘은 학습률을 조절하는 매개변수를 가지고 있습니다.&lt;/li&gt;
&lt;li&gt;초기 학습률 설정: 학습률 웜업을 위해 초기 학습률을 설정합니다. 일반적으로는 학습의 초기 단계에서 사용할 학습률보다 낮은 값을 선택합니다.&lt;/li&gt;
&lt;li&gt;학습률 스케줄링: 초기 몇 epoch 동안 학습률을 서서히 증가시키는 스케줄을 설정합니다. 예를 들어, 선형적으로 학습률을 증가시키거나 지수적으로 증가시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;학습률 업데이트: 각 epoch 또는 일정한 주기마다 학습률을 업데이트합니다. 이 때, 설정한 학습률 스케줄에 따라 증가된 학습률을 사용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습률 웜업의 구현 - PyTorch + transformer module&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시는 PyTorch와 Transformer 모듈의 &lt;code&gt;get_cosine_schedule_with_warmup&lt;/code&gt; 함수를 이용하는 방법입니다. &lt;code&gt;get_cosine_schedule_with_warmup&lt;/code&gt;의 원형은 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd5nnZ/btsHbjdNijT/eBPlVlhQb5bLPcVBtiP9wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd5nnZ/btsHbjdNijT/eBPlVlhQb5bLPcVBtiP9wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd5nnZ/btsHbjdNijT/eBPlVlhQb5bLPcVBtiP9wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdd5nnZ%2FbtsHbjdNijT%2FeBPlVlhQb5bLPcVBtiP9wK%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;928&quot; height=&quot;708&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시와 같이 지정한 Learning Rate까지 특정 Epoch만큼 빠르게 도달한 후 다음 Epoch마다 감소하는 Cosine 그래프 형태를 띄면서 learning rate를 변화시킵니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import torch.nn as nn
from transformers import get_cosine_schedule_with_warmup

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=0.00006, weight_decay = 0.0001)

epochs = 39

scheduler = get_cosine_schedule_with_warmup(
                optimizer,
                num_warmup_steps=len(loader_train) * 3,
                num_training_steps=len(loader_train) * epochs
            )

from sklearn.metrics import roc_auc_score
from tqdm.notebook import tqdm

for epoch in range(epochs):
    model.train()
    epoch_train_loss = 0

    for images, labels in tqdm(loader_train):
        # ... Train model
        # Step schduler for each epoch.
        scheduler.step()

    # ... Validate model
    with torch.no_grad():
        ...&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습률 웜업의 구현 - Keras&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TensorFlow의 Keras를 사용하여 cosine 학습률 웜업을 구현하는 방법은 사용자 정의 콜백(Callback)을 통해 할 수 있습니다. 아래는 cosine 학습률 웜업을 구현한 콜백 클래스의 예시 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import tensorflow as tf
from tensorflow.keras.callbacks import Callback
from tensorflow.keras import backend as K

class CosineAnnealingWarmUpLR(Callback):
    def __init__(self, initial_lr, warmup_epochs, max_epochs, steps_per_epoch, min_lr=0):
        super(CosineAnnealingWarmUpLR, self).__init__()
        self.initial_lr = initial_lr
        self.warmup_epochs = warmup_epochs
        self.max_epochs = max_epochs
        self.steps_per_epoch = steps_per_epoch
        self.min_lr = min_lr
        self.history = {}

    def on_epoch_begin(self, epoch, logs=None):
        if epoch &amp;lt; self.warmup_epochs:
            lr = (self.initial_lr - self.min_lr) * (epoch / self.warmup_epochs) + self.min_lr
        else:
            lr = self.min_lr + 0.5 * (self.initial_lr - self.min_lr) * (
                        1 + np.cos(((epoch - self.warmup_epochs) / (self.max_epochs - self.warmup_epochs)) * np.pi))

        K.set_value(self.model.optimizer.lr, lr)
        self.history.setdefault('lr', []).append(K.get_value(self.model.optimizer.lr))

    def on_epoch_end(self, epoch, logs=None):
        logs = logs or {}
        logs['lr'] = K.get_value(self.model.optimizer.lr)
        self.history.setdefault('lr', []).append(logs['lr'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 &lt;code&gt;CosineAnnealingWarmUpLR&lt;/code&gt; 클래스는 초기 학습률, 웜업 에폭 수, 최대 에폭 수, 에폭 당 스텝 수 및 최소 학습률을 인자로 받습니다. 각 에폭의 시작 시에 학습률을 계산하고 설정하며, 이를 통해 cosine 학습률 스케줄링을 구현하고 웜업을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 콜백 클래스를 모델 훈련 시에 사용하여 cosine 학습률 웜업을 적용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;# 모델 컴파일
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# 콜백 초기화
warmup_epochs = 5
max_epochs = 20
steps_per_epoch = len(train_data) // batch_size  # train_data는 데이터셋 객체입니다.

# 콜백 생성
cosine_warmup_lr = CosineAnnealingWarmUpLR(initial_lr=0.001, warmup_epochs=warmup_epochs, max_epochs=max_epochs, steps_per_epoch=steps_per_epoch)

# 모델 훈련
history = model.fit(train_data, epochs=max_epochs, callbacks=[cosine_warmup_lr])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 모델 훈련 시에 &lt;code&gt;CosineAnnealingWarmUpLR&lt;/code&gt; 콜백을 추가하여 cosine 학습률 웜업을 적용할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;학습률 웜업의 장점&lt;/b&gt;&lt;/h2&gt;
&lt;ul 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;li&gt;초기에는 불안정한 예측으로 인한 손실을 최소화하고, 안정적인 학습을 돕습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝에서의 학습률 웜업은 모델의 초기 학습 과정을 안정화시키고 더 나은 성능을 얻기 위한 중요한 기법 중 하나입니다. 적절한 학습률 웜업을 통해 모델이 초기에 안정적으로 학습되도록 보장할 수 있으며, 이는 전체 학습 과정의 성능 향상에 큰 영향을 미칠 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Referenece&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/docs/transformers/main_classes/optimizer_schedules&quot;&gt;https://huggingface.co/docs/transformers/main_classes/optimizer_schedules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/Tips</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/720</guid>
      <comments>https://sonseungha.tistory.com/720#entry720comment</comments>
      <pubDate>Mon, 6 May 2024 16:47:33 +0900</pubDate>
    </item>
    <item>
      <title>[REVIEW] 사랑은 내 시간을 기꺼이 건네주는 것이다, 이기주</title>
      <link>https://sonseungha.tistory.com/719</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UctJc/btsHcnZ9p6E/LSSSI2skVTxrxOKljEUkGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UctJc/btsHcnZ9p6E/LSSSI2skVTxrxOKljEUkGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UctJc/btsHcnZ9p6E/LSSSI2skVTxrxOKljEUkGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUctJc%2FbtsHcnZ9p6E%2FLSSSI2skVTxrxOKljEUkGk%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;400&quot; height=&quot;642&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해외로 여행을 떠나기 전의 관문인 인천공항에 도착하면 항상 공항서점에 들른다. 비행기에서 읽을 책을 가방에 두둑이 챙겨왔음에도 서점을 그냥 지나치지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;점원분들이 신경써서 나열한 책들을 천천히 살펴보고 있으면 요즘 트렌드 파악과 공통적인 관심사가 무엇인지 알 수 있어서 좋다. 20살때 부터 서점을 찾아가 무턱대고 앉아 책을 읽던 시기부터 느껴온 것은 변함없이 사랑받는 책은 사랑과 자기발전에 관한 책들일 것이다. 물론, 나도 그 분야의 책들을 좋아한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이번 로마로의 여행길에 오르기 전 내 눈에 띄인건 이기주 작가님의 '사랑은 내 시간을 기꺼이 건네주는 것이다' 란 제목의 책이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&quot;사랑은 내 시간을 기꺼이 건네주는 것이다.&quot; 이 문구는 사랑에 대한 아름다운 해석을 담고 있다. 사랑은 우리가 소중히 여기는 것들 중 하나인 시간을 희생하거나 나누는 것을 의미하는 것일까. 이는 서로에 대한 관심과 배려를 보여주는 것으로, 때로는 우리의 소중한 시간을 투자하여 상대방에게 더 많은 사랑과 관심을 주고 받는 것으로도 생각할 수 있다.&lt;br /&gt;&lt;br /&gt;사랑은 양측 간의 상호작용과 희생으로 이루어지며, 서로에 대한 이해와 배려가 필요하다. 그것은 우리의 시간을 투자함으로써 상대방에게 우리의 사랑을 보여준다. 우리가 누군가를 사랑할 때, 우리는 그들을 위해 시간을 내주고, 시간을 공유하게 된다.&lt;br /&gt;&lt;br /&gt;이러한 관점에서, 사랑은 무한한 자원이 아닌, 유한한 자원 중의 하나인 시간을 기꺼이 투자하여 보다 의미 있는 관계를 형성하고 유지하는 것이며 이는 서로를 이해하고 받아들이며, 함께 성장하고 발전하는 과정에 있어 중요한 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이기주 작가님은 담백하게 사랑에 대해 써내려 갔다. 너무 달지도 너무 맵지도 너무 쓰지도 않다. 사랑이란 그런것일 수도 있을 것 같다. 누군가는 밍밍하다고 할 지 모른다. 하지만 이상하게 한 번, 두 번, 세 번.. 똑같은 글귀들을 맛보고 또 맛보게 되었다. 이기주 작가님의 글에 매료된 것 같다. 간혹 자극적인, 가슴을 울리고 찌릿하게 만드는 것이 아닌 밤하늘에 은은하게 뜬 달빛같은 글들이 좋다.&lt;/p&gt;</description>
      <category>Book</category>
      <category>사랑은 내 시간을 기꺼이 건네주는것이다.</category>
      <category>이기주</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/719</guid>
      <comments>https://sonseungha.tistory.com/719#entry719comment</comments>
      <pubDate>Sat, 4 May 2024 20:01:12 +0900</pubDate>
    </item>
    <item>
      <title>[Tensorflow/keras] Tensorflow용 DataLoader 만들기</title>
      <link>https://sonseungha.tistory.com/718</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝 모델을 훈련시키기 위해서는 종종 대규모 데이터셋이 필요합니다. 그러나 모든 데이터를 메모리에 로드하고 유지하는 것은 실용적이지 않을 수 있습니다. 이런 경우에는 데이터를 실시간으로 생성하여 모델에 제공할 수 있는 데이터 생성기를 사용하는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch의 DataLoader는 데이터셋을 미니 배치로 나누어 모델에 공급하는 역할을 합니다. 이는 데이터를 반복하고 전처리하는 작업을 추상화하여 사용자가 모델 학습에 집중할 수 있도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keras에서 데이터 생성기를 사용하는 방법은 메모리에 맞지 않는 대규모 데이터셋을 효율적으로 처리하는 강력한 방법입니다. Keras는 사용자 정의 데이터 생성기를 만들기 위한 기반 클래스로 &lt;code&gt;Sequence&lt;/code&gt; 클래스를 제공합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단계 1: 사용자 정의 데이터 생성기 클래스 만들기&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;from keras.utils import Sequence

class CustomDataGenerator(Sequence):
    def __init__(self, list_IDs, labels, batch_size=32, shuffle=True):
        self.list_IDs = list_IDs
        self.labels = labels
        self.batch_size = batch_size
        self.shuffle = shuffle
        self.on_epoch_end()

    def __len__(self):
        return int(np.ceil(len(self.list_IDs) / self.batch_size))

    def __getitem__(self, index):
        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]
        list_IDs_temp = [self.list_IDs[k] for k in indexes]
        X, y = self.__data_generation(list_IDs_temp)
        return X, y

    def on_epoch_end(self):
        self.indexes = np.arange(len(self.list_IDs))
        if self.shuffle == True:
            np.random.shuffle(self.indexes)

    def __data_generation(self, list_IDs_temp):
        # 데이터 로드 및 전처리를 여기에 구현합니다.
        # 이 함수는 배치 데이터(X)와 해당 레이블(y)을 반환해야 합니다.
        pass&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단계 2: 데이터 로드 및 전처리 구현&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 정의 데이터 생성기 클래스의 &lt;code&gt;__data_generation&lt;/code&gt; 메서드에서 각 배치에 대한 데이터 로드 및 전처리 로직을 구현하세요. 이는 이미지 파일 읽기, 변환 적용 또는 필요한 기타 전처리 단계를 포함할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단계 3: 사용자 정의 데이터 생성기의 인스턴스 생성&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;# 예시 사용법:
train_generator = CustomDataGenerator(train_IDs, train_labels)
validation_generator = CustomDataGenerator(validation_IDs, validation_labels)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단계 4: Keras 모델과 데이터 생성기 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 &lt;code&gt;fit_generator&lt;/code&gt; 함수를 사용하여 데이터 생성기와 함께 Keras 모델을 학습할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;model.fit_generator(generator=train_generator,
                    validation_data=validation_generator,
                    epochs=epochs)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 완료되었습니다! 당신은 Keras와 함께 사용자 정의 데이터 생성기를 성공적으로 구현하고 사용했습니다. 이 방법을 사용하면 모델 학습 중에 대용량 데이터셋을 효율적으로 처리할 수 있습니다. 특정 데이터셋과 작업에 맞는 데이터 로딩 및 전처리 로직을 &lt;code&gt;CustomDataGenerator&lt;/code&gt; 클래스의 &lt;code&gt;__data_generation&lt;/code&gt; 메서드에 구현해야 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly&quot;&gt;keras-how-to-generate-data-on-the-fly&lt;/a&gt;&lt;/p&gt;</description>
      <category>AI/Framework</category>
      <category>DataLoader</category>
      <category>keras</category>
      <category>tensorflow</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/718</guid>
      <comments>https://sonseungha.tistory.com/718#entry718comment</comments>
      <pubDate>Sun, 28 Apr 2024 18:31:19 +0900</pubDate>
    </item>
    <item>
      <title>[PyTorch] DataLoader 멀티프로세싱하기</title>
      <link>https://sonseungha.tistory.com/717</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch의 DataLoader는 데이터셋을 미니 배치로 나누어 모델에 공급하는 역할을 합니다. 이는 데이터를 반복하고 전처리하는 작업을 추상화하여 사용자가 모델 학습에 집중할 수 있도록 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DataLoader의 주요 기능&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;미니 배치 처리&lt;/b&gt;: DataLoader는 데이터셋을 지정된 배치 크기로 나누어 모델에 제공합니다. 이는 GPU와 같은 가속기를 통해 병렬 처리를 가능하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 셔플링&lt;/b&gt;: 학습 데이터의 순서를 무작위로 섞음으로써 모델의 일반화 성능을 향상시킵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;병렬 처리&lt;/b&gt;: DataLoader는 여러 작업자(worker)를 사용하여 데이터를 병렬로 로드할 수 있습니다. 이를 통해 데이터 로딩 과정을 가속화할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 변환(Transform)&lt;/b&gt;: DataLoader는 데이터를 로드하기 전에 사용자가 정의한 변환 함수를 적용할 수 있습니다. 예를 들어, 이미지 데이터의 경우 리사이징, 정규화 등의 변환을 적용할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DataLoader 사용 예시&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;import torch
from torch.utils.data import DataLoader, Dataset

# 사용자 정의 데이터셋 클래스 정의
class CustomDataset(Dataset):
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, index):
        return self.data[index]

# 가상의 데이터 생성
data = [i for i in range(100)]

# 사용자 정의 데이터셋 인스턴스 생성
dataset = CustomDataset(data)

# DataLoader 설정
batch_size = 10
shuffle = True

# DataLoader 인스턴스 생성
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=shuffle)

# 데이터 로드 및 모델 학습
for batch in dataloader:
    # 배치 데이터를 모델에 전달하여 학습 수행
    pass&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DataLoader에서의 멀티 프로세싱 활성화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch의 DataLoader는 데이터를 효율적으로 로드하여 모델 학습을 돕는 강력한 도구입니다. 특히, 멀티 프로세싱을 활용하면 데이터 로딩 과정을 병렬화하여 학습 시간을 단축할 수 있습니다. 이번 글에서는 PyTorch의 DataLoader를 멀티 프로세싱과 함께 사용하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch의 DataLoader에서 멀티 프로세싱을 활성화하려면 &lt;code&gt;num_workers&lt;/code&gt; 매개변수를 사용합니다. 이 매개변수는 데이터 로딩을 위해 사용할 작업자(worker)의 수를 지정합니다. 기본값은 0으로, 이는 멀티 프로세싱이 비활성화되어 있음을 의미합니다.&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;from torch.utils.data import DataLoader

# DataLoader 설정
num_workers = 4  # 사용할 작업자 수
dataloader = DataLoader(dataset, batch_size=batch_size, num_workers=num_workers)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;num_workers&lt;/code&gt;를 적절히 선택하는 것이 중요합니다. 너무 낮은 값은 데이터 로딩을 병렬화하는 효과를 줄일 수 있지만, 너무 높은 값은 시스템 리소스를 과도하게 사용할 수 있습니다. 적절한 값을 선택하기 위해 시스템의 CPU 코어 수와 메모리 사용량을 고려해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataLoader를 멀티프로세싱 환경에서 재현 가능하게 하려면 데이터 로더 생성 시에 별도의 시드값을 고정해줘야 합니다. 먼저 시드값 고정용 함수를 정의하고 제너레이터 시드값을 고정합니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;def seed_worker(worker_id):
    worker_seed = torch.initial_seed() % 2**32
    numpy.random.seed(worker_seed)
    random.seed(worker_seed)

g = torch.Generator()
g.manual_seed(0)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=seed_worker,
    generator=g,
)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 프로세싱의 장단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;속도 향상&lt;/b&gt;: 멀티 프로세싱을 사용하면 데이터 로딩 과정을 병렬화하여 학습 시간을 단축할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자원 효율성&lt;/b&gt;: 멀티 프로세싱은 시스템의 CPU 및 메모리를 효율적으로 사용하여 대규모 데이터셋을 처리할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;메모리 사용량 증가&lt;/b&gt;: 멀티 프로세싱은 각 작업자(worker)에게 별도의 메모리를 할당하므로, 작업자 수를 늘리면 메모리 사용량이 증가할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리 복잡성&lt;/b&gt;: 멀티 프로세싱을 사용하면 프로세스 간 통신 및 동기화에 대한 추가적인 관리가 필요할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;멀티 프로세싱 사용 시 주의 사항&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;메모리 사용량 모니터링&lt;/b&gt;: 멀티 프로세싱을 사용할 때는 시스템의 메모리 사용량을 모니터링하여 과부하를 방지해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작업자 수 조정&lt;/b&gt;: 적절한 작업자 수를 선택하여 메모리 사용량과 속도를 균형있게 유지해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyTorch의 DataLoader를 멀티 프로세싱과 함께 사용하면 데이터 로딩 과정을 효율적으로 최적화할 수 있습니다. 적절한 작업자 수를 선택하고 메모리 사용량을 모니터링하여 학습 속도를 향상시키는 데 도움이 될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성하면 도움이 되었으면 좋겠어요! 만약 추가로 무엇을 포함하고 싶은 부분이 있다면 알려주세요.&lt;/p&gt;</description>
      <category>AI/Framework</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/717</guid>
      <comments>https://sonseungha.tistory.com/717#entry717comment</comments>
      <pubDate>Sun, 28 Apr 2024 18:27:25 +0900</pubDate>
    </item>
    <item>
      <title>[Numpy] Serise clip() 함수 - 값 범위 제한하기</title>
      <link>https://sonseungha.tistory.com/716</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;NumPy는 파이썬에서 과학 및 수학적 계산을 위한 핵심 라이브러리 중 하나입니다. NumPy의 다양한 함수와 메서드는 데이터 조작 및 분석을 쉽게 할 수 있도록 도와줍니다. 여기에는 데이터의 값을 제한하고 특정 범위 내에 값을 유지하는 데 유용한 &lt;code&gt;clip()&lt;/code&gt; 함수가 있습니다. 이번 글에서는 NumPy의 &lt;code&gt;clip()&lt;/code&gt; 함수를 소개하고 활용하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;code&gt;numpy.clip()&lt;/code&gt; 함수란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;numpy.clip()&lt;/code&gt; 함수는 주어진 배열의 값을 지정된 최소값과 최대값 사이로 제한합니다. 이 함수를 사용하면 데이터의 범위를 제한하고 이상치를 처리하는 데 유용합니다. &lt;code&gt;numpy.clip()&lt;/code&gt;의 구문은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;autohotkey&quot;&gt;&lt;code&gt;numpy.clip(a, a_min, a_max, out=None)&lt;/code&gt;&lt;/pre&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;&lt;code&gt;a&lt;/code&gt;: 값을 제한할 배열입니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a_min&lt;/code&gt;: 값의 하한입니다. 이 값보다 작은 모든 요소는 &lt;code&gt;a_min&lt;/code&gt;으로 대체됩니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a_max&lt;/code&gt;: 값의 상한입니다. 이 값보다 큰 모든 요소는 &lt;code&gt;a_max&lt;/code&gt;로 대체됩니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;out&lt;/code&gt;: 선택적으로 출력 배열을 지정합니다. 이를 사용하여 결과를 기존 배열에 저장할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import numpy as np

# 1차원 배열 생성
arr = np.array([1, 2, 3, 4, 5])

# 값의 하한과 상한 설정
min_val = 2
max_val = 4

# clip() 함수 사용
clipped_arr = np.clip(arr, min_val, max_val)

print(clipped_arr)  # 출력: [2 2 3 4 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 예시에서는 배열 &lt;code&gt;arr&lt;/code&gt;의 값들을 2와 4 사이의 값으로 제한했습니다. 따라서 결과 배열 &lt;code&gt;clipped_arr&lt;/code&gt;은 2보다 작은 값은 2로, 4보다 큰 값은 4로 대체되었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;활용 예시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;code&gt;numpy.clip()&lt;/code&gt; 함수는 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;데이터 클리닝: 이상치를 제거하거나 유효한 값 범위를 유지할 수 있습니다.&lt;/li&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;이상치 제거 예시코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1713510447549&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df_iqr = df[['col1', 'col2', 'col3']].apply(
    lambda x: x.quantile([0.25, 0.75]).rename({0.25:'Q1', 0.75: 'Q3'})
).T.assign(
    IQR = lambda x: x['Q3'] - x['Q1']
).assign(
    LB = lambda x: x['Q1'] - 1.5 * x['IQR'],
    UB = lambda x: x['Q3'] + 1.5 * x['IQR']
)

df['col1', 'col2', 'col3'].apply(
    lambda x: x.clip(df_iqr.loc[x.name, 'LB'], df_iqr.loc[x.name, 'UB']) 
)&lt;/code&gt;&lt;/pre&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;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;NumPy의 &lt;code&gt;numpy.clip()&lt;/code&gt; 함수는 배열의 값을 지정된 범위 내로 제한하는 데 사용됩니다. 이를 통해 데이터의 범위를 조절하고 이상치를 처리할 수 있습니다. 이 함수는 데이터 전처리 및 분석에서 유용하게 활용될 수 있으며 다양한 응용 분야에서 활용될 수 있습니다.&lt;/p&gt;</description>
      <category>AI/Tips</category>
      <category>clip</category>
      <category>NumPy</category>
      <category>pandas</category>
      <category>series</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/716</guid>
      <comments>https://sonseungha.tistory.com/716#entry716comment</comments>
      <pubDate>Fri, 19 Apr 2024 16:08:09 +0900</pubDate>
    </item>
    <item>
      <title>Google-Colab 에서 LightGBM GPU 사용하기</title>
      <link>https://sonseungha.tistory.com/715</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;Kaggle Notebook에선 lightGBM gpu 버전을 쉽게 사용할 수 있다. 하지만 Google CoLab 에선 별도로 설치가 필요하다. 아래 코드를 CoLab 노트북 셀에서 실행하여 설치한 후 사용해본다.&lt;/p&gt;
&lt;pre class=&quot;erlang-repl&quot;&gt;&lt;code&gt;!git clone --recursive https://github.com/Microsoft/LightGBM
%cd LightGBM
!mkdir build
%cd build
!cmake ../../LightGBM -DUSE_GPU=1
!make -j4
%cd ../python-package
!python3 setup.py install --gpu&lt;/code&gt;&lt;/pre&gt;</description>
      <category>AI/Tips</category>
      <category>GPU</category>
      <category>lightGBM</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/715</guid>
      <comments>https://sonseungha.tistory.com/715#entry715comment</comments>
      <pubDate>Sun, 14 Apr 2024 19:03:11 +0900</pubDate>
    </item>
    <item>
      <title>Hyper-Parameter Optimization #0</title>
      <link>https://sonseungha.tistory.com/714</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Background&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;데이터 사이언스 업무는 이전의 업무 영역에서 벗어나 점차 엔지니어링 영역까지 포함하고 있다. 점차 데이터 사이언스는 데이터를 다루고 분석하는 것을 넘어 모델을 학습시키고 평가 배포, 모니터링의 영역까지 확장되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실제로 데이터 과학자들에게 엔지니어링까지 함께 하기를 원하는 회사들이 늘어나고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEP0Qp/btsGwDbU9It/OZsWXeu7F0khKk8IjwavQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEP0Qp/btsGwDbU9It/OZsWXeu7F0khKk8IjwavQk/img.png&quot; data-alt=&quot;https://miro.medium.com/v2/resize:fit:705/1*WKJKqDs7GXJ-KAy6l2cUXg.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEP0Qp/btsGwDbU9It/OZsWXeu7F0khKk8IjwavQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEP0Qp%2FbtsGwDbU9It%2FOZsWXeu7F0khKk8IjwavQk%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;641&quot; height=&quot;211&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;211&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://miro.medium.com/v2/resize:fit:705/1*WKJKqDs7GXJ-KAy6l2cUXg.png&lt;/figcaption&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;size18&quot;&gt;엔지니어링 측면의 역량까지 요구되는 이유는 두 가지 측면에서 분석할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;AI 분야의 낮아진 진입장벽과 다양한 도구&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모델 복잡도와 데이터의 증가 -&amp;gt; 다양한 기술의 발전&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KJdbQ/btsGuY1423Z/S97cGQ6xUXEqGOsh1GEkDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KJdbQ/btsGuY1423Z/S97cGQ6xUXEqGOsh1GEkDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KJdbQ/btsGuY1423Z/S97cGQ6xUXEqGOsh1GEkDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKJdbQ%2FbtsGuY1423Z%2FS97cGQ6xUXEqGOsh1GEkDK%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;1039&quot; height=&quot;445&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;`먼저 AI 분야의 낮아진 진입장벽과 다양한 도구`&lt;/b&gt;로 인해 다양한 개발자들이 쉽게 AI 분야에 진입이 가능하고 Keras, PyTorch 등 다양한 프레임워크의 발전과 오픈소스 지원에 따라 좀 더 쉽고 빠르게 AI에 접근할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;`모델 복잡도와 데이터의 증가`&amp;nbsp;&lt;/b&gt;는 다양한 도구와 별개로 AI 엔지니어들을 힘들게 하는 원인 중 하나가 되었다. 하지만 반도체, GPU 등의 하드웨어적인 측면에서도 빠르게 발전하며 이러한 문제를 해결해 나아가고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이에 대한 내용은 고객 또한 인지하고 있으며 그에 따른 개발 납기 주기가 빨라지고 있다. 이러한 고객들의 요청사항에 맞춰 AI 엔지니어들은 반복적인 작업들 중 일부를 최적화하기 위한 방안을 찾게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리하여 시작된 연구분야가 &lt;b&gt;AutoML&lt;/b&gt; 이다. &lt;b&gt;하이퍼파라미터 최적화는 AutoML 중 하나의 연구 분야이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buN78C/btsGwi0ahmg/lG18VyrnYR1En5TSP1KZa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buN78C/btsGwi0ahmg/lG18VyrnYR1En5TSP1KZa1/img.png&quot; data-alt=&quot;https://adioshun.gitbooks.io/deep_learning/content/Auto-ML/Intro.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buN78C/btsGwi0ahmg/lG18VyrnYR1En5TSP1KZa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuN78C%2FbtsGwi0ahmg%2FlG18VyrnYR1En5TSP1KZa1%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;560&quot; height=&quot;258&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://adioshun.gitbooks.io/deep_learning/content/Auto-ML/Intro.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) Parameter vs Hyper-Parameter&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파라미터와 하이퍼파라미터는 머신러닝과 딥러닝 모델에서 중요한 역할을 하는 개념이다. 이 둘은 모델의 학습과 성능 조정에 관련이 있지만, 다른 목적과 역할을 가지고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0e1ZH/btsGwCxiyyx/hky0JtVgOL7yaGrrHKsQjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0e1ZH/btsGwCxiyyx/hky0JtVgOL7yaGrrHKsQjk/img.png&quot; data-alt=&quot;https://towardsdatascience.com/model-parameters-and-hyperparameters-in-machine-learning-what-is-the-difference-702d30970f6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0e1ZH/btsGwCxiyyx/hky0JtVgOL7yaGrrHKsQjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0e1ZH%2FbtsGwCxiyyx%2Fhky0JtVgOL7yaGrrHKsQjk%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;600&quot; height=&quot;388&quot; data-origin-width=&quot;1538&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://towardsdatascience.com/model-parameters-and-hyperparameters-in-machine-learning-what-is-the-difference-702d30970f6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;파라미터 (Parameters):&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파라미터는 모델이 직접 학습하는 변수이다.&lt;/li&gt;
&lt;li&gt;모델이 데이터를 학습하면서 조정되는 가중치(weight)나 편향(bias) 등의 값이다.&lt;/li&gt;
&lt;li&gt;예를 들어, 신경망에서는 각 층의 가중치(weight)와 편향(bias)이 파라미터이다.&lt;/li&gt;
&lt;li&gt;파라미터는 학습 데이터를 통해 모델이 최적화되는 과정에서 업데이트된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;하이퍼파라미터 (Hyperparameters):&lt;/b&gt;&lt;/p&gt;
&lt;ul 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;li&gt;하이퍼파라미터는 모델을 학습하기 전에 사전에 정의되어야 한다.&lt;/li&gt;
&lt;li&gt;모델의 성능과 학습 속도에 영향을 미치며, 최적의 하이퍼파라미터를 선택하는 것이 모델의 성능을 극대화하는 데 중요하다.&lt;/li&gt;
&lt;li&gt;일반적으로 하이퍼파라미터 튜닝은 그리드 탐색, 랜덤 탐색, 베이지안 최적화 등의 방법을 사용하여 수행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;간단히 말해, 파라미터는 모델이 직접 학습하는 변수이고, 하이퍼파라미터는 모델의 학습 과정을 제어하기 위한 외부적으로 조정해야 하는 변수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) 모델 학습 (Model Training) vs 하이퍼파라미터 최적화 (Hyper-Parameter Optimization)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANaQ2/btsGwBLUhnS/d06mnvQ6tg3KAOK9diR87k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANaQ2/btsGwBLUhnS/d06mnvQ6tg3KAOK9diR87k/img.png&quot; data-alt=&quot;https://www.oreilly.com/library/view/evaluating-machine-learning/9781492048756/ch04.html#idp1753984&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANaQ2/btsGwBLUhnS/d06mnvQ6tg3KAOK9diR87k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANaQ2%2FbtsGwBLUhnS%2Fd06mnvQ6tg3KAOK9diR87k%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;1112&quot; height=&quot;439&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.oreilly.com/library/view/evaluating-machine-learning/9781492048756/ch04.html#idp1753984&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모델 학습은 모델의 파라미터를 학습하는 과정이다. 이 때 하이퍼파라미터는 사전에 정의되어 고정된 상태이다. 하이퍼파라미터 최적화는 하이퍼 파라미터를 학습한다. 모델 학습 과정의 메타 최적화 기법 중 하나이다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 하이퍼파라미터 최적화 기법 소개&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 최적화 기법 분류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하이퍼파라미터는 크게 &lt;b&gt;`Searching Method`&lt;/b&gt; 와 &lt;b&gt;`Scheduling method`&lt;/b&gt; 두 가지 범주로 분류할 수 있다. 각 분류의 구분은 조기종료 (Pruning) 여부이다. Pruning없이 매 시도마다 끝까지 하이퍼파라미터 탐색을 할 것인지, 아니면 탐색 도중에 성능이 좋지 않은 시도는 Pruning하여 전체 탐색 속도를 증가시킬 것인지의 차이가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Searching Method
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Grid Search&lt;/li&gt;
&lt;li&gt;Random Search&lt;/li&gt;
&lt;li&gt;Bayesian Optimization (BO)&lt;/li&gt;
&lt;li&gt;Evolutionary Search&lt;/li&gt;
&lt;li&gt;기타 최적화 기법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scheduling Method
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Successive HAlving (SHA)&lt;/li&gt;
&lt;li&gt;HyperBand (HB)&lt;/li&gt;
&lt;li&gt;Bayesian Optimization - HyperBand (BOHB)&lt;/li&gt;
&lt;li&gt;Asyncronous Successive HAlving (ASHA)&lt;/li&gt;
&lt;li&gt;기타 최적화 기법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;각 하이퍼파라미터 최적화 기법을 지원하는 다양한 프레임워크들이 존재한다. 각 기능에 대해서는 추가로 살펴보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 글에서는 Searching Method, Scheduling Method 기법들에 대해 각각 정리해보려 한다.&lt;/p&gt;</description>
      <category>AI/Deep Learning</category>
      <category>hyperparameter</category>
      <category>Optimization</category>
      <category>하이퍼파라미터 최적화</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/714</guid>
      <comments>https://sonseungha.tistory.com/714#entry714comment</comments>
      <pubDate>Wed, 10 Apr 2024 19:18:58 +0900</pubDate>
    </item>
    <item>
      <title>Json Schema를 사용한 Json 유효성 검사하기</title>
      <link>https://sonseungha.tistory.com/713</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JSON Schema는 JSON 데이터의 유효성을 정의하고 검사하는 데 사용되는 강력한 도구입니다. Python에서 JSON Schema를 활용하면 데이터의 일관성과 유효성을 보장하고 데이터 규격을 명확히 정의할 수 있습니다. 이번 글에서는 Python에서 JSON Schema의 개요와 사용법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSON Schema란 무엇인가요?&lt;/h3&gt;
&lt;figure id=&quot;og_1712387283631&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;JSON Schema&quot; data-og-description=&quot;Welcome to the JSON Schema Community With over 60 million weekly downloads, JSON Schema has a large and active developer community across the world. Join the Community to learn, share ideas, ask questions, develop JSON Schema tooling and build new connecti&quot; data-og-host=&quot;json-schema.org&quot; data-og-source-url=&quot;https://json-schema.org/&quot; data-og-url=&quot;https://json-schema.org/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1GHFl/hyVJRs0tEl/BE3t6Zdzj5GeaRR8aKmRgK/img.png?width=2400&amp;amp;height=513&amp;amp;face=0_0_2400_513,https://scrap.kakaocdn.net/dn/cgq7Uq/hyVMXSDCDi/N79gTpk5ePV5RVKcFg1TK0/img.png?width=864&amp;amp;height=232&amp;amp;face=0_0_864_232,https://scrap.kakaocdn.net/dn/dgUb0g/hyVJ5rf6Gb/yt6KUDJngMKQ0QjzRwdkw0/img.png?width=453&amp;amp;height=283&amp;amp;face=0_0_453_283&quot;&gt;&lt;a href=&quot;https://json-schema.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://json-schema.org/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1GHFl/hyVJRs0tEl/BE3t6Zdzj5GeaRR8aKmRgK/img.png?width=2400&amp;amp;height=513&amp;amp;face=0_0_2400_513,https://scrap.kakaocdn.net/dn/cgq7Uq/hyVMXSDCDi/N79gTpk5ePV5RVKcFg1TK0/img.png?width=864&amp;amp;height=232&amp;amp;face=0_0_864_232,https://scrap.kakaocdn.net/dn/dgUb0g/hyVJ5rf6Gb/yt6KUDJngMKQ0QjzRwdkw0/img.png?width=453&amp;amp;height=283&amp;amp;face=0_0_453_283');&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;JSON Schema&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Welcome to the JSON Schema Community With over 60 million weekly downloads, JSON Schema has a large and active developer community across the world. Join the Community to learn, share ideas, ask questions, develop JSON Schema tooling and build new connecti&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;json-schema.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON Schema는 JSON 데이터의 구조와 유효성을 설명하는 오픈소스 입니다. 이는 JSON 데이터가 특정 형식을 따르고 필요한 속성을 가지고 있는지 확인하는 데 사용됩니다. JSON Schema를 사용하면 데이터 규격을 명확히 정의하여 데이터를 더욱 신뢰성 있게 처리할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSON Schema의 주요 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 유효성 검사: JSON Schema를 사용하면 데이터가 스키마에 정의된 요구사항을 충족하는지 확인할 수 있습니다. 이는 데이터의 무결성을 보장하고 오류를 사전에 방지할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;li&gt;구조 정의: JSON Schema를 통해 데이터의 구조를 명확하게 정의할 수 있습니다. 이는 데이터의 필수 항목, 데이터 형식, 배열 요소 등을 세부적으로 제어할 수 있게 해줍니다.&lt;/li&gt;
&lt;li&gt;문서화: JSON Schema는 데이터의 구조와 제약 조건을 표현하는 데 사용될 수 있습니다. 이를 통해 데이터의 의도를 명확히 설명하고 문서화할 수 있습니다.&lt;/li&gt;
&lt;li&gt;상호 운용성: JSON Schema는 다양한 프로그래밍 언어 및 플랫폼에서 지원되며, 이를 통해 데이터의 구조를 일관되게 정의하고 처리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JSON Schema의 구성 요소&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON Schema 문서는 다음과 같은 구성 요소로 이루어져 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;type&lt;/b&gt;: 데이터의 유형을 정의합니다. 예를 들어, &quot;string&quot;, &quot;number&quot;, &quot;boolean&quot; 등이 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;properties&lt;/b&gt;: 객체의 속성을 정의합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;required&lt;/b&gt;: 필수 속성을 지정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;additionalProperties&lt;/b&gt;: 추가 속성을 허용 또는 제한합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;dependencies&lt;/b&gt;: 속성 간의 종속성을 정의합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;enum&lt;/b&gt;: 가능한 값의 목록을 정의합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;format&lt;/b&gt;: 데이터의 형식을 추가적으로 정의합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python에서 JSON Schema 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python에서는 &lt;code&gt;jsonschema&lt;/code&gt; 라이브러리를 사용하여 JSON Schema를 적용하고 데이터를 유효성 검사할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;설치&lt;/h4&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install jsonschema&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import jsonschema
from jsonschema import validate

# JSON Schema 정의
schema = {
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
        &quot;name&quot;: {&quot;type&quot;: &quot;string&quot;},
        &quot;age&quot;: {&quot;type&quot;: &quot;integer&quot;}
    },
    &quot;required&quot;: [&quot;name&quot;, &quot;age&quot;]
}

# 유효성 검사할 데이터
data = {
    &quot;name&quot;: &quot;John&quot;,
    &quot;age&quot;: 30
}

try:
    # 데이터 유효성 검사
    validate(instance=data, schema=schema)
    print(&quot;데이터가 유효합니다.&quot;)
except jsonschema.exceptions.ValidationError as e:
    print(&quot;데이터가 유효하지 않습니다.&quot;)
    print(e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서는 &lt;code&gt;jsonschema.validate()&lt;/code&gt; 함수를 사용하여 데이터의 유효성을 검사합니다. &lt;code&gt;instance&lt;/code&gt;에는 검사할 데이터를, &lt;code&gt;schema&lt;/code&gt;에는 적용할 JSON Schema를 전달합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Python에서 JSON Schema를 활용하여 데이터의 일관성과 유효성을 강화하는 방법에 대해 알아보았습니다. JSON Schema를 사용하면 데이터 규격을 명확하게 정의하고 데이터의 신뢰성을 높일 수 있습니다. JSON 데이터를 처리하고 검증해야 하는 경우, JSON Schema를 적극적으로 활용하여 프로젝트의 안정성을 높이는 것을 고려해보세요.&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>JSON</category>
      <category>jsonschema</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/713</guid>
      <comments>https://sonseungha.tistory.com/713#entry713comment</comments>
      <pubDate>Sat, 6 Apr 2024 16:08:24 +0900</pubDate>
    </item>
    <item>
      <title>[XGBoost] XGBoost 학습 시 GPU(CUDA) 사용하기</title>
      <link>https://sonseungha.tistory.com/712</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;XGBoost 모델 학습 시 매우 느린 성능을 보인다. 특히 Hyper-Parameter Optimization과 같은 기법을 병행하여 사용한다면 힘든 시간이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;XGBoost의 대부분의 알고리즘은 CUDA 호환 GPU로 가속화될 수 있으며 이는 학습, 예측 및 평가를 포함한다. XGBoost에서 GPU를 지원한다. 지원 조건은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CUDA 11.0 이상&lt;/li&gt;
&lt;li&gt;Compute Capability 5.0 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;GPU 활성화 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;GPU 가속을 활성화하려면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;device 매개변수를 cuda로 설정한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 동일한 노드에 여러 장치가 있는 경우 장치 순서(사용할 GPU를 지정)는 cuda: 구문을 사용하여 지정한다.&lt;/li&gt;
&lt;li&gt;XGBoost는 기본적으로 0(CUDA 런타임에서 보고된 첫 번째 장치)으로 설정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;tree_method 매개변수를 'hist'로 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;현재 GPU 알고리즘은 CLI, Python, R 및 JVM 패키지에서 작동합니다. 자세한 내용은 설치 가이드를 참조하세요.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;...
params = dict()
params[&quot;device&quot;] = &quot;cuda&quot;
params[&quot;tree_method&quot;] = &quot;hist&quot;

model = xgboost.train(params, train_dataset)
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약 Scikit-Learn 인터페이스를 사용한다면 아래와 같이 사용한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;XGBRegressor(tree_method=&quot;hist&quot;, device=&quot;cuda&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;추가적으로 멀티 GPU 학습, 메모리 사용량 등의 정보는 아래 레퍼런스를 확인하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;참고자료 : &lt;a href=&quot;https://xgboost.readthedocs.io/en/stable/gpu/index.html&quot;&gt;https://xgboost.readthedocs.io/en/stable/gpu/index.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>AI/Tips</category>
      <category>GPU</category>
      <category>XGBoost</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/712</guid>
      <comments>https://sonseungha.tistory.com/712#entry712comment</comments>
      <pubDate>Sun, 31 Mar 2024 13:54:37 +0900</pubDate>
    </item>
    <item>
      <title>희소행렬을 효율적으로 저장하는 COO, CSR 형식</title>
      <link>https://sonseungha.tistory.com/711</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cucxTg/btsGfygOZ5c/1VbZ2oIBCDrVUkJydY6Dz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cucxTg/btsGfygOZ5c/1VbZ2oIBCDrVUkJydY6Dz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cucxTg/btsGfygOZ5c/1VbZ2oIBCDrVUkJydY6Dz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcucxTg%2FbtsGfygOZ5c%2F1VbZ2oIBCDrVUkJydY6Dz1%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;600&quot; height=&quot;283&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;희소행렬(Sparse Matrix)은 대부분의 원소가 0으로 채워진 행렬을 의미합니다. 이러한 행렬은 데이터의 특성에 따라 매우 큰 메모리를 차지할 수 있습니다. 따라서, 이러한 희소행렬을 저장하고 효율적으로 다루기 위해 COO(Coordinate List)와 CSR(Compressed Sparse Row) 형식이 주로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 포맷에서 &quot;희소행렬&quot;과 &quot;COO(Coordinate List)&quot;, &quot;CSR(Compressed Sparse Row)&quot; 형식은 주로 희소 행렬(행렬 내 대부분의 요소가 0인 경우)을 저장하고 효율적으로 다루기 위해 사용됩니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;희소행렬(Sparse Matrix)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인 행렬과 달리, 대부분의 원소가 0으로 구성되어 있습니다.&lt;/li&gt;
&lt;li&gt;이러한 행렬은 메모리를 효율적으로 사용하기 위해 특별한 형식으로 저장됩니다.&lt;/li&gt;
&lt;li&gt;희소 행렬은 크게 COO 형식과 CSR 형식으로 저장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;COO(Coordinate List) 형식&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;COO 형식은 희소 행렬을 (행, 열, 값)의 좌표 리스트로 표현합니다.&lt;/li&gt;
&lt;li&gt;예를 들어, (i, j, v)는 행렬의 i행 j열에 값 v가 있다는 것을 의미합니다.&lt;/li&gt;
&lt;li&gt;이 형식은 행렬의 구조를 보존하면서도 메모리 사용을 최적화할 수 있는 장점이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CSR(Compressed Sparse Row) 형식&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CSR 형식은 각 행의 시작 위치와 해당 행의 원소들을 연속된 배열로 표현합니다.&lt;/li&gt;
&lt;li&gt;희소 행렬을 압축하여 저장하므로 메모리 사용을 최적화할 수 있습니다.&lt;/li&gt;
&lt;li&gt;CSR 형식은 주로 행별로 순회할 때 효율적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 데이터 포맷에서 희소행렬을 저장하고 다룰 때 COO 형식과 CSR 형식이 사용되며, 각 형식은 행렬의 특성과 다루는 작업에 따라 선택됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 0으로 채워진 행렬을 희소 행렬(Sparse matrix)라고 했습니다. 그렇다면 반대로 대부분 값이 0이 아닌 값으로 채워진 행렬을 밀집 행렬(Dense Matrix) 하고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 전처리 과정 중 사용하는 One-Hot Encoding을 적용하면 희소 행렬을 만들게 됩니다. 만약 범주형 데이터가 매우 많다면 이런 희소행렬로 인해 데이터의 크기가 매우 커지게 되고 메모리 낭비가 심해집니다. 특히 행렬 크기가 증가함에따라 연산 시간도 오래 걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제를 개선하기 위해 행렬 형식을 변환해줘야 하는데, 대표적으로 위에서 설명한 COO와 CSR 형식입니다. 희소 행렬을 COO와 CSR 형식으로 변환하면 메모리를 적게 사용하면서 연산이 빠릅니다. COO보다는 CSR이 메모리 효율과 연산 측면에서 좀 더 나은 성능을 보이므로 COO 형식보다는 CSR 형식을 많이 사용합니다.&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;import numpy as np
from scipy.sparse import coo_matrix, csr_matrix

# COO 형식의 희소행렬 생성
data = np.array([3, 1, 2, 5])  # 값
row = np.array([0, 1, 2, 1])   # 행
col = np.array([0, 1, 2, 2])   # 열
coo_matrix_example = coo_matrix((data, (row, col)), shape=(3, 3))

print(&quot;COO 형식의 희소행렬:&quot;)
print(coo_matrix_example.toarray())
print()

# CSR 형식으로 변환
csr_matrix_example = csr_matrix(coo_matrix_example)

print(&quot;CSR 형식의 희소행렬:&quot;)
print(csr_matrix_example.toarray())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 연속형, 범주형 데이터가 혼재된 상태에서 범주형 데이터의 One-Hot Encoding 된 데이터들을 다시 붙히는 예제는 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import numpy as np
from scipy.sparse import csr_matrix, hstack

# 간단한 희소 행렬 생성
data1 = [1, 2, 3]
data2 = [4, 5, 6]
row = [0, 1, 2]
col1 = [0, 1, 2]
col2 = [0, 1, 2]

sparse_matrix1 = csr_matrix((data1, (row, col1)), shape=(3, 3))
sparse_matrix2 = csr_matrix((data2, (row, col2)), shape=(3, 3))

# 두 희소 행렬을 수평으로 쌓기
result = hstack([sparse_matrix1, sparse_matrix2])

print(&quot;Resultant Sparse Matrix:&quot;)
print(result.toarray())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/711</guid>
      <comments>https://sonseungha.tistory.com/711#entry711comment</comments>
      <pubDate>Sat, 30 Mar 2024 14:20:45 +0900</pubDate>
    </item>
    <item>
      <title>[Book] 나는 메트로폴리탄 미술관의 경비원입니다</title>
      <link>https://sonseungha.tistory.com/710</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9pYtd/btsF1TsdNPR/BDxV12WnXsBhwECQ7L3sQK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9pYtd/btsF1TsdNPR/BDxV12WnXsBhwECQ7L3sQK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9pYtd/btsF1TsdNPR/BDxV12WnXsBhwECQ7L3sQK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9pYtd%2FbtsF1TsdNPR%2FBDxV12WnXsBhwECQ7L3sQK%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;500&quot; height=&quot;779&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;개인적인 사건을 겪은 후 한 남자는 메트로폴리탄 미술관에 경비원으로 취업하게 된다. 그는 뉴욕 증권가의 잘나가던 금융권 종사자였으나 개인적인 사건 이후로 모든 것을 내려놓고 과거 어린시절의 기억이 있는 미술관으로 취업한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;처음 책을 읽을 땐 표지에 적힌 것 처럼 이 남자가 모든 것을 내려놓고 미술관으로 숨어버린 것으로 생각했다. 세계에서 가장 큰 미술관 중 하나인 메트로폴리탄 미술관이라면 미술관 밖의 자신의 상황과 과거의 사전들에게서 도망칠 수 있으리라 믿었던 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 책은 그 곳에서 그는 긴 시간속에서 미술관의 한 요소가 되어 겪었던 일들에 대해 담담히 써내려 간 에세이다. 그렇기에 특별하지 않다. 지금 서점을 가보면 자극적인 주제와 내용으로 어떻게든 내가 가장 특별하다고 아우성치는 책들이 많다. 이 책은 특별하지 않기에 그 책들 속에서 더 특별하고 많은 이들이 찾는게 아닐까 싶다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;누군가에겐 별볼일 없는 이야기고 누군가에겐 소중한 하루하루의 일상을 이야기 하는 것일수도 있다. 큰 배움, 인생의 깨달음을 얻고자 하는 사람에게 이 책은 어울리지 않는다. 이 책은 특별하지 않다. 그렇기에 특별하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그가 숨어버렸던 메트로폴리탄의 미술관 속으로 자신도 담담한 일상과 함께 숨고자 하는 이들에게는 읽어보면 좋을 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Book</category>
      <category>나는메트로폴리탄의경비원입니다.</category>
      <category>도서리뷰</category>
      <category>메트로폴리탄</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/710</guid>
      <comments>https://sonseungha.tistory.com/710#entry710comment</comments>
      <pubDate>Fri, 22 Mar 2024 17:16:22 +0900</pubDate>
    </item>
    <item>
      <title>[Book] 장하준의 경제학 레시피</title>
      <link>https://sonseungha.tistory.com/709</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sROWq/btsE3nU89IY/0txKKMBdzqdEx1A8FRO6kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sROWq/btsE3nU89IY/0txKKMBdzqdEx1A8FRO6kk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sROWq/btsE3nU89IY/0txKKMBdzqdEx1A8FRO6kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsROWq%2FbtsE3nU89IY%2F0txKKMBdzqdEx1A8FRO6kk%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;400&quot; height=&quot;585&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;장하준 교수님의 경제학 신간이 10년 만에 출간되었다. 경제학자로써 넓은 영향력을 미치는 장하준 교수님의 도서는 읽기도 전에 경제학 지식이 전무한 독자에겐 너무 어렵지는 않을까 하는 선입견을 가지는 이들도 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;하지만, 장하준 교수님은 경제학을 참으로 맛깔나게 표현하는 마법같은 능력을 가지고 계신다. '장하준의 경제학 레시피' 책은 경제학을 가볍고 즐겁게 맛뵬 수 있는 즐거운 도서이다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;18가지 재료처럼 18개의 작은 챕터로 이루어져 있다. 각 챕터는 18가지 재료에 대한 가벼운 설명 즉 에피타이저로 시작을 한다. 에피타이저 타임이 지나면 코스요리처럼 해당 재료부터 시작하여 재료와 연관된 이야기, 마지막엔 경제학을 메인요리로 짠 하고 마법처럼 이루어져 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;하나의 코스요리를 대접받는 기분이랄까? 어떻게 보면 코스요리의 각 음식의 순서가 이상하다고 느끼는 독자도 있겠지만 (물론 나도 몇가지 챕터는 구성이 이해가 쉽진 않았다.) 천천히 음미하다보면 왜 장하준 교수님이 이러한 구성으로 코스요리를 대접하는지 알 수 있을 것 같다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;경제학 레시피 이지만, 요리를 하기 위한 레시피가 아니라 요리를 대접받는 기분, 이 도서로 느껴보는 것을 추천한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Book</category>
      <category>경제학레시피</category>
      <category>장하준</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/709</guid>
      <comments>https://sonseungha.tistory.com/709#entry709comment</comments>
      <pubDate>Sun, 18 Feb 2024 23:05:47 +0900</pubDate>
    </item>
    <item>
      <title>[Book] 위로의 미술관</title>
      <link>https://sonseungha.tistory.com/708</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjuhkx/btsEnbPht0Z/h0ioC7Je7INqnYBt0MPqg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjuhkx/btsEnbPht0Z/h0ioC7Je7INqnYBt0MPqg0/img.jpg&quot; data-alt=&quot;진병관 저&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjuhkx/btsEnbPht0Z/h0ioC7Je7INqnYBt0MPqg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjuhkx%2FbtsEnbPht0Z%2Fh0ioC7Je7INqnYBt0MPqg0%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;400&quot; height=&quot;580&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;진병관 저&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;지친 하루의 끝, 오직 나만을 위해 열려 있는 위로의 미술관&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;처음은 단순한 호기심이였다. 위로의 미술관? 어떠한 의미로 책의 이름을 위로의 미술관이라고 지었는지 궁금했다. 이전에 미술작품, 미술작가, 미술관과 관련된 책들을 읽은 적이 있었다. 세상에 이름을 남긴 유명 작가들의 작품을 소개하고 작품의 세계관, 작가의 철학 등을 설명하는 도서들이였다. 미술 관련 교양 서적이라면 대부분 그러한 구성일 것이라 생각했다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 책은 작품도 분명 설명하고 있지만 작품보단 작가에 대해 좀 더 포커스를 맞춘다. 그들이 태어난 시대, 살아온 시간, 연인, 동료, 질투와 화해 그리고 그 속에 사라지지 않는 작품에 대한 열정과 자신에 대한 믿음을 말한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;이 도서의 저자는 어떠한 의미로 독자를 위로하려고 하였는지는 모른다. 그건 저자만이 알 것이다. 하지만 나는 크진 않지만 자그마한 위로와 위안을 받았다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;어떠한 어려움과 환경과 상관없이 자신의 의지를 관철하고 작품을 그려나가는 열정은 이 책에서 소개하는 모든 작가가 공통적으로 가진 특성이다. 물론 역사에 기록되지 않은 무수히 많은 작가들도 공통적인 특성을 가지고 있었을지 모른다. 아니 가지고 있었을 것이다. 이러한 특성이 성공을 보장하진 않지만 자신이 가고자 하는 길에 어떠한 어려움을 마주하더라도 뚝심있게 진행해 나아가는 것이 성공을 하기 위한 여러 요소 중 하나의 필수적인 요소일 것이라 느꼈다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;지금 아무도 알아주지 않고, 나의 발전을 위해 누군가에게 도움이 되기 위해 나는 나의 발전을 멈추지 않고 한걸음 씩 나아가고 있다. 지치고 힘들어 포기하고 싶은 시간도 많았고 지금도 그렇다. 조금 편하게 직장인으로서 월급쟁이로 살아가고픈 유혹이 많다. 그 유혹 속에서도 내 인생에서 큰 성공을 이루지 못하더라도 훗날 내가 하고 있는 이 일이 누군가에게 도움이 될 수 있다면 바랄게 없다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;의도치 않은 책에서 조금의 위로를 얻은 시간을 준 저자에게 고마움을 전하고 싶다.&lt;/p&gt;</description>
      <category>Book</category>
      <category>위로</category>
      <category>위로의미술관</category>
      <category>작가</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/708</guid>
      <comments>https://sonseungha.tistory.com/708#entry708comment</comments>
      <pubDate>Sun, 4 Feb 2024 13:23:34 +0900</pubDate>
    </item>
    <item>
      <title>[Book] GRIT</title>
      <link>https://sonseungha.tistory.com/707</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tjMNA/btsD4rYYy9o/SEwrVonY6evN3t0Oq07eB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tjMNA/btsD4rYYy9o/SEwrVonY6evN3t0Oq07eB1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tjMNA/btsD4rYYy9o/SEwrVonY6evN3t0Oq07eB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtjMNA%2FbtsD4rYYy9o%2FSEwrVonY6evN3t0Oq07eB1%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;500&quot; height=&quot;743&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;'GRIT' &lt;/b&gt;이란 도서는 2019년 2월에 첫 출판된 뒤로 계속해서 사랑받는 자기계발서 중 하나이다. 출간된지 약 5년이 지난 후에 읽어보게 되었다.&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;b&gt;'GRIT' &lt;/b&gt;이란 자기계발서적을 읽고 리뷰를 작성하는 이유는 단순하다. 어떠한 환경이던, 어떠한 조건이던, 내가 성공을 달리던 실패를 달리던간에 모두에게 공통적으로 필요하다고 생각되는 것이 'GRIT'이라 생각하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단어를 한국어로 명확하게 번역할 수 있는 단어가 있을까 싶다. 열정? 끈기? 투지? 실패해도 도전하는 정신? 이렇 단어나 문장으로 어떻게 정의할 수 있을까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 나는 이 단어들의 정의는 내리지 못하더라도 주변의 성공하거나 자신의 목표를 이루고 나아가는 사람에게 느껴지는 그 분위기와 정신력, 열정, 투지 등을 느꼈을 때 그것들이 어림잡아 'GRIT' 이라고 할 수 있지 않을까 생각된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공하려면 꼭 필요하다라는것이 아니다. GRIT을 가지고도 물론 실패할 수 있다. GRIT은 성공의 왕도가 아니다, 성공을 위한 지름길도 열쇠도 솔루션도 아니다. 그저 자기자신의 마음가짐이라고 생각한다.&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;</description>
      <category>Book</category>
      <category>grit</category>
      <category>도서</category>
      <category>리뷰</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/707</guid>
      <comments>https://sonseungha.tistory.com/707#entry707comment</comments>
      <pubDate>Sun, 28 Jan 2024 12:59:56 +0900</pubDate>
    </item>
    <item>
      <title>[Metrics] 분류 모델 평가를 위한 지표는 어떻게 선정해야 하는가?</title>
      <link>https://sonseungha.tistory.com/706</link>
      <description>&lt;p&gt;모델 평가지표를 선택할 때에는 해당 문제의 특성과 목표, 그리고 모델이 사용되는 상황을 고려해야 합니다. 다양한 모델 평가지표 중에서 어떤 것을 선택할지 결정하는 데에는 여러 요소가 영향을 미칩니다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;모델 지표 선택 시 고려사항&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;해결하려는 문제에 대한 정확한 이해가 필요&lt;ul&gt;
&lt;li&gt;분류 문제인지 회귀 문제인지를 고려해야 합니다. 분류 문제에서는 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 스코어 등이 중요한 평가지표입니다. 회귀 문제에서는 평균 제곱 오차(Mean Squared Error), 평균 절대 오차(Mean Absolute Error) 등이 일반적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터의 불균형 문제에 대한 고민&lt;ul&gt;
&lt;li&gt;클래스 간의 샘플 수가 불균형하다면 정확도만으로는 모델 성능을 올바르게 평가할 수 없습니다. 이런 경우에는 정밀도, 재현율, F1 스코어와 같은 지표를 함께 고려해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델에서 평가하고자 하는 목적이 무엇인가&lt;ul&gt;
&lt;li&gt;모델을 어떤 목적으로 사용하느냐에 따라 적절한 평가지표가 달라질 수 있습니다. 예를 들어, 이진 분류 모델에서 스팸 메일을 예측하는 경우, 재현율이 더 중요할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델이 실제 적용되었을 때 최소한 보장이 되어야 하는 조건&lt;/li&gt;
&lt;li&gt;어떤 메트릭들을 선정하고 비교하여 가장 좋은 모델을 선택할 것인가&lt;/li&gt;
&lt;li&gt;다중 지표의 활용&lt;ul&gt;
&lt;li&gt;때로는 단일 평가지표만으로 모델의 성능을 정확하게 파악하기 어려울 수 있습니다. 따라서 여러 평가지표를 종합적으로 고려하여 ganz 포괄적인 평가를 수행할 필요가 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 고려 사항을 토대로 모델 평가지표를 선택하면 더 나은 모델 평가와 의사 결정이 가능합니다.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;1. 분류 모델에 대한 평가 지표&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;Confusion Matrix&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;이진 분류 모델에 대한 결과를 한눈에 표시하는 방법으로 Confusion Matrix를 활용합니다. Confusion Matrix는 분류 모델의 예측 결과를 행렬로 나타낸 것입니다. 주로 이진 분류에서 사용되며, 2x2 행렬로 참 양성(True Positive), 참 음성(True Negative), 거짓 양성(False Positive), 거짓 음성(False Negative) 등의 예측 결과를 나타냅니다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;행렬 요소&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;True Positive (TP): 실제 양성인 경우를 정확하게 양성으로 예측한 경우&lt;/li&gt;
&lt;li&gt;True Negative (TN): 실제 음성인 경우를 정확하게 음성으로 예측한 경우&lt;/li&gt;
&lt;li&gt;False Positive (FP): 실제 음성인데 양성으로 잘못 예측한 경우 (Type I 오류)&lt;/li&gt;
&lt;li&gt;False Negative (FN): 실제 양성인데 음성으로 잘못 예측한 경우 (Type II 오류)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JrKJD/btsBh31OSbn/83ctdk6vo7Ccj34BkqMMG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JrKJD/btsBh31OSbn/83ctdk6vo7Ccj34BkqMMG1/img.png&quot; data-alt=&quot;Confusion Matrix (출처 :&amp;amp;amp;nbsp; https://en.wikipedia.org/wiki/Confusion_matrix)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JrKJD/btsBh31OSbn/83ctdk6vo7Ccj34BkqMMG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJrKJD%2FbtsBh31OSbn%2F83ctdk6vo7Ccj34BkqMMG1%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;524&quot; height=&quot;256&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Confusion Matrix (출처 :&amp;amp;nbsp; https://en.wikipedia.org/wiki/Confusion_matrix)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Accuracy (정확도)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;가장 직관적으로 전체 데이터 중 정답을 맞춘 샘플들의 비율입니다. 정확도는 가장 기본적이고 직관적인 평가 지표 중 하나입니다. 예측이 올바르게 되었는지를 측정하는 데 사용됩니다.&lt;/p&gt;
&lt;p&gt;$$ Accuracy = \frac{TP+TN}{TP+FP+FN+TN} $$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;클래스 불균형에 취약&lt;/strong&gt;: 클래스의 분포가 불균형할 때(특정 클래스의 샘플 수가 다른 클래스에 비해 월등히 많거나 적을 때) 정확도만으로 모델의 성능을 평가하기 어려울 수 있습니다. 높은 정확도를 보일 수 있지만 실제로 중요한 클래스에 대한 예측이 잘못되는 경우가 있을 수 있습니다.&lt;/p&gt;
&lt;p&gt;아래 표를 보면 첫 번째에서 소수 클래스에 대해 예측이 0%이지만, 마지막 표는 소수 클래스 예측 100%를 나타낸다. 하지만 Acuuracy는 3개의 표 모두 &lt;strong&gt;0.9로 동일한 지표를 나타낸다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qEI6p/btsBiqI28Pf/BlxqleTT1UMlO9ClBMGzf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qEI6p/btsBiqI28Pf/BlxqleTT1UMlO9ClBMGzf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qEI6p/btsBiqI28Pf/BlxqleTT1UMlO9ClBMGzf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqEI6p%2FbtsBiqI28Pf%2FBlxqleTT1UMlO9ClBMGzf1%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;600&quot; height=&quot;197&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이러한 특성으로 인해 모델 간 성능 비교 시 Accuracy 사용은 좋지 않습니다. Accuracy 만이 아닌 Type-1, Type-2 에러도 함께 확인해야 합니다.  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;데이터의 특성을 고려해야 함&lt;/strong&gt;: 정확도를 사용할 때에는 데이터의 특성을 고려해야 합니다. 예를 들어, 클래스 간 샘플 수의 차이가 클 때에는 다른 평가 지표를 함께 고려하는 것이 더 적절할 수 있습니다.  &lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Sensitivity (민감도) / &lt;strong&gt;Recall (정밀도)&lt;/strong&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;민감도(Sensitivity), 또는 재현율(Recall)은 분류 모델에서 양성 클래스(Positive Class)에 속하는 샘플 중 실제로 양성 클래스로 예측된 비율을 나타내는 지표입니다. 즉 양성의 샘플을 잘 찾는데 초점을 맞춘 지표입니다. 실제 양성 중에서 얼마나 많은 샘플을 모델이 양성으로 정확하게 예측하는지를 측정합니다. 민감도가 높을 경우, 양성 결과를 놓치는 경우를 막을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YTFxw/btsBlciCfMa/qFBJilTiqJkS5v387SP2UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YTFxw/btsBlciCfMa/qFBJilTiqJkS5v387SP2UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YTFxw/btsBlciCfMa/qFBJilTiqJkS5v387SP2UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYTFxw%2FbtsBlciCfMa%2FqFBJilTiqJkS5v387SP2UK%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;669&quot; height=&quot;346&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;$$ Sensitivity = \frac{TP}{TP + FN} $$&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Specificity (특이도)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;특이도(Specificity)는 음성 클래스(Negative Class)에 속하는 샘플 중 실제로 음성 클래스로 예측된 비율을 나타내는 지표입니다. 즉, 실제 음성 중에서 모델이 음성으로 정확하게 예측한 비율을 측정합니다.정상을 정상이라고 진단하는 비율로써 검사 비용이 꽤 비싼 경우 특이도가 중요해 집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MePkH/btsBje9lcF5/fMUTIIMk0GiXkZJkRk3TK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MePkH/btsBje9lcF5/fMUTIIMk0GiXkZJkRk3TK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MePkH/btsBje9lcF5/fMUTIIMk0GiXkZJkRk3TK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMePkH%2FbtsBje9lcF5%2FfMUTIIMk0GiXkZJkRk3TK1%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;665&quot; height=&quot;358&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;$$ Specificity = \frac{TN}{TN + FP} $$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;음성 클래스의 정확도: 음성 클래스를 실제로 음성으로 정확하게 예측하는 능력을 측정합니다. 특이도는 모델이 음성 클래스를 얼마나 잘 분류하는지를 나타냅니다.&lt;/li&gt;
&lt;li&gt;클래스 불균형에 강건: 클래스 간 샘플 수가 불균형한 경우, 특이도는 높은 성능 평가 지표입니다. 특히, 거짓 양성을 줄이는 것이 중요한 경우에 사용됩니다.&lt;/li&gt;
&lt;li&gt;거짓 양성에 민감: 거짓 양성을 최소화하고 싶을 때 특이도를 주요 지표로 사용합니다. 예를 들어, 특정 질병이 없는데 있다고 잘못 예측하는 것을 피하려고 할 때 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;특이도는 모델이 실제 음성을 얼마나 잘 예측하는지를 나타내는 중요한 평가 지표입니다. 특히, 실제 음성을 정확하게 예측하고 거짓 양성을 최소화하는 것이 중요한 상황에서 사용됩니다. 데이터의 특성과 비즈니스 목표에 따라 적절한 성능 지표를 선택하는 것이 중요합니다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Precision (정확도)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Precision은 모델이 Positive로 예측한 결과 중에서 실제로 Positive인 비율을 나타냅니다. 다시 말해, 모델이 True라고 예측한 것 중에서 실제로 True인 비율을 의미합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl2zxg/btsBXO3gbty/hb3kaJd0fMCKfOacNma890/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl2zxg/btsBXO3gbty/hb3kaJd0fMCKfOacNma890/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl2zxg/btsBXO3gbty/hb3kaJd0fMCKfOacNma890/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl2zxg%2FbtsBXO3gbty%2Fhb3kaJd0fMCKfOacNma890%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;726&quot; height=&quot;401&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이를 수식으로 나타내면 다음과 같습니다:  &lt;/p&gt;
&lt;p&gt;$$ {Precision = \frac{True Positives}{True Positives + False Positives} }$$  &lt;/p&gt;
&lt;p&gt;여기서 True Positives는 모델이 올바르게 예측한 Positive 샘플의 수이고, False Positives는 모델이 Positive로 잘못 예측한 샘플의 수입니다. Precision은 모델이 Positive로 예측한 것 중에서 얼마나 정확하게 예측했는지를 측정하여 모델의 정확성을 평가하는 데 사용됩니다.  &lt;/p&gt;
&lt;p&gt;Precision은 모델이 Positive 클래스를 얼마나 정확하게 예측하는지를 알려주므로, 모델이 잘못된 Positive 예측을 최소화하고자 할 때 중요한 지표입니다. 그러나 Precision만으로 모델을 평가하는 것은 충분하지 않을 수 있습니다. 예를 들어, 모든 Positive 샘플을 Negative로 예측하는 모델은 Precision이 높을 수 있지만 실제로 중요한 Positive 샘플을 놓치는 문제가 발생할 수 있습니다. 따라서 Recall(재현율)과 함께 고려하는 것이 중요합니다.  &lt;/p&gt;
&lt;p&gt;Precision은 Recall과 트레이드 오프 관계에 있습니다. Precision을 높이면 False Positive를 줄이지만, 이로 인해 False Negative가 증가할 수 있습니다. 따라서 프로젝트나 문제의 특성에 맞게 Precision과 Recall 사이의 균형을 찾아야 합니다. 종종 두 지표를 조합한 F1 Score와 같은 조화 평균 지표를 사용하여 모델의 성능을 종합적으로 평가하기도 합니다.  &lt;/p&gt;
&lt;p&gt;요약하자면, Precision은 모델이 Positive로 예측한 것 중에서 얼마나 정확하게 예측했는지를 나타내며, 모델의 성능을 평가하는 데 중요한 지표 중 하나입니다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;F1 Score&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt; F1 Score는 Precision과 Recall의 조화 평균으로, 모델의 정확성과 완전성을 모두 고려하여 평가합니다. 먼저, Precision과 Recall을 간단히 복습해보겠습니다. Precision은 모델이 Positive로 예측한 것 중에서 실제로 Positive인 비율을 나타내며, Recall은 실제로 Positive인 것 중에서 모델이 Positive로 예측한 비율을 나타냅니다.  &lt;/p&gt;
&lt;p&gt;F1 Score는 Precision과 Recall 사이의 균형을 평가하는 지표로, 다음과 같은 공식으로 계산됩니다:  &lt;/p&gt;
&lt;p&gt;$$ { F1 Score = 2 × \frac{Precision × Recall}{Precision + Recall} } $$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOhEBu/btsBVBQv1k9/KbXe10pE1fQZpkCpHVkuJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOhEBu/btsBVBQv1k9/KbXe10pE1fQZpkCpHVkuJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOhEBu/btsBVBQv1k9/KbXe10pE1fQZpkCpHVkuJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOhEBu%2FbtsBVBQv1k9%2FKbXe10pE1fQZpkCpHVkuJ0%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;902&quot; height=&quot;362&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;F1 Score는 Precision과 Recall이 모두 고려되기 때문에, 이 둘 사이의 균형을 나타냅니다. 모델이 얼마나 많은 True Positives를 찾고 동시에 False Positives를 줄이는지를 반영합니다.  &lt;/p&gt;
&lt;p&gt;이 메트릭은 불균형한 클래스 분포를 가진 데이터셋에서 특히 유용합니다. 예를 들어, Positive 클래스가 Negative 클래스에 비해 매우 적은 경우에는 모든 샘플을 Negative로 예측하는 모델의 Accuracy가 높더라도 실제로 중요한 Positive 샘플을 놓치는 문제가 발생할 수 있습니다. 이런 상황에서 F1 Score는 모델의 성능을 더 정확하게 평가할 수 있습니다.  &lt;/p&gt;
&lt;p&gt;F1 Score는 모델의 성능을 하나의 숫자로 요약하여 비교하기 용이하며, 특히 Precision과 Recall이 중요한 상황에서 유용합니다. 그러나 F1 Score도 모든 상황에 적합한 메트릭은 아니며, 프로젝트의 목표와 데이터의 특성을 고려하여 적합한 평가 지표를 선택하는 것이 중요합니다. 종종 Precision, Recall, 그리고 F1 Score를 함께 고려하여 모델의 성능을 종합적으로 평가하기도 합니다.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Average Strategy - Micro / Macro / Weighted&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;분류 모델에서 사용되는 메트릭 전략으로 Micro, Macro, Weighted 세 가지가 있습니다. 이들은 다중 클래스 분류에서 모델의 성능을 측정하는 데 사용됩니다. 각각은 서로 다른 방식으로 클래스별 지표들을 결합하여 전체적인 모델 성능을 나타냅니다.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Micro 평가&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Micro 평가는 모든 클래스의 예측과 실제 값에 대해 TP, FP, FN을 모두 합친 후, Precision, Recall, F1 Score 등을 계산합니다.&lt;br&gt;모든 클래스를 동등하게 다루며, 각 샘플을 같은 비중으로 다루기 때문에 데이터의 불균형이 적은 경우에 유용합니다.&lt;br&gt;Micro 평가는 모든 클래스를 하나의 대규모 클래스로 취급하여 전체적인 성능을 측정합니다.&lt;/p&gt;
&lt;p&gt;$$ { Micro Precision = \frac{TP + TN}{TP+FP+FN+TN} } $$&lt;/p&gt;
&lt;p&gt;$$ { Micro Recall = \frac{TP + TN}{TP+FP+FN+TN} } $$&lt;/p&gt;
&lt;p&gt;$$ { Micro F1 Score = \frac{Precision_{Micro} × Recall_{Micro}}{Precision_{Micro} + Recall_{Micro}} } $$&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Macro 평가&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Macro 평가는 각 클래스별 Precision, Recall, F1 Score 등을 개별적으로 계산한 후, 이들의 평균을 구합니다.&lt;br&gt;각 클래스마다 독립적으로 성능을 측정하여 평균을 내기 때문에, 클래스 간 불균형이 심한 경우에 유용합니다.&lt;br&gt;이 방법은 클래스마다 동일한 가중치를 부여하여 평균을 계산합니다.&lt;/p&gt;
&lt;p&gt;$$ { Macro Precision = \frac{Precision1 + Precision2}{2} } $$&lt;/p&gt;
&lt;p&gt;$$ { Macro Recall = \frac{Recall1 + Recall2}{2} } $$&lt;/p&gt;
&lt;p&gt;$$ { Macro F1 Score = \frac{Precision_{Macro} × Recall_{Macro}}{Precision_{Macro} + Recall_{Macro}} } $$&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Weighted 평가&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Weighted 평가는 클래스별 샘플 수에 따라 가중 평균을 계산합니다.&lt;br&gt;각 클래스의 샘플 수를 고려하여 각 클래스의 Precision, Recall, F1 Score 등을 가중 평균하여 전체적인 성능을 평가합니다.&lt;br&gt;이 방법은 클래스마다 샘플 수에 따라 중요도를 부여하므로 데이터의 불균형을 고려하여 성능을 평가하는 데 유용합니다.&lt;br&gt;이러한 평가 전략은 데이터셋의 특성과 모델 평가 시 고려해야 하는 요소에 따라 선택되어야 합니다. 데이터의 클래스 분포, 각 클래스의 중요도, 그리고 모델이나 프로젝트의 목적에 따라 적절한 평가 전략을 선택하여 모델의 성능을 정확하게 평가할 수 있습니다.&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <category>f1score</category>
      <category>metric</category>
      <category>precision</category>
      <category>recall</category>
      <category>분류모델</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/706</guid>
      <comments>https://sonseungha.tistory.com/706#entry706comment</comments>
      <pubDate>Sat, 2 Dec 2023 17:21:17 +0900</pubDate>
    </item>
    <item>
      <title>[numpy] r_, c_ 함수에 대하여</title>
      <link>https://sonseungha.tistory.com/705</link>
      <description>&lt;p&gt;&lt;code&gt;numpy&lt;/code&gt; 라이브러리에서 제공되는 &lt;code&gt;r_&lt;/code&gt;과 &lt;code&gt;c_&lt;/code&gt; 함수는 배열을 생성하고 결합하는 데 유용한 도구입니다. 이 두 함수는 배열을 만들거나 배열을 연결하는 데 사용되며, 주로 슬라이싱, 배열 결합, 또는 인덱싱 작업을 수행하는 데 활용됩니다. 각 함수의 기능과 사용법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;numpy.r_&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;numpy.r_&lt;/code&gt;은 배열을 연결하여 행 방향(axis 0)으로 확장하는 데 사용됩니다. 이 함수는 배열을 수평 방향으로 결합합니다. 여러 슬라이스 또는 배열을 사용하여 새로운 배열을 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;예를 들어, 다음은 &lt;code&gt;r_&lt;/code&gt; 함수를 사용하여 배열을 생성하는 예제입니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

# 슬라이싱을 이용한 배열 생성
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
combined_arr = np.r_[arr1, arr2]  # 배열 연결

print(combined_arr)
# 출력: [1 2 3 4 5 6]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또한 슬라이싱과 범위를 사용하여 배열을 생성할 수도 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;arr3 = np.r_[1:4, 7, 8, [11, 12]]  # 범위, 값, 리스트를 결합하여 배열 생성

print(arr3)
# 출력: [1 2 3 7 8 11 12]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;numpy.c_&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;numpy.c_&lt;/code&gt;는 배열을 열 방향(axis 1)으로 결합하여 새로운 배열을 생성하는 데 사용됩니다. 기존 배열의 열 방향으로 결합하여 새로운 2차원 배열을 생성합니다.&lt;/p&gt;
&lt;p&gt;예제를 통해 &lt;code&gt;c_&lt;/code&gt; 함수를 살펴보겠습니다:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;arr4 = np.array([[1, 2, 3],
                 [4, 5, 6]])

arr5 = np.array([[7, 8, 9],
                 [10, 11, 12]])

combined_arr_col = np.c_[arr4, arr5]  # 열 방향으로 배열 결합

print(combined_arr_col)
# 출력:
# [[ 1  2  3  7  8  9]
#  [ 4  5  6 10 11 12]]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;c_&lt;/code&gt; 함수는 배열을 열 방향으로 결합하여 2차원 배열을 만듭니다. 각 배열의 행의 수가 같아야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;numpy.r_&lt;/code&gt;과 &lt;code&gt;numpy.c_&lt;/code&gt; 함수는 다양한 방식으로 배열을 조합하고 연결할 수 있는 강력한 도구입니다. 이를 이용해 데이터 조작 및 변환 작업을 보다 효과적으로 수행할 수 있습니다.&lt;/p&gt;</description>
      <category>Language/Python</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/705</guid>
      <comments>https://sonseungha.tistory.com/705#entry705comment</comments>
      <pubDate>Sat, 2 Dec 2023 16:18:20 +0900</pubDate>
    </item>
    <item>
      <title>[결측치 확인] Missingno 이용하기</title>
      <link>https://sonseungha.tistory.com/704</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;데이터 분석 시 결측치를 확인하고 처리하는 것은 필수 요소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;missingno 모듈은 데이터셋에서 누락된 데이터를 시각적으로 파악하고 분석하는 데 도움을 주는 Python 라이브러리입니다. 주로 데이터셋의 결측치를 시각화하여 어떤 부분이 비어 있는지, 데이터의 패턴을 파악하는 데 사용됩니다.&lt;br /&gt;&lt;br /&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;기능을&amp;nbsp;제공합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;missingno&amp;nbsp;모듈의&amp;nbsp;주요&amp;nbsp;기능으로는:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Matrix&lt;/b&gt;:&amp;nbsp;missingno.matrix()&amp;nbsp;함수는&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;/p&gt;
&lt;pre id=&quot;code_1701271779253&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import missingno as msno
import pandas as pd

# 데이터프레임 생성 예시
data = {'A': [1, 2, None, 4, 5], 'B': [1, None, 3, 4, 5], 'C': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 매트릭스 시각화
msno.matrix(df)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;Bar&lt;/b&gt;:&amp;nbsp;missingno.bar()&amp;nbsp;함수는&amp;nbsp;각&amp;nbsp;열(특성)별로&amp;nbsp;결측치의&amp;nbsp;비율을&amp;nbsp;막대&amp;nbsp;그래프로&amp;nbsp;시각화합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701271791112&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 각 열의 결측치 비율을 막대 그래프로 시각화
msno.bar(df)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;bar() 호출 시 나타나는 그래프 입니다. 해당 그래프는 막대 그래프 형태로, 막대그래프의 높이가 낮을수록 결측치가 많다는 것을 의미합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rp2ob/btsBcaFxSo6/xsylSqSaDtItIpktTY6B0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rp2ob/btsBcaFxSo6/xsylSqSaDtItIpktTY6B0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rp2ob/btsBcaFxSo6/xsylSqSaDtItIpktTY6B0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRp2ob%2FbtsBcaFxSo6%2FxsylSqSaDtItIpktTY6B0k%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;1342&quot; height=&quot;624&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Heatmap&lt;/b&gt;:&amp;nbsp;missingno.heatmap()&amp;nbsp;함수는&amp;nbsp;변수&amp;nbsp;간의&amp;nbsp;결측치&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;/p&gt;
&lt;pre id=&quot;code_1701271800734&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 변수 간 결측치 상관관계 히트맵
msno.heatmap(df)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&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;구조와&amp;nbsp;패턴을&amp;nbsp;더&amp;nbsp;잘&amp;nbsp;파악할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;도와줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/704</guid>
      <comments>https://sonseungha.tistory.com/704#entry704comment</comments>
      <pubDate>Thu, 30 Nov 2023 00:31:33 +0900</pubDate>
    </item>
    <item>
      <title>이상치 탐지(Anomaly Detection) - Overview</title>
      <link>https://sonseungha.tistory.com/703</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMv0aE/btszjzImUY5/0TRt1ZSTKrzqxXdE8EmEc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMv0aE/btszjzImUY5/0TRt1ZSTKrzqxXdE8EmEc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMv0aE/btszjzImUY5/0TRt1ZSTKrzqxXdE8EmEc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMv0aE%2FbtszjzImUY5%2F0TRt1ZSTKrzqxXdE8EmEc1%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;838&quot; height=&quot;389&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;389&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;size14&quot;&gt;이상치 탐지는 데이터 분석과 기계학습 분야에서 중요한 주제 중 하나로, 데이터에서 이상한 패턴이나 값들을 식별하는 과정을 의미합니다. 이상치는 데이터 분석의 정확성과 안정성을 저해할 수 있기 때문에 그 중요성이 더욱 커집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이상치&amp;nbsp;탐지:&amp;nbsp;데이터&amp;nbsp;분석의&amp;nbsp;핵심&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 분석은 현대 비즈니스 및 연구 분야에서 핵심적인 역할을 합니다. 데이터는 다양한 분야에서 수집되며, 이를 분석함으로써 중요한 의사결정을 내릴 수 있습니다. 그러나 데이터에는 종종 이상치가 포함되어 있을 수 있으며, 이러한 이상치는 정확한 분석을 방해할 수 있습니다. 이상치는 다양한 형태로 나타날 수 있으며, 이러한 이상치를 식별하고 처리하는 것은 데이터 분석가나 기계학습 엔지니어에게 중요한 작업입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이상치란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상치란 주어진 데이터 집합 내에서 다른 값들과 현저하게 다른 값을 가지는 데이터 포인트를 가리킵니다. 데이터 집합에서 다른 데이터 포인트와 크게 다른 값을 가지는 데이터를 나타냅니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Positive Outliers: Positive 이상치는 대부분의 데이터 포인트보다 큰 값을 가지며, 종종 예외적으로 우수한 성과나 긍정적인 결과를 나타냅니다. 예를 들어, 급증한 매출 또는 우수한 고객 리뷰는 양적인 이상치의 예입니다.&lt;/li&gt;
&lt;li&gt;Negative Outliers: Negative 이상치는 대부분의 데이터 포인트보다 작은 값을 가지며, 종종 문제나 오류를 나타냅니다. 예를 들어, 부정적인 고객 리뷰, 결함이 있는 제품, 또는 잘못된 거래는 음적인 이상치의 예입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상치는 종종 오류나 잡음의 결과일 수도 있지만, 때로는 중요한 정보를 제공하기도 합니다. 예를 들어, 금융 분야에서 이상치는 사기 거래의 징후일 수 있으며, 제조업에서는 기계 고장을 나타낼 수 있습니다. 그러나 이상치는 주로 데이터 분석 과정에서 부정확한 결과를 초래할 수 있기 때문에 신중하게 다루어져야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이상치와 노이즈&lt;/b&gt;&lt;/h3&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;&lt;b&gt;이상치&amp;nbsp;탐지의&amp;nbsp;중요성&lt;/b&gt;&lt;/h3&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;살펴보겠습니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;금융&amp;nbsp;분야&lt;br /&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;은행&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;br /&gt;2.&amp;nbsp;제조업&lt;br /&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;기계&amp;nbsp;고장은&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;br /&gt;3.&amp;nbsp;의료&amp;nbsp;분야&lt;br /&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;치료에&amp;nbsp;도움을&amp;nbsp;줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이상치 탐지 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상치 탐지를 위한 여러 가지 방법이 존재합니다. 그 중 몇 가지 방법을 간략히 살펴보겠습니다.&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;기초&amp;nbsp;통계량&amp;nbsp;방법&lt;br /&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;포인트가&amp;nbsp;기초&amp;nbsp;통계량에서&amp;nbsp;현저하게&amp;nbsp;벗어나면&amp;nbsp;이상치로&amp;nbsp;간주됩니다.&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;기계학습&amp;nbsp;기반&amp;nbsp;방법&lt;br /&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;이상치&amp;nbsp;탐지에&amp;nbsp;사용되는&amp;nbsp;기계학습&amp;nbsp;모델로는&amp;nbsp;Isolation&amp;nbsp;Forest,&amp;nbsp;One-Class&amp;nbsp;SVM,&amp;nbsp;로버스트&amp;nbsp;이상치&amp;nbsp;탐지&amp;nbsp;등이&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;규칙&amp;nbsp;기반&amp;nbsp;방법&lt;br /&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;방법입니다.&amp;nbsp;이&amp;nbsp;방법은&amp;nbsp;특정&amp;nbsp;분야에서&amp;nbsp;유용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&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;위해&amp;nbsp;필수적입니다.&amp;nbsp;적절한&amp;nbsp;이상치&amp;nbsp;탐지&amp;nbsp;방법을&amp;nbsp;선택하고&amp;nbsp;적용함으로써,&amp;nbsp;데이터로부터&amp;nbsp;유용한&amp;nbsp;정보를&amp;nbsp;추출하고&amp;nbsp;비즈니스&amp;nbsp;및&amp;nbsp;연구&amp;nbsp;분야에서&amp;nbsp;더&amp;nbsp;나은&amp;nbsp;결정을&amp;nbsp;내릴&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이상치&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;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;분류 (Classification)와 이상치 탐지 (Anomaly Detection)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAX9ii/btsznBEGAAH/BmTjK3nuQqCclbYTY3XN8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAX9ii/btsznBEGAAH/BmTjK3nuQqCclbYTY3XN8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAX9ii/btsznBEGAAH/BmTjK3nuQqCclbYTY3XN8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAX9ii%2FbtsznBEGAAH%2FBmTjK3nuQqCclbYTY3XN8k%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;700&quot; height=&quot;331&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;라벨링,&amp;nbsp;사용되는&amp;nbsp;방법,&amp;nbsp;결과&amp;nbsp;등에서&amp;nbsp;큰&amp;nbsp;차이가&amp;nbsp;있습니다.&amp;nbsp;이상치&amp;nbsp;탐지는&amp;nbsp;데이터&amp;nbsp;집합&amp;nbsp;내의&amp;nbsp;이상치를&amp;nbsp;식별하는&amp;nbsp;데&amp;nbsp;중점을&amp;nbsp;두고&amp;nbsp;비지도&amp;nbsp;학습&amp;nbsp;방법을&amp;nbsp;사용합니다.&amp;nbsp;반면,&amp;nbsp;분류는&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;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이상치 성능 측정 방법&lt;/b&gt;&lt;/h3&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;정확도 (Accuracy) : 정확도는 모델이 올바르게 분류한 이상치와 정상치의 비율을 나타냅니다. 일반적으로 정상치가 이상치보다 훨씬 많을 때, 정확도는높을 수 있지만 모델의 성능을 정확하게 나타내지 않을 수 있습니다.&lt;/li&gt;
&lt;li&gt;정밀도 (Precision) : 정밀도는 모델이 이상치로 분류한 데이터 중에서 실제로 이상치인 비율을 나타냅니다. 즉, &quot;모델이 이상치로 분류한 것 중에서 얼마나 많이 실제로 이상치인가?&quot;를 측정합니다.&lt;/li&gt;
&lt;li&gt;재현율 (Recall) : 재현율은 실제로 이상치인 데이터 중에서 모델이 정확하게 이상치로 분류한 비율을 나타냅니다. 즉, &quot;모델이 이상치로 분류해야 하는 것 중에서 얼마나 많이 실제로 이상치로 분류했는가?&quot;를 측정합니다.&lt;/li&gt;
&lt;li&gt;F1 점수 (F1 Score) : F1 점수는 정밀도와 재현율의 조화 평균을 나타냅니다. F1 점수는 정밀도와 재현율 간의 균형을 나타내며, 모델의 전반적인 성능을 평가하는 데 유용합니다.&lt;/li&gt;
&lt;li&gt;ROC 곡선과 AUC (Receiver Operating Characteristic Curve and Area Under the Curve): ROC 곡선은 모델의 민감도(재현율)와 특이도(1-거짓 양성 비율) 사이의 관계를 시각화한 것입니다. AUC는 ROC 곡선 아래의 면적으로, 모델의 전반적인 성능을 나타냅니다. AUC가 높을수록 모델의 성능이 우수합니다.&lt;/li&gt;
&lt;li&gt;PR 곡선과 AUC (Precision-Recall Curve and Area Under the Curve) : PR 곡선은 정밀도와 재현율 사이의 관계를 시각화한 것입니다. PR AUC는 PR 곡선 아래의 면적으로, 불균형 데이터셋에서 모델의 성능을 평가하는 데 유용합니다.&lt;/li&gt;
&lt;li&gt;이상치 점수 (Outlier Score) : 이상치&amp;nbsp;탐지&amp;nbsp;모델은&amp;nbsp;각&amp;nbsp;데이터&amp;nbsp;포인트에&amp;nbsp;대한&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;/li&gt;
&lt;li&gt;Confusion Matrix (혼동 행렬): 혼동&amp;nbsp;행렬은&amp;nbsp;모델의&amp;nbsp;예측&amp;nbsp;결과와&amp;nbsp;실제&amp;nbsp;데이터&amp;nbsp;간의&amp;nbsp;관계를&amp;nbsp;보여줍니다.&amp;nbsp;이를&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;/li&gt;
&lt;/ul&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;수&amp;nbsp;있습니다.&amp;nbsp;따라서&amp;nbsp;적절한&amp;nbsp;메트릭을&amp;nbsp;선택하여&amp;nbsp;모델을&amp;nbsp;평가하고&amp;nbsp;개선하는&amp;nbsp;것이&amp;nbsp;중요합니다.&lt;/p&gt;</description>
      <category>AI/Machine Learning</category>
      <category>노이즈</category>
      <category>이상치</category>
      <category>이상치 탐지</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/703</guid>
      <comments>https://sonseungha.tistory.com/703#entry703comment</comments>
      <pubDate>Sat, 28 Oct 2023 21:18:15 +0900</pubDate>
    </item>
    <item>
      <title>Increase SWAP memory size</title>
      <link>https://sonseungha.tistory.com/702</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;sudo&amp;nbsp;swapoff&amp;nbsp;-v&amp;nbsp;/swapfile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo&amp;nbsp;fallocate&amp;nbsp;-l&amp;nbsp;16G&amp;nbsp;/swapfile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo&amp;nbsp;chmod&amp;nbsp;600&amp;nbsp;/swapfile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo&amp;nbsp;mkswap&amp;nbsp;/swapfile&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo&amp;nbsp;swapon&amp;nbsp;/swapfile&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;Result :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$free -mh&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; total&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;used&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shared&amp;nbsp;&amp;nbsp;buff/cache&amp;nbsp;&amp;nbsp;&amp;nbsp;available&lt;br /&gt;Mem:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;31Gi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.8Gi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;25Gi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;37Mi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.5Gi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;26Gi&lt;br /&gt;Swap:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;127Gi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;127Gi&lt;/p&gt;</description>
      <category>Linux</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/702</guid>
      <comments>https://sonseungha.tistory.com/702#entry702comment</comments>
      <pubDate>Wed, 18 Oct 2023 14:57:34 +0900</pubDate>
    </item>
    <item>
      <title>데이터 불균형 - Over Sampling</title>
      <link>https://sonseungha.tistory.com/701</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ugmn4/btsvjheeCUC/QwGhNVS4S0FRzyfsQ1Jxq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ugmn4/btsvjheeCUC/QwGhNVS4S0FRzyfsQ1Jxq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ugmn4/btsvjheeCUC/QwGhNVS4S0FRzyfsQ1Jxq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUgmn4%2FbtsvjheeCUC%2FQwGhNVS4S0FRzyfsQ1Jxq1%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;500&quot; height=&quot;253&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 분석 및 기계학습을 위해 데이터를 수집하다보면 데이터의 정상 범주의 관측치 수와 이상 범주의 관측치 수의 차이가 크게 나타나는 경우를 만날 수 있다. 이와 같은 상황은 매우 빈번하게 마주할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 데이터 불균형은 왜 문제가 되는가? 우리는 데이터를 기반으로 정상을 정확하게 분류하는 것과 이상값을 정확히 분류하는 문제로 크게 나뉠 수 있다. 보통 정상인 데이터들이 다수이며 이상값이 소수이다. 일반적으로 정상을 분류하는 것보다 이상값을 분류하는 것이 더 중요한 문제로 다뤄진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 클래스 별로 관측치의 수가 현저하게 차이가 나는 데이터를 불균형 데이터라고 하며, 이러한 상황을 해결하기 위한 방법들을 간략하게 정리한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 불균형을 해결하기 위한 방법은 Data-based 접근 방식과 Modeling-based 접근방식이 존재한다. 이 글에서는 Data-based 접근방식만 정리한다. Data-based 접근 방법은 크게 아래와 같이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Under-sampling, Over-sampling&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2가지로 나뉘며 각 샘플링 기법내에 다양한 방법들이 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Under-sampling
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Random undersampling&lt;/li&gt;
&lt;li&gt;Tomek links&lt;/li&gt;
&lt;li&gt;Condensed NEarest Neighbor Rule (CNN)&lt;/li&gt;
&lt;li&gt;One-sided selection (Tomek links + CNN)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Over-sampling
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resampling&lt;/li&gt;
&lt;li&gt;SMOTE&lt;/li&gt;
&lt;li&gt;Borderline-SMOTE&lt;/li&gt;
&lt;li&gt;ADASYN&lt;/li&gt;
&lt;li&gt;MCMC (Markov Chain Monte Carlo)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Over Sampling에 대해 정리한다. Under Sampling을 정리한 글은 아래 글을 참고하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://sonseungha.tistory.com/700&quot;&gt;2023.09.24 - [AI/Machine Learning] - 데이터 불균형 - Under Sampling&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695555628527&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;데이터 불균형 - Under Sampling&quot; data-og-description=&quot;데이터 분석 및 기계학습을 위해 데이터를 수집하다보면 데이터의 정상 범주의 관측치 수와 이상 범주의 관측치 수의 차이가 크게 나타나는 경우를 만날 수 있다. 이와 같은 상황은 매우 빈번하&quot; data-og-host=&quot;sonseungha.tistory.com&quot; data-og-source-url=&quot;https://sonseungha.tistory.com/700&quot; data-og-url=&quot;https://sonseungha.tistory.com/700&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XPKuV/hyTY2b7MsB/atSZIqJgQLNJckmpULdX50/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/6ozdZ/hyT2wQa1jN/ykjcQmpe449cwKgSykuqvK/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/ZCjaq/hyT2teQtrt/SSs6ZpvkVwd8BFypNR7CtK/img.png?width=681&amp;amp;height=341&amp;amp;face=0_0_681_341&quot;&gt;&lt;a href=&quot;https://sonseungha.tistory.com/700&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sonseungha.tistory.com/700&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XPKuV/hyTY2b7MsB/atSZIqJgQLNJckmpULdX50/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/6ozdZ/hyT2wQa1jN/ykjcQmpe449cwKgSykuqvK/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/ZCjaq/hyT2teQtrt/SSs6ZpvkVwd8BFypNR7CtK/img.png?width=681&amp;amp;height=341&amp;amp;face=0_0_681_341');&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;데이터 불균형 - Under Sampling&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터 분석 및 기계학습을 위해 데이터를 수집하다보면 데이터의 정상 범주의 관측치 수와 이상 범주의 관측치 수의 차이가 크게 나타나는 경우를 만날 수 있다. 이와 같은 상황은 매우 빈번하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sonseungha.tistory.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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Over Sampling&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Over Sampling의 철학은 소수 범주의 데이터를 늘려서 다수 범주와 유사하게 만들어 각 범주의 데이터 수를 비슷하게 함으로써 분류 성능을 올리는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0Gtd/btsvkM5G3mz/Dk5g9x9hfwmj9i3Zk16rj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0Gtd/btsvkM5G3mz/Dk5g9x9hfwmj9i3Zk16rj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0Gtd/btsvkM5G3mz/Dk5g9x9hfwmj9i3Zk16rj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0Gtd%2FbtsvkM5G3mz%2FDk5g9x9hfwmj9i3Zk16rj0%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;500&quot; height=&quot;195&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;432&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Resampling&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Over sampling 기법 중 가장 간단한 방법이다. 소수 관측치를 다수 관측치의 수만큼 Resampling 하는 것이다. 즉 데이터 값이 동일한 중복된 데이터만 다수 만들어 놓는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZjKtv/btsvksGyxEH/2xglhDeJoTr394xY7a5wJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZjKtv/btsvksGyxEH/2xglhDeJoTr394xY7a5wJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZjKtv/btsvksGyxEH/2xglhDeJoTr394xY7a5wJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZjKtv%2FbtsvksGyxEH%2F2xglhDeJoTr394xY7a5wJ0%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;500&quot; height=&quot;191&quot; data-origin-width=&quot;820&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;단순하면서 무식한 방법이다. 이 방법은 소수 범주의 중복된 데이터들로 인해 Over-fitting이 쉽게 발생할 수 있다. 이러한 문제는 중복된 값을 만드는 것이 아닌 가상의 관측 데이터를 만들어내서 해결해야 한다. 앞으로 소개할 방법들이 이러한 방법이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SMOTE (Synthetic Minority Oversampling TEchnique)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMOTE 기법은 가상의 관측데이터를 생성하는 Over-Sampling 기법 중 하나이다. 아이디어는 단순하지만 매우 유명한 방법이다. 이 기법의 향상된 방안들이 지속적으로 개발되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMOTE는 소수 범주에서 가상 데이터를 생성할 때 K를 설정한다. 아래 예제는 K를 3으로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mxu61/btsvjeWaXlV/Ml3egklXeKYkVkRvINiZU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mxu61/btsvjeWaXlV/Ml3egklXeKYkVkRvINiZU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mxu61/btsvjeWaXlV/Ml3egklXeKYkVkRvINiZU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmxu61%2FbtsvjeWaXlV%2FMl3egklXeKYkVkRvINiZU1%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;500&quot; height=&quot;176&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMOTE 기법에서 K = 3인 개수를 선택하고 아래의 수식을 이용하여 가상의 데이터를 추가 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$${&amp;nbsp;s&amp;nbsp;=&amp;nbsp;x&amp;nbsp;+&amp;nbsp;u&amp;nbsp;\cdot&amp;nbsp;(x^R&amp;nbsp;-&amp;nbsp;x)}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$x$ 는 위 그림에서 임의로 선택한 데이터이며, $x^R$은 Nearest Neighbor 관측치이다. Nearest Neighbor 관측치 중에 또다시 하나의 값을 무작위로 선정하게 된다. $u$는 균등분포로 0과 1사이의 랜덤 값이다. 이 수식을 이용해서 랜덤 데이터 $s$를 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S1vRt/btsvnf0xQCD/qZaDzBalAN43581kn99HP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S1vRt/btsvnf0xQCD/qZaDzBalAN43581kn99HP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S1vRt/btsvnf0xQCD/qZaDzBalAN43581kn99HP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS1vRt%2Fbtsvnf0xQCD%2FqZaDzBalAN43581kn99HP1%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;300&quot; height=&quot;228&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림에서 처럼 특정 값의 K가 3인 Nearest Neighbor 값들을 찾고, 그 값 중 랜덤하게 하나를 선정한다. 그 이후 수식에 대입하여 가상의 데이터를 생성하게 된다. SMOTE 수식을 통해 각 데이터 간 0~1 사의 균등분포 랜덤 값만큼의 데이터가 생성된다. 이러한 방식으로 데이터가 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SMOTE 기법 사용 시 주의할 점은 K는 1이여서는 안된다. K를 1로 설정하게 되면 Nearest Neighbor는 하나이고 무조건 해당 데이터 간 직선내에서 만 데이터가 생성된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) Borderline SMOTE&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Borderline SMOTE는 SMOTE 기법의 확장 기법 중 하나이다. Borderline은 경계선을 의미한다. 이 기법은 OverSampling을 소수 관측치 군집 내에서 하는 것 보다는 경계선에 위치한 소수 관측치들을 이용하여 OverSampling하는 것이 더 효율적이고 좋은 성능을 내지 않을까란 아이디어에서 출발한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;소수 클래스 $x_{i}$에 대해서 K개 주변을 찾고, K 개 중 다수 클래스의 수를 확인한다.&lt;/li&gt;
&lt;li&gt;K 개의 관측치 중 다수 클래스의 관측치의 개수마다 Danger인지, Safe 인지, Noise 인지 판단한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;k = k` : Noise&lt;/li&gt;
&lt;li&gt;k/2 &amp;lt; k` &amp;lt; k : Danger 관측치&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= k` &amp;lt;= k/2 : Safe 관측치&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Danger 관측치에 대해서만 SMOTE를 적용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 알고리즘을 통한 결과를 아래 그림으로 확인해보면, 경계선에 존재하는 Border line 관측치들 주변에만 새로운 데이터가 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBFvtN/btsvoY5insf/CajqlBZ4by3KRl19bAGuwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBFvtN/btsvoY5insf/CajqlBZ4by3KRl19bAGuwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBFvtN/btsvoY5insf/CajqlBZ4by3KRl19bAGuwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBFvtN%2FbtsvoY5insf%2FCajqlBZ4by3KRl19bAGuwK%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;700&quot; height=&quot;245&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 Border line SMOTE를 제안한 논문에서 예시 그림을 인용하면 아래와 같다. 더욱 명확하게 경계선에 가상의 데이터가 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqTyFX/btsvkrVer1B/j6M8RmxRAKUNQ8K0N1gs50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqTyFX/btsvkrVer1B/j6M8RmxRAKUNQ8K0N1gs50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqTyFX/btsvkrVer1B/j6M8RmxRAKUNQ8K0N1gs50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqTyFX%2FbtsvkrVer1B%2Fj6M8RmxRAKUNQ8K0N1gs50%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;700&quot; height=&quot;314&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) ADASYN (Adaptive Synthetic Sampling Approach)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADASYN은 Borderline Sampling 기법과 유사한데, 차이점은 샘플링하는 개수를 소수 관측치의 위치에 따라 다르게 수행하자라는 것이 주 아이디어이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6xbFP/btsvk2HEBf9/tAi5kyQaZbpPvTWAkOuFQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6xbFP/btsvk2HEBf9/tAi5kyQaZbpPvTWAkOuFQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6xbFP/btsvk2HEBf9/tAi5kyQaZbpPvTWAkOuFQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6xbFP%2Fbtsvk2HEBf9%2FtAi5kyQaZbpPvTWAkOuFQk%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;414&quot; height=&quot;300&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$${r_{i}&amp;nbsp;=&amp;nbsp;\Delta_{i}&amp;nbsp;/&amp;nbsp;K&amp;nbsp;,&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1,...,m}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;${r_{i} $ : 각 소수 클래스 데이터 주변에 위치한 다수 클래스 데이터 개수의 크기를 정량화한 값&lt;br /&gt;$\Delta_{i}$ : 소수 클래스 $x_{i}$의 주변 K 개 중 다수 클래스의 관측치 개수&lt;br /&gt;$m$ : 소수 클래스 내 관측치 총 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 수식의 의미는 각 소수 클래스 주변에 얼마만큼 많은 다수 클래스 관측치가 있는가를 정량화한 지료를 의미한다. 이를 통해 Borderline SMOTE와 유사하지만 다른 가상의 데이터를 만들어 낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 만든 $r_{i}$ 값을 스케일링 한다. 스케일링은 $r_{i}$을 다 더한 값을 이용하여 $r_{i}$를 나눈 값이다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 값을 이용하여 새로 생성할 가상 데이터의 개수를 정의한다. 이 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;G&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;값을 정의하는데 &lt;b&gt;G는 다수 클래수 개수 - 소수 클래스 개수&lt;/b&gt;이다. 여기서는 계산 편의상 G = 10 을 이용한다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 67.2118%; height: 237px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1183%; text-align: center;&quot;&gt;데이터 i&lt;/td&gt;
&lt;td style=&quot;width: 29.7819%; text-align: center;&quot;&gt;$r_{i}$&lt;/td&gt;
&lt;td style=&quot;width: 29.5639%; text-align: center;&quot;&gt;$r_{i}$ Scaling 값&lt;/td&gt;
&lt;td style=&quot;width: 18.5359%; text-align: center;&quot;&gt;Scaling x G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1183%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 29.7819%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 29.5639%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 18.5359%;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1183%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 29.7819%;&quot;&gt;2/3&lt;/td&gt;
&lt;td style=&quot;width: 29.5639%;&quot;&gt;0.4&lt;/td&gt;
&lt;td style=&quot;width: 18.5359%;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1183%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 29.7819%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 29.5639%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 18.5359%;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1183%;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 29.7819%;&quot;&gt;1/3&lt;/td&gt;
&lt;td style=&quot;width: 29.5639%;&quot;&gt;0.2&lt;/td&gt;
&lt;td style=&quot;width: 18.5359%;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.1183%;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 29.7819%;&quot;&gt;2/3&lt;/td&gt;
&lt;td style=&quot;width: 29.5639%;&quot;&gt;0.4&lt;/td&gt;
&lt;td style=&quot;width: 18.5359%;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 나온 개수 만큼 SMOTE를 통해 가상 데이터를 생성하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzVO4Q/btsvdokn5qJ/9hwkdjS2oSviX3ZCDRk82K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzVO4Q/btsvdokn5qJ/9hwkdjS2oSviX3ZCDRk82K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzVO4Q/btsvdokn5qJ/9hwkdjS2oSviX3ZCDRk82K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzVO4Q%2Fbtsvdokn5qJ%2F9hwkdjS2oSviX3ZCDRk82K%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;700&quot; height=&quot;236&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Borderline SMOTE와 다른 점은 경계선에 집중하는 것이고, ADASYN은 경계선 + 다수 클래스에 근접해 있는 소수 클래스 더욱 집중하자라는 것에 차이가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지는 불균형 데이터를 SMOTE, Borderline SMOTE, ADASYN을 비교한 것이다. ADASYN이 무조건 SMOTE, Borderline SMOTE보다 잘 동작하는 것은 아니다. 아래 이미지는 ADASYN의 성능을 우수하게 보여주기 위한 특정 데이터이다. 해당 데이터는 다수 클래스의 범주가 여러개인 경우에 SMOTE, Borderline SMOTE보다 ADASYN의 성능이 좋음을 보여준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xia8f/btsvl97d9sI/Ex1sn59OpKuxZRBohCSKuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xia8f/btsvl97d9sI/Ex1sn59OpKuxZRBohCSKuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xia8f/btsvl97d9sI/Ex1sn59OpKuxZRBohCSKuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxia8f%2Fbtsvl97d9sI%2FEx1sn59OpKuxZRBohCSKuk%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;700&quot; height=&quot;392&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) Markov Chain Monte Carlo (MCMC)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCMC는 통계적인 특성을 이용하여 다양한 방식을 시도해보는 기법이다. MCMC 에서는 가장 마지막에 선정된 샘플이 다음 샘플을 추천해 준다는 아이디어에서 시작한다. 어떤 상태에서 다른 상태로 넘어갈 때, 바로 전 단계의 상태에만 영향을 받는 확률 과정을 의미한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCMC는 아래 단계를 거친다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Random initialization&lt;/li&gt;
&lt;li&gt;제안분포 g(x)로 부터 다음 데이터 추천받기&lt;/li&gt;
&lt;li&gt;패자부활전&lt;/li&gt;
&lt;li&gt;위 2, 3단계를 지속 반복&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(1) Random Initilization&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Random initialization은 데이터 샘플 공간에서 랜덤 값 하나를 입력하는 것이다. 여기서는 0.7인 값을 랜덤 값으로 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(2) 제안 분포 g(x)로 부터 다음 데이터 추천받기&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MCMC의 그 다음번 스텝은 제안 분포로부터 다음번으로 추출해볼 샘플을 추천받는 것이다. 여기서 제안분포는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;g&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;(&amp;lt;/mo&amp;gt;&amp;lt;mi&amp;gt;x&amp;lt;/mi&amp;gt;&amp;lt;mo stretchy=&amp;quot;false&amp;quot;&amp;gt;)&amp;lt;/mo&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;라고 부르도록 하자. 처음 시작으로 잡은&lt;span&gt; $x_{0}$&lt;/span&gt;를 중심으로 정규분포를 하나 그려본다. 이 때, 정규분포의 너비(즉, 표준 편차)는 연구자의 선택에 따라 임의로 설정하면 된다. 이번 그림에서는 표준편차를 2로 설정해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH87Dm/btsvqy6szxa/3QKKS41Q9ovOuLhhNm3ew1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH87Dm/btsvqy6szxa/3QKKS41Q9ovOuLhhNm3ew1/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-09-17-MCMC/pic3.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH87Dm/btsvqy6szxa/3QKKS41Q9ovOuLhhNm3ew1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH87Dm%2Fbtsvqy6szxa%2F3QKKS41Q9ovOuLhhNm3ew1%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;400&quot; height=&quot;596&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-09-17-MCMC/pic3.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 제안이 수용되었다면 수용된 샘플 포인트 $x_{1}$ 을 중심으로 제안 분포를 그리고, 이를 통해 샘픙을 또 추천 받는다. 만약 제안이 수용되지 않았다면 통계적으로 수용하게끔 MCMC는 패자부활전을 진행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXgkh/btsviVoDkDr/vLJ3MUk7oeeiX8uqBkbfCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXgkh/btsviVoDkDr/vLJ3MUk7oeeiX8uqBkbfCK/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-09-17-MCMC/pic4.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXgkh/btsviVoDkDr/vLJ3MUk7oeeiX8uqBkbfCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXgkh%2FbtsviVoDkDr%2FvLJ3MUk7oeeiX8uqBkbfCK%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;600&quot; height=&quot;561&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2020-09-17-MCMC/pic4.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;(3) 패자부활전&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 (2) 단계에서 거절된 샘플들은 무조건 이용하지 않는 것은 아니고, 통계적으로 수용할 수 있게 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$${f(x_{1} / f(x_{2}) &amp;gt; u, u = uniform distribution U(0,1))}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여기서도 위의 식을 만족하지 못한다면 그 때는 새로운 샘플 $x_{1}$을 샘플링하기를 수용하지 않고, $x_{1}$을 $x_{0}$로 설정한 뒤 다음 데이터 $x_{2}$를 추천받는다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(4) 위 2, 3단계를 지속 반복&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 반복하며 데이터를 추천받고 생성을 한다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6) 정리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Under Sampling과 다르게 정보 손실이 없다.&lt;/li&gt;
&lt;li&gt;대부분의 경우 Under Sampling에 비해 높은 분류 정확도를 보인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul 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;li&gt;노이즈 또는 이상치에 민감&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://angeloyeo.github.io/2020/09/17/MCMC.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://angeloyeo.github.io/2020/09/17/MCMC.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://www.youtube.com/watch?v=Vhwz228VrIk&amp;amp;list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&amp;amp;index=17&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Machine Learning</category>
      <category>ADASYN</category>
      <category>Borderline SMOTE</category>
      <category>MCMC</category>
      <category>Oversampling</category>
      <category>random sampling</category>
      <category>SMOTE</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/701</guid>
      <comments>https://sonseungha.tistory.com/701#entry701comment</comments>
      <pubDate>Sun, 24 Sep 2023 20:40:52 +0900</pubDate>
    </item>
    <item>
      <title>데이터 불균형 - Under Sampling</title>
      <link>https://sonseungha.tistory.com/700</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eOF5uD/btsviSL8I05/ZC05wzlnZwlWwKMtphKgIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eOF5uD/btsviSL8I05/ZC05wzlnZwlWwKMtphKgIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eOF5uD/btsviSL8I05/ZC05wzlnZwlWwKMtphKgIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeOF5uD%2FbtsviSL8I05%2FZC05wzlnZwlWwKMtphKgIk%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;500&quot; height=&quot;253&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;460&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;이러한 데이터 불균형은 왜 문제가 되는가? 우리는 데이터를 기반으로 정상을 정확하게 분류하는 것과 이상값을 정확히 분류하는 문제로 크게 나뉠 수 있다. 보통 정상인 데이터들이 다수이며 이상값이 소수이다. 일반적으로 정상을 분류하는 것보다 이상값을 분류하는 것이 더 중요한 문제로 다뤄진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 클래스 별로 관측치의 수가 현저하게 차이가 나는 데이터를 불균형 데이터라고 하며, 이러한 상황을 해결하기 위한 방법들을 간략하게 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 불균형을 해결하기 위한 방법은 Data-based 접근 방식과 Modeling-based 접근방식이 존재한다. 이 글에서는 Data-based 접근방식만 정리한다. Data-based 접근 방법은 크게 아래와 같이 &lt;b&gt;Under-sampling, Over-sampling&lt;/b&gt; 2가지로 나뉘며 각 샘플링 기법내에 다양한 방법들이 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Under-sampling
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Random undersampling&lt;/li&gt;
&lt;li&gt;Tomek links&lt;/li&gt;
&lt;li&gt;Condensed NEarest Neighbor Rule (CNN)&lt;/li&gt;
&lt;li&gt;One-sided selection (Tomek links + CNN)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Over-sampling
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resampling&lt;/li&gt;
&lt;li&gt;SMOTE&lt;/li&gt;
&lt;li&gt;Borderline-SMOTE&lt;/li&gt;
&lt;li&gt;ADASYN&lt;/li&gt;
&lt;li&gt;MCMC (Markov Chain Monte Carlo)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Under Sampling에 대해 정리한다. Over Sampling을 정리한 글은 아래 글을 참고하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://sonseungha.tistory.com/701&quot;&gt;2023.09.24 - [AI/Machine Learning] - 데이터 불균형 - Over Sampling&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695555678035&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;데이터 불균형 - Over Sampling&quot; data-og-description=&quot;데이터 분석 및 기계학습을 위해 데이터를 수집하다보면 데이터의 정상 범주의 관측치 수와 이상 범주의 관측치 수의 차이가 크게 나타나는 경우를 만날 수 있다. 이와 같은 상황은 매우 빈번하&quot; data-og-host=&quot;sonseungha.tistory.com&quot; data-og-source-url=&quot;https://sonseungha.tistory.com/701&quot; data-og-url=&quot;https://sonseungha.tistory.com/701&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfYVXA/hyT2t0dQ1A/cK4omQi3dY9fUD1HjCwwZK/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/taF1G/hyT2w3Ih3O/GbWnVGmT2bKFe3i4icvJ40/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/Bxi4Q/hyT2tMGPCE/A2X58f7RefkNITUN571kQ1/img.png?width=910&amp;amp;height=460&amp;amp;face=0_0_910_460&quot;&gt;&lt;a href=&quot;https://sonseungha.tistory.com/701&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sonseungha.tistory.com/701&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfYVXA/hyT2t0dQ1A/cK4omQi3dY9fUD1HjCwwZK/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/taF1G/hyT2w3Ih3O/GbWnVGmT2bKFe3i4icvJ40/img.png?width=800&amp;amp;height=404&amp;amp;face=0_0_800_404,https://scrap.kakaocdn.net/dn/Bxi4Q/hyT2tMGPCE/A2X58f7RefkNITUN571kQ1/img.png?width=910&amp;amp;height=460&amp;amp;face=0_0_910_460');&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;데이터 불균형 - Over Sampling&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터 분석 및 기계학습을 위해 데이터를 수집하다보면 데이터의 정상 범주의 관측치 수와 이상 범주의 관측치 수의 차이가 크게 나타나는 경우를 만날 수 있다. 이와 같은 상황은 매우 빈번하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sonseungha.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Under Sampling&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Under Sampling의 철학은 다수 범주의 데이터를 줄여서 소수 범주와 유사하게 만들어 각 범주의 데이터 수를 비슷하게 함으로써 분류 성능을 올리는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brNjqF/btsvncWPqiR/lgOc8Q4QOBKfzHA9aNqpc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brNjqF/btsvncWPqiR/lgOc8Q4QOBKfzHA9aNqpc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brNjqF/btsvncWPqiR/lgOc8Q4QOBKfzHA9aNqpc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrNjqF%2FbtsvncWPqiR%2FlgOc8Q4QOBKfzHA9aNqpc0%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;500&quot; height=&quot;216&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Random Undersampling&lt;/b&gt;&lt;/h3&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k3yAy/btsvlzZkSEI/7OKZoO8Uu3zIqUlTvbITRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k3yAy/btsvlzZkSEI/7OKZoO8Uu3zIqUlTvbITRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k3yAy/btsvlzZkSEI/7OKZoO8Uu3zIqUlTvbITRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk3yAy%2FbtsvlzZkSEI%2F7OKZoO8Uu3zIqUlTvbITRK%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;500&quot; height=&quot;302&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;537&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) Tomek links&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tomek&lt;/b&gt; &lt;b&gt;links&lt;/b&gt;는 두 개의 데이터 Pair ${(x_{i}, x_{j})}$ 가 있을 때 두 데이터 간 거리를 ${d(x_{i}, x_{j})}$라고 할 때, ${d(x_{i}, x_{k}) &amp;lt; d(x_{i}, x_{j})}$ 또는 ${d(x_{j}, x_{k}) &amp;lt; d(x_{i}, x_{j})}$&amp;nbsp;가 되는 관측치 ${x_{k}}$가 없는 경우 ${(x_{i}, x_{j})}$를 Tomek links 라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 설명을 간략하게 정리하면 아래 그림과 같이 ${X_{i} 와 X_{j}}$ 쌍의 거리를 측정했을 때, ${X_{j}}에서 더 가까운 ${X_{k}}가 존재하는 것을 알 수 있다. 이렇게 더 가까운 거리의 ${X_{k}}가 존재한다면, ${X_{i} 와 X_{j}}$는&lt;b&gt; Tomek links가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDBKn/btsvmy62kcM/BH0E6QhBKA0nrRY64SQoek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDBKn/btsvmy62kcM/BH0E6QhBKA0nrRY64SQoek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDBKn/btsvmy62kcM/BH0E6QhBKA0nrRY64SQoek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDBKn%2Fbtsvmy62kcM%2FBH0E6QhBKA0nrRY64SQoek%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;368&quot; height=&quot;309&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 Tomek links가 무엇인가? 두 점 사이의 거리가 최소가 되는 Pair ${X_{i} 와 X_{j}}$를 연결한 것을 Tomek links라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp9mVt/btsvl8G7cRi/PGnRWnpvwkfqK7kqfqf9F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp9mVt/btsvl8G7cRi/PGnRWnpvwkfqK7kqfqf9F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp9mVt/btsvl8G7cRi/PGnRWnpvwkfqK7kqfqf9F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp9mVt%2Fbtsvl8G7cRi%2FPGnRWnpvwkfqK7kqfqf9F1%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;337&quot; height=&quot;281&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 방식으로 데이터 셋에서 모든 Tomek links를 찾고 다수 범주에 속한 관측치를 제거하는 방법이 &lt;b&gt;Tomek links 기법&lt;/b&gt;이다. 아래와 같이 Tomek links에 해당하는 데이터는 경계값이므로 제거 시 좀 더 명확하게 다수와 소수 범주의 데이터를 분류할 수 있는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUux02/btsvksT5DP8/0wS8bRKIFuONAlBLo3XeOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUux02/btsvksT5DP8/0wS8bRKIFuONAlBLo3XeOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUux02/btsvksT5DP8/0wS8bRKIFuONAlBLo3XeOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUux02%2FbtsvksT5DP8%2F0wS8bRKIFuONAlBLo3XeOK%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;681&quot; height=&quot;341&quot; data-origin-width=&quot;681&quot; data-origin-height=&quot;341&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) Condensed Nearest Neighbor Rule (CNN)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CNN 기법은 소수 범주 데이터 전체와 다수 범주에서 무작위로 하나의 관측치를 선택하여 서브 데이터를 구성합니다. 그 이후 다수 범에서 선택한 하나의 관측치를 제외한 나머지 데이터를 1-Nearest Neighbor 기법을 통해 샘플링할 데이터를 선정하는 방식입니다.&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N1Xn0/btsvoVgqg0u/vk6qHwXxkFkUNsutUfkpk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N1Xn0/btsvoVgqg0u/vk6qHwXxkFkUNsutUfkpk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N1Xn0/btsvoVgqg0u/vk6qHwXxkFkUNsutUfkpk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN1Xn0%2FbtsvoVgqg0u%2Fvk6qHwXxkFkUNsutUfkpk1%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;500&quot; height=&quot;194&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택받지 못한 다수 범주의 데이터들을 이용하여 1-Nearest Neighbor 기법을 통해 거리를 계산하고 가까운 쪽으로 범주를 변환합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K99UG/btsvkqhDYPh/xqfdoQEopUloSyiF63aqBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K99UG/btsvkqhDYPh/xqfdoQEopUloSyiF63aqBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K99UG/btsvkqhDYPh/xqfdoQEopUloSyiF63aqBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK99UG%2FbtsvkqhDYPh%2FxqfdoQEopUloSyiF63aqBk%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;500&quot; height=&quot;194&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myVLl/btsvkRFWYnV/PPzcdLlAhvSUjTWKH0slZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myVLl/btsvkRFWYnV/PPzcdLlAhvSUjTWKH0slZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myVLl/btsvkRFWYnV/PPzcdLlAhvSUjTWKH0slZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyVLl%2FbtsvkRFWYnV%2FPPzcdLlAhvSUjTWKH0slZK%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;500&quot; height=&quot;194&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정이 완료되면, 아래와 같이 처음에 경계선이 좀 더 명확하게 분류를 할 수 있도록 조정 되는 것을 알 수 있습니다. 이러한 방법이 Condensed Nearest Neighbor Rule (CNN) 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KJdag/btsvDk0TcaG/sdqs0dqwCcXJx7QWytzVN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KJdag/btsvDk0TcaG/sdqs0dqwCcXJx7QWytzVN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KJdag/btsvDk0TcaG/sdqs0dqwCcXJx7QWytzVN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKJdag%2FbtsvDk0TcaG%2Fsdqs0dqwCcXJx7QWytzVN0%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;500&quot; height=&quot;194&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 주의할 점은 다수 범주의 분류를 위해 1-Nearest Neighbor 기법을 사용해야 한다는 것입니다. K가 1이 아닌 3, 5 등의 수는 무조건 소수 범주로 분류가 됩니다. 다수 범주 중 딱 하나의 데이터만 뽑았기에, K가 1이 아니라면 문제가 발생합니다. 이 점 주의하시기 바랍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) One-Sided Selection (Tomek links + CNN)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;One-Sided Selection(이하 OSS) 은 Tomek links와 CNN 기법을 합친 방법이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KiUKr/btsviVWsjnU/AHCde59Gz5l60LqF7Kmtw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KiUKr/btsviVWsjnU/AHCde59Gz5l60LqF7Kmtw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KiUKr/btsviVWsjnU/AHCde59Gz5l60LqF7Kmtw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKiUKr%2FbtsviVWsjnU%2FAHCde59Gz5l60LqF7Kmtw0%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;500&quot; height=&quot;194&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomek links 로 Pair 된 데이터 중 다수 범주에 속하는 데이터를 삭제하고, CNN을 통해 데이터를 함께 삭제하게 되면 아래의 데이터만 남게되고, 분류 경계선이 더욱 명확해 짐을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eltnS0/btsvkbYYDVM/GYwhOM4QLHkmVgyeG8CIOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eltnS0/btsvkbYYDVM/GYwhOM4QLHkmVgyeG8CIOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eltnS0/btsvkbYYDVM/GYwhOM4QLHkmVgyeG8CIOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeltnS0%2FbtsvkbYYDVM%2FGYwhOM4QLHkmVgyeG8CIOk%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;500&quot; height=&quot;197&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) 정리&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점
&lt;ul 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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 제거로 인한 정보 손실이 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&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;참고&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;김성범 교수님 강의 자료 -&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=Vhwz228VrIk&amp;amp;list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&amp;amp;index=17&quot;&gt;https://www.youtube.com/watch?v=Vhwz228VrIk&amp;amp;list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&amp;amp;index=17&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Machine Learning</category>
      <category>CNN</category>
      <category>Imbalanced data</category>
      <category>ML</category>
      <category>oss</category>
      <category>Tomek links</category>
      <category>데이터불균형</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/700</guid>
      <comments>https://sonseungha.tistory.com/700#entry700comment</comments>
      <pubDate>Sun, 24 Sep 2023 19:06:26 +0900</pubDate>
    </item>
    <item>
      <title>[C#] DLL 포함시켜 단일 EXE로 만들기</title>
      <link>https://sonseungha.tistory.com/699</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;프로젝트 파일 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 파일 내에 PropertyGroup에 아래와 같은 항목을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694492142170&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Project Sdk=&quot;Microsoft.NET.Sdk&quot;&amp;gt;

  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;OutputType&amp;gt;WinExe&amp;lt;/OutputType&amp;gt;
    &amp;lt;TargetFramework&amp;gt;net6.0-windows&amp;lt;/TargetFramework&amp;gt;
    ...
    &amp;lt;PublishSingleFile&amp;gt;true&amp;lt;/PublishSingleFile&amp;gt;
    &amp;lt;SelfContained&amp;gt;true&amp;lt;/SelfContained&amp;gt;
    &amp;lt;RuntimeIdentifier&amp;gt;win-x64&amp;lt;/RuntimeIdentifier&amp;gt;
    &amp;lt;IncludeNativeLibrariesForSelfExtract&amp;gt;true&amp;lt;/IncludeNativeLibrariesForSelfExtract&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;

&amp;lt;/Project&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PublishSingleFile : 하나의 파일로 게시(Publish)를 사용하도록 설정&lt;/li&gt;
&lt;li&gt;SelfContained : 앱이 자체 포함대상인지, 프레임워크 종속인지 확인&lt;/li&gt;
&lt;li&gt;RuntimeIdentifier : 대상으로 하는 OS / CPU 유형 지정&lt;/li&gt;
&lt;li&gt;IncludeNativeLibrariesForSelfExtract : 코어 런타임 자체의 네이티브 이진 파일 포함하고 하나의 출력 파일을 얻기 위한 속성 ( 코어 런타임 자체의 네이티브 이진 파일은 단일 파일 번들에 기본적으로 포함되지 않음 )&lt;/li&gt;
&lt;/ul&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;배포 (게시 / Publish)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트에서 게시(Publish)를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUBvvc/btstCE2PG7V/fQbpUIeupcwVq3UbvCp65k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUBvvc/btstCE2PG7V/fQbpUIeupcwVq3UbvCp65k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUBvvc/btstCE2PG7V/fQbpUIeupcwVq3UbvCp65k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUBvvc%2FbtstCE2PG7V%2FfQbpUIeupcwVq3UbvCp65k%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;508&quot; height=&quot;312&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정&lt;/b&gt;을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUAXN/btstOjJGkRL/Z3errXVKw5FkHB79Cc77Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUAXN/btstOjJGkRL/Z3errXVKw5FkHB79Cc77Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUAXN/btstOjJGkRL/Z3errXVKw5FkHB79Cc77Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUAXN%2FbtstOjJGkRL%2FZ3errXVKw5FkHB79Cc77Vk%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;648&quot; height=&quot;396&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로필 설정&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대화 상자에서 다음 옵션을 설정합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;배포 모드&lt;/b&gt;를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자체 포함&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프레임워크 종속&lt;/b&gt;으로 설정합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;대상 런타임&lt;/b&gt;을 게시할 플랫폼으로 설정합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이식 가능&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이외의 항목이어야 합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;단일 파일 생성&lt;/b&gt;을 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저장&lt;/b&gt;을 선택하여 설정을 저장하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;게시&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대화 상자로 돌아갑니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pEKdP/btstQS6fxLP/oPJAWKTkOxlpXZGOgq2pp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pEKdP/btstQS6fxLP/oPJAWKTkOxlpXZGOgq2pp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pEKdP/btstQS6fxLP/oPJAWKTkOxlpXZGOgq2pp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpEKdP%2FbtstQS6fxLP%2FoPJAWKTkOxlpXZGOgq2pp0%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;548&quot; height=&quot;502&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;502&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language/C#</category>
      <category>.NET</category>
      <category>C#</category>
      <category>DLL포함</category>
      <category>Publish</category>
      <category>Single EXE</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/699</guid>
      <comments>https://sonseungha.tistory.com/699#entry699comment</comments>
      <pubDate>Tue, 12 Sep 2023 13:23:37 +0900</pubDate>
    </item>
    <item>
      <title>[Hotfix] Cuda 설치 시 발생 문제 해결</title>
      <link>https://sonseungha.tistory.com/698</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;nvidia-drm driver 문제&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nvidia-drm driver 문제는 아래와 같은 Log를 남긴다. nvidia-drm 커널 모듈이 이미 커널에 로드되어 사용중이기 때문에 설치가 어렵다는 내용이다.&lt;/p&gt;
&lt;pre id=&quot;code_1694353483269&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ERROR: An NVIDIA kernel module 'nvidia-drm' appears to already be loaded in your kernel.  This may be because it is in use (for example, by an X server, a CUDA program, or 
         the NVIDIA Persistence Daemon), but this may also happen if your kernel was configured without support for module unloading.  Please be sure to exit any programs    
         that may be using the GPU(s) before attempting to upgrade your driver.  If no GPU-based programs are running, you know that your kernel supports module unloading,   
         and you still receive this message, then an error may have occured that has corrupted an NVIDIA kernel module's usage count, for which the simplest remedy is to     
         reboot your computer.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 해결 방법은 간단하다. nvidia-drm 모듈을 제거시킨 후 설치를 진행한다. 하지만 nvidia-drm 모듈은 Graphics 환경에서는 제거가 되지 않기 때문에 아래 순서를 따른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. nvidia-drm 모듈 Unloading&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 graphic 환경에서 terminal 환경으로 변경한 후 nvidia-drm 모듈 사용 여부를 확인한다. 사용 중인 경우 nvidia-drm 을 제거한 후 정상적으로 제거되었는지 확인하는 과정이다.&lt;/p&gt;
&lt;pre id=&quot;code_1694353645741&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo systemctl isolate multi-user.target
$lsmod | grep nvidia.drm
$sudo modprobe -r nvidia-drm
$lsmod | grep nvidia.drm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;2. cuda 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cuda를 다운받은 경로로 이동하여 설치한다. 아래에서는 runfile 기반 설치 방식이다.&lt;/p&gt;
&lt;pre id=&quot;code_1694353790212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo sh cuda_{your_download_version}_linux.run&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 3. 설치 후 Cuda 버전 업데이트 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694353795641&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$nvidia-smi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. GUI 환경 재시작&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694353815563&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo systemctl start graphical.target&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>cuda</category>
      <category>hotfix</category>
      <category>Nvidia</category>
      <category>nvidia-drm</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/698</guid>
      <comments>https://sonseungha.tistory.com/698#entry698comment</comments>
      <pubDate>Sun, 10 Sep 2023 22:50:46 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu 22.04] Whale browser gpg keyring warning</title>
      <link>https://sonseungha.tistory.com/697</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Naver-whale 브라우저를 사용한다면 Ubuntu 22.04에서 update 시 아래와 같은 경고를 볼 수 있다. Ubuntu 22.04부터 apt-key를 이용하여 저장소용 gpg 키를 추가하는 것을 권장하지 않는다. 따라 저장소용 gpg 키에 대하여 Warning을 발생 시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1694237142805&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;W: https://repo.whale.naver.com/stable/deb/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 Warning은 무시해도 문제는 없다 하지만 해결하고 한다면 오류가 발생하는 서드파티 저장소의 키를 아래와 같이 /etc/apt/trusted.gpg.d/ 경로에 넣거나 apt 저장소 설정 파일에서 직접 gpg 파일의 경로를 추가하는 방법으로 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Naver-whale 브라우저는 아래와 같은 방식으로 Warning을 해결할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353c41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1694237084044&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo apt-key export EF6C07F6 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/whale-key.gpg
$sudo apt update&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Linux</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/697</guid>
      <comments>https://sonseungha.tistory.com/697#entry697comment</comments>
      <pubDate>Sat, 9 Sep 2023 14:27:09 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Ubuntu 22.02 Setting</title>
      <link>https://sonseungha.tistory.com/696</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;환경&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. zsh &amp;amp; oh-my-zsh 설치하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1694240074892&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo apt -y install zsh
$sh -c &quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;theme를 agnoster로 변경해주기 위해 ~/.zshrc 에서 ZSH_THEME을 변경해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1694240176592&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ZSH_THEME=&quot;agnoster&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후 Font가 깨진다면 아래와 같이 font를 설치해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1694240326292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$git clone https://github.com/powerline/fonts.git --depth=1
$cd fonts
$./install.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 터미널 Font를 powerline 중 하나로 변경해준다면 문제 해결된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. fzf 설치하기&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1694239994686&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - junegunn/fzf: :cherry_blossom: A command-line fuzzy finder&quot; data-og-description=&quot;:cherry_blossom: A command-line fuzzy finder. Contribute to junegunn/fzf development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/junegunn/fzf#installation&quot; data-og-url=&quot;https://github.com/junegunn/fzf&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iJqNg/hyTSy2jkaa/jNO96N3bIHGqdu8dOk8HJK/img.png?width=1200&amp;amp;height=680&amp;amp;face=0_0_1200_680&quot;&gt;&lt;a href=&quot;https://github.com/junegunn/fzf#installation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/junegunn/fzf#installation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iJqNg/hyTSy2jkaa/jNO96N3bIHGqdu8dOk8HJK/img.png?width=1200&amp;amp;height=680&amp;amp;face=0_0_1200_680');&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;GitHub - junegunn/fzf: :cherry_blossom: A command-line fuzzy finder&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;:cherry_blossom: A command-line fuzzy finder. Contribute to junegunn/fzf development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3.&amp;nbsp;Browser&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;naver-whale 사용하기&lt;/p&gt;
&lt;figure id=&quot;og_1694243255437&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;네이버 웨일 브라우저&quot; data-og-description=&quot;일상을 여는 새로운 시작 네이버 웨일&quot; data-og-host=&quot;whale.naver.com&quot; data-og-source-url=&quot;https://whale.naver.com/ko/download/linux/&quot; data-og-url=&quot;https://whale.naver.com/ko/download/linux/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cTbcmC/hyTSzUqKKM/nhK8jRqGoecZvotgKd3Wy1/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/ndd2W/hyTSBdDttT/OFMjVBXzKZtUkEOdZUE9rk/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://whale.naver.com/ko/download/linux/&quot; data-source-url=&quot;https://whale.naver.com/ko/download/linux/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cTbcmC/hyTSzUqKKM/nhK8jRqGoecZvotgKd3Wy1/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/ndd2W/hyTSBdDttT/OFMjVBXzKZtUkEOdZUE9rk/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;네이버 웨일 브라우저&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;일상을 여는 새로운 시작 네이버 웨일&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;whale.naver.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1694243255438&quot; class=&quot;gams&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo dpkg -i naver-whale-stable_amd64.deb&lt;/code&gt;&lt;/pre&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;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1694236183698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo apt install git vim build-essential curl gnome-tweaks terminator htop net-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Git 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694243911655&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git config --global user.name [내이름]
$ git config --global user.email [메일]
$ sudo git config --global color.ui &quot;auto&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;poetry 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1694243037706&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$curl -sSL https://install.python-poetry.org | python3 -&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;vscode 설치&lt;/h4&gt;
&lt;figure id=&quot;og_1694243159609&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;Visual Studio Code - Code Editing. Redefined&quot; data-og-description=&quot;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/&quot; data-og-url=&quot;https://code.visualstudio.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/j8N6S/hyTSBEJQWw/t6bfMlhpFFHBckzrpVXD2K/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/j8N6S/hyTSBEJQWw/t6bfMlhpFFHBckzrpVXD2K/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506');&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;Visual Studio Code - Code Editing. Redefined&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.&amp;nbsp; Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;미러사이트 카카오로 변경하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu는 패키지 참조 사이트를 &lt;b&gt;/etc/apt/sources.list&lt;/b&gt; 에서 관리한다.&lt;/p&gt;
&lt;pre id=&quot;code_1694236460981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo vi /etc/apt/sources.list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 &lt;b&gt;kr.archive.ubuntu.com&lt;/b&gt; 경로를 &lt;b&gt;mirror.kakao.com&lt;/b&gt; 으로 변경해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1694236485445&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;:%s/kr.archive.ubuntu.com/mirror.kakao.com/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 아래 명령어를 터미널에서 실행하여 변경해 줄 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1694237365940&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo sed -i 's/kr.archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후 업데이트 실시&lt;/p&gt;
&lt;pre id=&quot;code_1694236517923&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sudo apt update&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Linux</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/696</guid>
      <comments>https://sonseungha.tistory.com/696#entry696comment</comments>
      <pubDate>Sat, 9 Sep 2023 14:16:19 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Ubuntu에서 Ubuntu 22.04 설치 USB 만들기</title>
      <link>https://sonseungha.tistory.com/695</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Ubuntu Image 다운로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 Ubuntu 22.04.3 LTS Desktop 버전을 다운로드 하였습니다. 다운로드 경로는 아래입니다.&lt;/p&gt;
&lt;figure id=&quot;og_1694228151386&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;Download Ubuntu Desktop | Download | Ubuntu&quot; data-og-description=&quot;Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.&quot; data-og-host=&quot;ubuntu.com&quot; data-og-source-url=&quot;https://ubuntu.com/download/desktop&quot; data-og-url=&quot;https://ubuntu.com/download/desktop&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nTWfN/hyTSzUoPyt/BKCIj3xGLSgkfLeku7reM1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/desktop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ubuntu.com/download/desktop&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nTWfN/hyTSzUoPyt/BKCIj3xGLSgkfLeku7reM1/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&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;Download Ubuntu Desktop | Download | Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu.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;h3 data-ke-size=&quot;size23&quot;&gt;2. USB Creator 프로그램 설치하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;usb-creator-gtk 프로그램을 이용하여 설치 USB를 만들어 보려 합니다. 터미널에서 usb-creator-gtk를 설치해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694228197732&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install usb-creator-gtk
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  dmidecode dosfstools e2fsprogs e2fsprogs-l10n eject fdisk fuse gdisk genisoimage gir1.2-dbusmenu-glib-0.4 gir1.2-dee-1.0 gir1.2-gudev-1.0 gir1.2-udisks-2.0 gir1.2-unity-5.0 libatasmart4 libblockdev-crypto2 libblockdev-fs2 libblockdev-loop2 libblockdev-part-err2
  libblockdev-part2 libblockdev-swap2 libblockdev-utils2 libblockdev2 libdee-1.0-4 libext2fs2 libfdisk1 libfuse2 libgpgme11 libntfs-3g883 libparted-fs-resize0 libparted2 libss2 libunity-protocol-private0 libunity-scopes-json-def-desktop libunity9 libvolume-key1 logsave
  mtools ntfs-3g parted python3-debian syslinux syslinux-common syslinux-legacy udisks2 usb-creator-common
Suggested packages:
  gpart fuse2fs e2fsck-static cdtool setcd wodim cdrkit-doc libparted-dev libparted-i18n unity-common floppyd parted-doc exfat-utils btrfs-progs f2fs-tools mdadm libblockdev-mdraid2 nilfs-tools reiserfsprogs xfsprogs udftools udisks2-bcache udisks2-btrfs udisks2-lvm2
  udisks2-vdo udisks2-zram
The following NEW packages will be installed:
  dmidecode dosfstools e2fsprogs e2fsprogs-l10n eject fdisk fuse gdisk genisoimage gir1.2-dbusmenu-glib-0.4 gir1.2-dee-1.0 gir1.2-gudev-1.0 gir1.2-udisks-2.0 gir1.2-unity-5.0 libatasmart4 libblockdev-crypto2 libblockdev-fs2 libblockdev-loop2 libblockdev-part-err2
  libblockdev-part2 libblockdev-swap2 libblockdev-utils2 libblockdev2 libdee-1.0-4 libext2fs2 libfdisk1 libfuse2 libgpgme11 libntfs-3g883 libparted-fs-resize0 libparted2 libss2 libunity-protocol-private0 libunity-scopes-json-def-desktop libunity9 libvolume-key1 logsave
  mtools ntfs-3g parted python3-debian syslinux syslinux-common syslinux-legacy udisks2 usb-creator-common usb-creator-gtk
0 upgraded, 47 newly installed, 0 to remove and 4 not upgraded.
Need to get 5,322 kB of archives.
After this operation, 19.5 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 설치 USB 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;usb-creator-gtk를 실행시키면, 아래와 같이 자동으로 USB와 ISO 이미지 파일을 인식합니다. 만약 다른 이미지를 원한다면 Other 버튼으로 새로운 이미지를 등록해 줍니다. 이 프로그램은 USB를 별도로 포맷할 필요도 없어 매우 빠르고 간편하게 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzpgx2/btstx6D7TG1/BWJXW9YP2qzbSsbEuq0Vy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzpgx2/btstx6D7TG1/BWJXW9YP2qzbSsbEuq0Vy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzpgx2/btstx6D7TG1/BWJXW9YP2qzbSsbEuq0Vy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzpgx2%2Fbtstx6D7TG1%2FBWJXW9YP2qzbSsbEuq0Vy0%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;602&quot; height=&quot;454&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;454&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8SWv/btstxoyieE1/2LqMk5myQXN9em10JqAik0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8SWv/btstxoyieE1/2LqMk5myQXN9em10JqAik0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8SWv/btstxoyieE1/2LqMk5myQXN9em10JqAik0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8SWv%2FbtstxoyieE1%2F2LqMk5myQXN9em10JqAik0%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;826&quot; height=&quot;133&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Ubuntu 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 설치 USB를 이용하여 Ubuntu를 설치해줍니다! 끝!&lt;/p&gt;</description>
      <category>Linux</category>
      <category>ubuntu</category>
      <category>USB</category>
      <category>설치</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/695</guid>
      <comments>https://sonseungha.tistory.com/695#entry695comment</comments>
      <pubDate>Sat, 9 Sep 2023 11:54:30 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Sliding Window</title>
      <link>https://sonseungha.tistory.com/694</link>
      <description>&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def sliding_window(series, window_size, step = 1):
    &amp;quot;&amp;quot;&amp;quot;series is a column of a dataframe&amp;quot;&amp;quot;&amp;quot;
    for start_row in range(0, len(series) - window_size + 1, step):
        yield series[start_row:start_row + window_size]

tmp = np.arange(100)
list(sliding_window(tmp, 10, 5))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위의 코드를 실행하면 0부터 99까지의 데이터를 10개씩 5개씩 이동하면서 데이터를 만들어낸다. 결과는 아래와 같다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14]),
 array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
 array([15, 16, 17, 18, 19, 20, 21, 22, 23, 24]),
 array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),
 array([25, 26, 27, 28, 29, 30, 31, 32, 33, 34]),
 array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39]),
 array([35, 36, 37, 38, 39, 40, 41, 42, 43, 44]),
 array([40, 41, 42, 43, 44, 45, 46, 47, 48, 49]),
 array([45, 46, 47, 48, 49, 50, 51, 52, 53, 54]),
 array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59]),
 array([55, 56, 57, 58, 59, 60, 61, 62, 63, 64]),
 array([60, 61, 62, 63, 64, 65, 66, 67, 68, 69]),
 array([65, 66, 67, 68, 69, 70, 71, 72, 73, 74]),
 array([70, 71, 72, 73, 74, 75, 76, 77, 78, 79]),
 array([75, 76, 77, 78, 79, 80, 81, 82, 83, 84]),
 array([80, 81, 82, 83, 84, 85, 86, 87, 88, 89]),
 array([85, 86, 87, 88, 89, 90, 91, 92, 93, 94]),
 array([90, 91, 92, 93, 94, 95, 96, 97, 98, 99])]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Language/Python</category>
      <category>python</category>
      <category>Sliding window</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/694</guid>
      <comments>https://sonseungha.tistory.com/694#entry694comment</comments>
      <pubDate>Thu, 24 Aug 2023 11:57:13 +0900</pubDate>
    </item>
    <item>
      <title>[분석통계] 정규성 검정</title>
      <link>https://sonseungha.tistory.com/693</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정규성 검정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규성 검정은 3가지 방법으로 검정을 진행한다. 검정 방법은 시각화 또는 가설 검정을 이용한 방법으로 나뉜다. 가설검정을 이용 시 귀무가설 '$H_{0}$는 모집단의 분포는 정규분포이다' 가 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Q-Q Plot
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시각화를 이용한 정규성 검정방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Shapiro-Wilks Test&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685314588105&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from scipy import stats
stats.shapiro(df)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kolmogorov-Smirnov Test (KS-Test)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KS-Test 는 누적분포함수를 비교하는 방법이다.&lt;/li&gt;
&lt;li&gt;따라서 이론정규분포와 표본의 누적분포함수(cdf)를 비교한다.&lt;/li&gt;
&lt;li&gt;아래 코드에서 주의할 점은 kstest 전 데이터를 표준화 전처리가 필수적으로 수행되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685314789214&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from scipy import stats
data = (df - df.mean()) / df.std()
stats.kstest(data, stats.norm.cdf)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>AI/Data Science</category>
      <category>KStest</category>
      <category>Shapiro</category>
      <category>모집단</category>
      <category>정규성검정</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/693</guid>
      <comments>https://sonseungha.tistory.com/693#entry693comment</comments>
      <pubDate>Mon, 29 May 2023 08:00:53 +0900</pubDate>
    </item>
    <item>
      <title>[분석통계] 통계적 검정 방법 간단 정리</title>
      <link>https://sonseungha.tistory.com/692</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1개의 모집단에 관한 검정&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1개의 샘플 내에서의 모집단의 평균에 관한 검정 (One-sampel T-test)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;scipy.stat.ttest_1sample() 사용&lt;/li&gt;
&lt;li&gt;alternative 변수에 greater(우측검정), less(좌측검정), two-sided(양측검정) 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685163606728&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from scipy import stats
stats.ttest_1sample(data, popmean = mu, alternative = 'two-sided')&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;ul 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;li&gt;비율은 근사적 정규분포를 따르기에 Z-test를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685165378189&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from statsmodels.stats.proportion import sms
sms.proportions_ztest(count, nobs=n, 
                      value = 귀무가설의 p,
                      prop_value = 분산계산에 사용된 p,
                      alternative='larger')&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1개의 샘플 내에서의 모집단의 분산에 관한 검정&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모집단이 정규분포를 따르는 경우&lt;/li&gt;
&lt;li&gt;모집단 $\sigma^2$ 에 관한 검정&lt;/li&gt;
&lt;li&gt;분산에 관한 검정은 카이제곱 검정을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685169382703&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import scipy.stats as stats

# 임계값 계산
stats.chi2.ppf(0.95, df)

# p-value 계산 (우측검정인 경우)
1 - stats.chi2.cdf(검정통계량, df)
# 검정통계량 =  (n - 1) * (표준편차^2 / 분산)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2개의 모집단에 관한 검정&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;두 모집단의 모평균 검정 (모집단이 등분산인 경우)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 모집단의 각 모평균$\mu_{1}, \mu_{2}$ 차이에 관한 검정&lt;/li&gt;
&lt;li&gt;두 분산이 동일한 경우에 사용한다 (등분산) -&amp;gt; 서로 독립&lt;/li&gt;
&lt;li&gt;$\mu_{1} - \mu_{2}$에 관한 추론을 추정량 ($\overline{X_{1}} - \overline{X_{2}}$)의 표본분포를 이용&lt;/li&gt;
&lt;li&gt;T = $\frac{( \overline{X_{1}} - \overline{X_{2}})}{\ \sqrt{S^2_{p}(\frac{1}{n_{1}} + \frac{1}{n_{2}})}} $&lt;/li&gt;
&lt;li&gt;여기서 $S^2_{p}&amp;nbsp;=&amp;nbsp;\frac{(n_{1}&amp;nbsp;-&amp;nbsp;1)S^2_{1}+(n_{2}&amp;nbsp;-&amp;nbsp;1)S^2_{2}}{n_{1}&amp;nbsp;+&amp;nbsp;n_{2}&amp;nbsp;-&amp;nbsp;2}$&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685254445082&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 statsmodels.stats.api as sms
import scipy.stats as stats

df1.mean()
df1.var()

n1 = len(df1)
n2 = len(df2)
Sp = ((n1 - 1) * df1.var() + (n2 - 1) * df2.var()) / (n1 + n2 - 2)

t = (df1.mean() - df2.mean()) / np.sqrt(Sq * (1/n1 + 1/n2))

# p -value
2 * (1-stats.t.cdf(0.9273, df = n1 + n2 -2)
# 임계값
stats.t.ppf(0.975, df = n1 + n2 - 2)


# 또는

stats.ttest_ind(df1, df2, equal_var = True, alternative='two-sided')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;두 모집단의 모평균 검정 (모집단이 이분산인 경우)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개의 모집단의 각 모평균$\mu_{1}, \mu_{2}$ 차이에 관한 검정&lt;/li&gt;
&lt;li&gt;두 분산이 동일하지 않은 경우에 사용한다 (이분산)&lt;/li&gt;
&lt;li&gt;두 모집단이 정규분포이고, 모분산 $\sigma_{0}^2, \sigma_{1}^2$이 알려지지 않고 서로 다른 경우이다.&lt;/li&gt;
&lt;li&gt;비교할 두 표본의 값의 크기가 다르고, 결측치가 있는 경우 nan_policy 파라미터 사용하여 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685255239394&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stats.ttest_ind(df1, df2, equal_var=False, alternative='less', nan_policy='omit')&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;등분산 검정&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모집단 평균 검정 시 등분산, 이분산 여부를 모르기에 등분산 검정 시행 후에 나온 결과로 등산분 또는 이분산 모집단 평균 검정을 시행하자.&lt;/li&gt;
&lt;li&gt;$H_{0} : \frac{\sigma^2_{1}}{\sigma^2_{2}} = 1$ (등분산)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;귀무가설 채택 시, 모집단이 등분산인 경우의 모평균 검정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$H_{1} : \frac{\sigma^2_{1}}{\sigma^2_{2}} \neq 1$ (이분산)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대립가설 채택 시, 모집단이 이분산인 경우의 모평균 검정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;F-검정을 사용, $F = \frac{S^2_{1}}{S^2_{2}}$&lt;/li&gt;
&lt;li&gt;자유도 $v_{1} = n_{1} - 1, v_{2} = n_{2} - 1 $&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1685258330267&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f = data['A'].var() / data['B'].var()
df1 = data['A'].count() - 1
df2 = data['B'].count() - 1
stats.f.cdf(f, df1, df2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; 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;위의 모든 모델들은 모집단이 정규분포 라는 가정 하에 진행이 된다. 하지만 실제 정규분포인지 아닌지는 모르는 상황이다. 실제로 정규분포인지 확인하기 위한 정규성 검정을 진행한다.&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;Q-Q plot&lt;/li&gt;
&lt;li&gt;Shapiro-Wilks Test&lt;/li&gt;
&lt;li&gt;Kolmogorov-Smirnov Test (KS-Test)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 방법의 사용법은 아래 링크를 참고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sonseungha.tistory.com/693&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.05.29 - [AI/Data Science (실습)] - [분석통계] 정규성 검정&lt;/a&gt;&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <category>F-검정</category>
      <category>t-test</category>
      <category>t-검정</category>
      <category>등분산</category>
      <category>모집단</category>
      <category>이분산</category>
      <category>정규성검정</category>
      <category>평균검정</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/692</guid>
      <comments>https://sonseungha.tistory.com/692#entry692comment</comments>
      <pubDate>Sat, 27 May 2023 14:08:20 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Poetry - Jupyter</title>
      <link>https://sonseungha.tistory.com/691</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/07Biy/btshqr85UXF/I62XNksRRkKUTJcEhOjyw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/07Biy/btshqr85UXF/I62XNksRRkKUTJcEhOjyw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/07Biy/btshqr85UXF/I62XNksRRkKUTJcEhOjyw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F07Biy%2Fbtshqr85UXF%2FI62XNksRRkKUTJcEhOjyw1%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;811&quot; height=&quot;387&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Poetry는 파이썬 개발 시 의존성 관리와 패키징을 위한 툴이다. pip와 venv를 통해 프로젝트의 가상환경을 자동으로 생성하고 의존성을 관리해줌으로써 개발용이성을 향상시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여러 개발자가 동일한 환경에서 개발할 수 있도록 지원을 한다. 따라서 개발자의 머신에서 Global로 설치된 의존성이 아닌 프로젝트에 필요한 버전의 의존성을 동일하게 유지해 준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래 전체적인 흐름을 정리한 그림이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkqdF/btshyetwwYD/yxiZFUe4avhCADuIIKJzm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkqdF/btshyetwwYD/yxiZFUe4avhCADuIIKJzm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkqdF/btshyetwwYD/yxiZFUe4avhCADuIIKJzm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlkqdF%2FbtshyetwwYD%2FyxiZFUe4avhCADuIIKJzm0%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;860&quot; height=&quot;935&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 흐름에 맞춰서 하나씩 정리해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Poetry 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poetry를 사용하기 위해 설치가 필요하다. 나는 1.4.2 버전이 설치된 상태이다.&lt;/p&gt;
&lt;pre id=&quot;code_1685078332265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install poetry
$ poetry -V
Poetry (version 1.4.2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 프로젝트에 poetry 초기화 하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$poetry init$ 명령어를 사용하여 초기화를 진행한다. 나는 모든 설정을 기본으로 설정하였고, 초기화가 완료되면 pyproject.toml 파일이 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685078433835&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$poetry init

This command will guide you through creating your pyproject.toml config.

Package name [test]:  
Version [0.1.0]:  
Description []:  
Author [Seungha Son &amp;lt;linuxias@gmail.com&amp;gt;, n to skip]:  
License []:  
Compatible Python versions [^3.8]:  

Would you like to define your main dependencies interactively? (yes/no) [yes] 
You can specify a package in the following forms:
  - A single name (requests): this will search for matches on PyPI
  - A name and a constraint (requests@^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Package to add or search for (leave blank to skip): 

Would you like to define your development dependencies interactively? (yes/no) [yes] 
Package to add or search for (leave blank to skip): 

Generated file

[tool.poetry]
name = &quot;test&quot;
version = &quot;0.1.0&quot;
description = &quot;&quot;
authors = [&quot;Seungha Son &amp;lt;linuxias@gmail.com&amp;gt;&quot;]
readme = &quot;README.md&quot;

[tool.poetry.dependencies]
python = &quot;^3.8&quot;


[build-system]
requires = [&quot;poetry-core&quot;]
build-backend = &quot;poetry.core.masonry.api&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 의존성 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음으로 poetry install을 사용하여 의존성을 설치하게 되면, 자동으로 가상환경이 생성된다.&amp;nbsp; poetry env list 명령어로 확인 시 가상환경이 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1685078619570&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$Project/test  poetry install
Creating virtualenv test-_ESsOsQl-py3.8 in /home/linuxias/.cache/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (0.1s)

Writing lock file
$poetry env list
test-_ESsOsQl-py3.8 (Activated)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 의존성을 설치하는 방법은 2가지 이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pyproject.toml을 직접 수정한 후 poetry install&lt;/li&gt;
&lt;li&gt;poetry add 명령어를 사용하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 poetry add를 사용한 방식만 정리한다. numpy와 pandas를 설치해보자. numpy는 버전을 명시하지 않고 설치하고 pandas는 버전을 1.5.2로 명시하고 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685078780561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$poetry add numpy
Using version ^1.24.3 for numpy

Updating dependencies
Resolving dependencies... (0.1s)

Writing lock file

Package operations: 1 install, 0 updates, 0 removals

  &amp;bull; Installing numpy (1.24.3)
 
 
 $poetry add pandas==1.5.2

Updating dependencies
Resolving dependencies... (0.1s)

Writing lock file

Package operations: 4 installs, 0 updates, 0 removals

  &amp;bull; Installing six (1.16.0)
  &amp;bull; Installing python-dateutil (2.8.2)
  &amp;bull; Installing pytz (2023.3)
  &amp;bull; Installing pandas (1.5.2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치를 진행하면 해당 패키지가 필요로한 의존성이 자동 설치된다. 이 때 pyproject.toml 파일을 다시 한번 살펴보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전을 명시하지 않은 numpy는 버전앞에 ^ 가 prefix로 존재하고, 특정 버전을 명시한 pandas의 경우에는 ^가 없이 1.5.2 버전명만 명시가 되어 있다. 2가지의 차이는 무엇일까?&lt;/p&gt;
&lt;pre id=&quot;code_1685078837253&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[tool.poetry.dependencies]
python = &quot;^3.8&quot;
numpy = &quot;^1.24.3&quot;
pandas = &quot;1.5.2&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;^(캐럿)&lt;span style=&quot;color: #353535; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;의 의미는 ( &amp;gt;= 1.24.3, &amp;lt; 2.0.0) 의 의미입니다. 즉&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;2.9999....99999&lt;span style=&quot;color: #353535; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버전까지도 설치가 된다는 얘기입니다. 즉 numpy의 버전을 최소 1.24.3 버전부터, 2.0.0 버전 내에서 의존성을 관리해준다는 것입니다. Major 버전은 두고, Minor, Release 버전의 변경을 통한 의존성은 관리해준다는 의미입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #353535;&quot;&gt;특정 버전을 명시하게되면 이러한 ^(캐럿)이 추가되지 않습니다. Major.Minor.Release 버전이 고정된 상태에서 의존성을 관리하게 됩니다.&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;Poetry + Jupyter notebook&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Poetry 가상환경에서 Jupyter Kernel을 생성하고, Jupyter notebook 을 실행해 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1685079920929&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ poetry shell
Spawning shell within /home/linuxias/.cache/pypoetry/virtualenvs/test-_ESsOsQl-py3.8

(test-py3.8)  $poetry run ipython kernel install --user --name=&quot;test-jupyter-kernel&quot;
Installed kernelspec test-jupyter-kernel in /home/linuxias/.local/share/jupyter/kernels/test-jupyter-kernel

(test-py3.8)  $poetry run jupyter-notebook&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;poetry shell로 가상환경에 접속하고, 새로운 jupyter kernel을 생성한다. 그 이후에 jupyter-notebook을 실행시켜주면 완료!&lt;/p&gt;</description>
      <category>Language/Python</category>
      <category>Dependency</category>
      <category>poetry</category>
      <category>python</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/691</guid>
      <comments>https://sonseungha.tistory.com/691#entry691comment</comments>
      <pubDate>Fri, 26 May 2023 14:46:38 +0900</pubDate>
    </item>
    <item>
      <title>[MLflow] MLflow Project와 Model의 차이</title>
      <link>https://sonseungha.tistory.com/690</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MLflow 에서 제공하는 기능 중 Project와 Model의 정확한 차이를 이해하지 못하는 분들이 간혹 있다. 처음 접하게 되면 차이가 어려울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project와 Model 모두 패키징을 제공하는 방법 같은데 왜 나뉘어져 있는지 의문이 들 수 있을 것 이다. 그래서 간략하게 정리해 보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MLflow Project&lt;/b&gt;는 재사용 가능한 데이터 사이언스 코드의 패키징을 위한 표준 포맷이다. 이해하기 어려운 설명 같다. 좀 더 상세히 설명해 보면, 각 Project는 단순히 코드 또는 Git repository가 있는 디렉토리이며, 디스크립터 파일 또는 단순한 규칙을 사용하여 종속성과 코드 실행방법을 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 데이터 과학 또는 기계학습 프로젝트와 관련된 코드를 패키징하는 표준화된 방법이다. 예를 들어 데이터를 전처리하고 모델을 훈련하는 워크플로우(예를 들어 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파이썬 Conda 환경을 지정하기 위한 conda.yaml 파일 등&lt;/span&gt;)가 있는 경우 이를 MLProject 파일에 명세하여 패키징할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 프로젝트에서 MLflow Tracking API를 사용하는 경우 MLflow는 프로젝트 버전 및 모든 매개 변수를 자동으로 저장한다. Github 또는 자체 Git repository에서 기존 MLflow 프로젝트를 쉽게 실행하고 다단계의 워크플로우에 연결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MLflow Model&lt;/b&gt;은 머신 러닝 모델을 다양한 방식으로 패키징하는 규칙과 이를 배포하는데 도움이 되는 다양한 도구를 제공한다. 머신 러닝 모델을 다양한 방식으로 패키징하는 규칙과 이를 배포하는 데 도움이 되는 다양한 도구를 제공한다. 각 모델은 임의의 파일과 모델을 사용할 수 있는 여러 &lt;b&gt;Flavors&lt;/b&gt;을 나열하는 디스크립션 파일을 포함하는 디렉토리로 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 TensorFlow 모델은 TensorFlow DAG로 로드하거나 Python 함수로 로드하여 입력에 적용할 수 있다. MLflow는 다양한 플랫폼에 많은 공통된 모델 유형을 배포할 수 있는 도구를 제공한다. 예를 들어 &quot;Python 기능&quot;을 지원하는 모든 모델을 Docker 기반 REST 서버, Azure ML 및 AWS SageMaker와 같은 클라우드 플랫폼에 배포할 수 있다. 배치 및 스트리밍 추론을 위한 Apache Spark의 사용자 정의 함수. 추적 API를 사용하여 MLflow 모델을 출력하는 경우 MLflow는 자동으로 해당 모델이 어떤 프로젝트 및 실행에서 왔는지 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyToach 와 같은 ML 프레임워크를 사용하고 싶지만 이 모델을 어떻게 배포해야할지 어려운 상황이라 하면, Model을 이용하여 모델을 쉽게 배포할 수 있다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MLflow Model:&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLflow&amp;nbsp;Model은&amp;nbsp;기계&amp;nbsp;학습&amp;nbsp;모델을&amp;nbsp;패키징하고&amp;nbsp;관리하는&amp;nbsp;데&amp;nbsp;사용되는&amp;nbsp;표준&amp;nbsp;형식입니다.&amp;nbsp;MLflow&amp;nbsp;Model은&amp;nbsp;모델&amp;nbsp;아티팩트와&amp;nbsp;모델&amp;nbsp;메타데이터로&amp;nbsp;구성됩니다.&amp;nbsp;모델&amp;nbsp;아티팩트는&amp;nbsp;학습된&amp;nbsp;모델&amp;nbsp;자체를&amp;nbsp;나타내며,&amp;nbsp;여러&amp;nbsp;형식(flavor)으로&amp;nbsp;저장될&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;flavor는&amp;nbsp;다른&amp;nbsp;하위&amp;nbsp;도구에서&amp;nbsp;모델을&amp;nbsp;이해하고&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;지원합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;TensorFlow,&amp;nbsp;PyTorch,&amp;nbsp;Scikit-learn&amp;nbsp;등과&amp;nbsp;같은&amp;nbsp;다양한&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;/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;MLflow Project:&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLflow&amp;nbsp;Project는&amp;nbsp;코드,&amp;nbsp;데이터&amp;nbsp;및&amp;nbsp;환경&amp;nbsp;설정을&amp;nbsp;포함하는&amp;nbsp;기계&amp;nbsp;학습&amp;nbsp;프로젝트의&amp;nbsp;논리적&amp;nbsp;단위입니다.&amp;nbsp;MLflow&amp;nbsp;Project는&amp;nbsp;반복&amp;nbsp;가능하고&amp;nbsp;재현&amp;nbsp;가능한&amp;nbsp;학습과&amp;nbsp;추론을&amp;nbsp;위한&amp;nbsp;프로젝트&amp;nbsp;디렉토리&amp;nbsp;구조를&amp;nbsp;정의합니다.&amp;nbsp;일반적으로&amp;nbsp;프로젝트&amp;nbsp;디렉토리에는&amp;nbsp;코드&amp;nbsp;파일,&amp;nbsp;학습에&amp;nbsp;사용되는&amp;nbsp;데이터&amp;nbsp;파일,&amp;nbsp;모델을&amp;nbsp;빌드하고&amp;nbsp;학습시키는&amp;nbsp;데&amp;nbsp;필요한&amp;nbsp;환경&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;등이&amp;nbsp;포함됩니다.&amp;nbsp;이러한&amp;nbsp;프로젝트&amp;nbsp;디렉토리를&amp;nbsp;MLflow에&amp;nbsp;등록하면,&amp;nbsp;다른&amp;nbsp;사용자가&amp;nbsp;동일한&amp;nbsp;환경에서&amp;nbsp;프로젝트를&amp;nbsp;재현하고&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;MLflow&amp;nbsp;Project는&amp;nbsp;로컬&amp;nbsp;환경에서&amp;nbsp;실행될&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;클라우드나&amp;nbsp;클러스터&amp;nbsp;환경에서&amp;nbsp;실행될&amp;nbsp;수도&amp;nbsp;있습니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;요약하자면,&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLflow&amp;nbsp;Model은&amp;nbsp;학습된&amp;nbsp;모델을&amp;nbsp;패키징하고&amp;nbsp;관리하는&amp;nbsp;데&amp;nbsp;사용되는&amp;nbsp;형식이며,&amp;nbsp;다양한&amp;nbsp;하위&amp;nbsp;도구에서&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;모델&amp;nbsp;&quot;flavor&quot;로&amp;nbsp;저장됩니다.&amp;nbsp;반면에,&amp;nbsp;MLflow&amp;nbsp;Project는&amp;nbsp;코드,&amp;nbsp;데이터&amp;nbsp;및&amp;nbsp;환경&amp;nbsp;설정을&amp;nbsp;포함하는&amp;nbsp;기계&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;/p&gt;</description>
      <category>AI/MLOps</category>
      <category>mlflow</category>
      <category>model</category>
      <category>project</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/690</guid>
      <comments>https://sonseungha.tistory.com/690#entry690comment</comments>
      <pubDate>Sun, 21 May 2023 23:08:31 +0900</pubDate>
    </item>
    <item>
      <title>[ANOVA] 일원 / 이원분산분석 해보기 (상호작용항)</title>
      <link>https://sonseungha.tistory.com/689</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 이론은 다루지 않습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;일원분산분석 (One-way ANOVA)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일원분산분석에서 등분산 검정은 sklearn에 포함된 $bartlett()$을 이용하여 구할 수 있다. $bartlett()$ 함수의 시그니처는 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1681916668701&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Signature: bartlett(*samples)
Docstring:
Perform Bartlett's test for equal variances.

Bartlett's test tests the null hypothesis that all input samples
are from populations with equal variances.  For samples
from significantly non-normal populations, Levene's test
`levene` is more robust.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;$bartlett()$은 t-test 검정을 다룰 때 많이 사용된다. $ttest_ind()$ 사용 시 등분산 여부를 입력하게 되는데 (파라미터 equal_var) 이때 모집단의 등분산 검정을 $bartlett()$의 결과를 해석하여 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약 $bartlett()$ 의 p-value가 유의수준 0.05를 넘지 못한다면, $H_{0}$ 귀무가설이 채택되어 등분산이라 판단할 수 있다.&amp;nbsp;&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;이원분산분석 (Two-way ANOVA)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요인이&lt;span&gt;&amp;nbsp;&lt;/span&gt;두개 이상이고 그룹이 두개 이상인 경우이다. 요인간의 상호작용이 있는지 확인하고, &lt;span&gt;&amp;nbsp;&lt;/span&gt;상호작용이 없을시&lt;span&gt;&amp;nbsp;&lt;/span&gt;일원분산분석을 각각의 요인에 대해 수행한다. 일원분산분석처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;statsmodels.formula.api.ols, statsmodels.stats.anova.anova_lm&lt;/span&gt;을 통해 측정 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립변수 : C_var1, C_var2 (모두 범주형 변수)&lt;/li&gt;
&lt;li&gt;종속변수 : target&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 코드를 이용하여 이원분산분석, 그 중에서 상호작용항의 정보를 구할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681917021910&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from statsmodels.formula.api import ols
from statsmodels.api import stats

model = ols('target ~ C(C_var1) + C(C_var2) + C(C_var1):C(C_var2)', df).fit()
stats.anova_lm(model)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 코드에서 C_var1과 C_var2 변수를 C로 감싼 것은 범주형 변수라는 것을 알려주는 것이다. 만약 범주형 변수에 C 로 감싸주지 않는다면 잘못된 값을 얻을 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 코드를 실행하면 아래와 같은 결과를 얻을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qHM8k/btsbqB2oaVy/cr0R38xwq4eRywxh8HrCLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qHM8k/btsbqB2oaVy/cr0R38xwq4eRywxh8HrCLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qHM8k/btsbqB2oaVy/cr0R38xwq4eRywxh8HrCLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqHM8k%2FbtsbqB2oaVy%2Fcr0R38xwq4eRywxh8HrCLk%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;555&quot; height=&quot;152&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;index에 상호작용항 $C(C_var1):C(C_var2)$ 를 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <category>anova</category>
      <category>상호작용항</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/689</guid>
      <comments>https://sonseungha.tistory.com/689#entry689comment</comments>
      <pubDate>Thu, 20 Apr 2023 00:14:16 +0900</pubDate>
    </item>
    <item>
      <title>[Pandas] 여러 Column 동시에 추가하기 (assign)</title>
      <link>https://sonseungha.tistory.com/688</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;보통 pandas에서 여러 개의 컬럼을 추가하는 방법으로 다양한 방법이 사용된다. 가장 단순한 방법을 열을 하나씩 선언해주며 추가하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1681911287195&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

data = [1,2,3,4], [5,6,7,8], [9,10,11,12]
df = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
df['Mean'] = df.mean(axis = 1)
df['Std'] = df.std(axis = 1)
df['Max'] = df.max(axis = 1)
df['Min'] = df.min(axis = 1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 코드의 수행 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcEYpV/btsblzkuVlg/pqdxQwYqVNOzNO8CIU9oF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcEYpV/btsblzkuVlg/pqdxQwYqVNOzNO8CIU9oF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcEYpV/btsblzkuVlg/pqdxQwYqVNOzNO8CIU9oF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcEYpV%2FbtsblzkuVlg%2FpqdxQwYqVNOzNO8CIU9oF0%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;323&quot; height=&quot;117&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pandas에서 제공하는 $assign$을 이용하면 좀 더 깔끔하게 정리가 된다. (코드 양이 줄어드는 것은 아니다)&lt;/p&gt;
&lt;pre id=&quot;code_1681911349659&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

data = [1,2,3,4], [5,6,7,8], [9,10,11,12]
df = pd.DataFrame([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
df = df.assign(
    Mean = df.mean(axis = 1),
    Std = df.std(axis = 1),
    Max = df.max(axis = 1),
    Min = df.min(axis = 1)
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;$assign()$을 이용하여 좀 더 코드가 깔끔해지고, 명확해진다고 할까? 이러한 방식이 좀 더 가독성 측면에서도 좋아보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결과는 위 와 동일하다.&lt;/p&gt;</description>
      <category>AI/Data Science</category>
      <category>assign</category>
      <category>pandas</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/688</guid>
      <comments>https://sonseungha.tistory.com/688#entry688comment</comments>
      <pubDate>Wed, 19 Apr 2023 22:36:49 +0900</pubDate>
    </item>
    <item>
      <title>가설과 P-Value의 의미</title>
      <link>https://sonseungha.tistory.com/674</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xtIqF/btr4xLdLeGV/POfVuCGAb8CVuUsCpJQMY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xtIqF/btr4xLdLeGV/POfVuCGAb8CVuUsCpJQMY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xtIqF/btr4xLdLeGV/POfVuCGAb8CVuUsCpJQMY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxtIqF%2Fbtr4xLdLeGV%2FPOfVuCGAb8CVuUsCpJQMY0%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;520&quot; height=&quot;301&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리는 많은 상황에서 모집단에 관한 정보를 알지 못한다. 만약 모집단에 대한 정보를 안다면 표본을 추출하고 분석하여 모집단을 추론하는 일은 없을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가설검정도 모집단을 검정할 목적으로 설정하는 모수에 대한 잠정적인 주장이나 가정을 말한다. 표본을 추출하여 분석하는 과정에서 새로운 사실을 발견했을 때 해당 사실이 모집단에서도 적용되는지를 위해 가설을 세우고 검정하는 절차를 지킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;귀무가설과 대립가설&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;가설을 검정할 때 사용되는 가설은 귀무가설과 대립가설로 2가지 이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;귀무가설 (Null Hypothesis)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모집단의 특성에 대해 옳다고 제안하는 잠정적인 주장으로 과거의 경험, 지식 또는 연구의 결과 등 현재까지 이어져오는 인정된 것을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대립가설 (Alternative Hypothesis)&lt;/b&gt;
&lt;ul 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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;예를 들어, 비만과 성인병 유발에 영향을 미치는지 연구자가 연구한다고 할 때, 가설을 귀무가설과 대립가설 2가지로 세우게 된다.&lt;/p&gt;
&lt;ul 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;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 생각하면 대립가설만 가설로 세운 후 사실 여부를 검정하면 될 것이라 판단하는데 왜 귀무가설을 세우고 귀무가설을 기각되면 대립가설이 사실이라고 판단하는 방법을 사용하는 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해당 이유는 '공돌이의 수학정리노트' 블로그에 작성자님께서 매우 잘 정리해주셨다. 사유는 아래와 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;참이 아님을 증명하는 것이 참임을 증명하는 것보다 훨씬 쉽기 때문이다.&lt;/li&gt;
&lt;li&gt;귀무가설을 &amp;ldquo;올바르게&amp;rdquo; 서술하는 것이 대립가설을 &amp;ldquo;정확하게&amp;rdquo; 서술하는 것 보다 실패할 가능성이 적다.&lt;/li&gt;
&lt;li&gt;우리는 모수에 대해서 알 수 없으며, 연구에 있어 주관성이 개입되어선 안되기 때문이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 관점에 있어서 대척점에 서계신 분들이 바로 베이지안 통계학자들이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇다면 이러한 귀무가설이 옳은지 아닌지 어떻게 확인할 수 있을까? 이러한 가설을 검정하기 위해 사용하는 것이 &lt;b&gt;p-value&lt;/b&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;가설검정은 아래와 같은 절차로 검정을 진행을 진행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;귀무가설과 대립가설을 세운다.&lt;/li&gt;
&lt;li&gt;귀무가설이 맞다는 전제하에 절차를 시작한다.&lt;/li&gt;
&lt;li&gt;대립가설에 대한 증거값을 계산한다. (검정통계량)&lt;/li&gt;
&lt;li&gt;두 가지 의사결정이 가능한
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충분한 증거에 의해 대립가설이 옳다고 판단 (Reject $H_{0}$)&lt;/li&gt;
&lt;li&gt;불충분한 증거에 의해 귀무가설 기각 못함 (Don't reject $H_{0}$)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;p-value&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;p-value는 가설검정에 사용되는 value이다. 귀무가설에서 주장한 바가 옳을 확률이 p-value인 것이다. 귀무가설이 참이라는 가정 아래 얻어지는 통계량이 귀무가설을 얼마나 지지하는지를 나타내는 확률 값으로 산출된 p-value가 작을수록 표본이 모수에 대하여 귀무가설을 기각할 증거가 충분하다고 해석할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Xu6C/btr4AWMHBws/Dc2Yqvqh4klwuqaFWfr3Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Xu6C/btr4AWMHBws/Dc2Yqvqh4klwuqaFWfr3Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Xu6C/btr4AWMHBws/Dc2Yqvqh4klwuqaFWfr3Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Xu6C%2Fbtr4AWMHBws%2FDc2Yqvqh4klwuqaFWfr3Z0%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;365&quot; height=&quot;118&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 범위에서 0 ~ 0.05 범위의 p-value는 귀무가설을 기각할, 즉 귀무가설이 참이 아닐 확률이 높은 구간이고, 0.1 ~ 1 범위의 p-value는 귀무가설이 참일 확률이 높은 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇다면 0.05 ~ 0.1 사이의 p-value는 어떻게 해석해야 할까? 해당 구간은 Undeterminded 구간으로 부르며, 주관적인 판단이 필요하다. 만약 p-value가 0.07이라고 하면 본인이 주관적으로 귀무가설을 기각할 확률이 높은 값인지 아닌지 판단하여 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 예시를 확인해보자. 모집단 A에서 10개의 표본을 추출한다. 여기서 귀무가설과 대립가설은 모집단 평균에 관련된 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ5MmO/btr4xivZGCq/Om2OWCzXJFnsaljzODYkwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ5MmO/btr4xivZGCq/Om2OWCzXJFnsaljzODYkwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ5MmO/btr4xivZGCq/Om2OWCzXJFnsaljzODYkwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ5MmO%2Fbtr4xivZGCq%2FOm2OWCzXJFnsaljzODYkwK%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;758&quot; height=&quot;342&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;x1,x1,.. x10까지 총 10개의 표본의 평균을 구한 뒤 검정통계량을 구한다. 이때 구한 검정통계량 값이 얼마나 큰 차이를 나타내는지 아니면 작은 차이를 나타내는지 파악하기 위해 p-value를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;p-value는 특정 분포를 따르게 되는데, 많은 과학자 분들이 p-value는 T-분포를 따른다는 것을 증명하였고, 해당 내용은 여기서 다루지는 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IzNDr/btr4AV78xw1/rHUTjpnHKYTlzeBHnsnBM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IzNDr/btr4AV78xw1/rHUTjpnHKYTlzeBHnsnBM1/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://w7.pngwing.com/pngs/281/694/png-transparent-p-value-statistical-significance-statistics-null-hypothesis-test-statistic-statistical-significance.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IzNDr/btr4AV78xw1/rHUTjpnHKYTlzeBHnsnBM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIzNDr%2Fbtr4AV78xw1%2FrHUTjpnHKYTlzeBHnsnBM1%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;920&quot; height=&quot;486&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://w7.pngwing.com/pngs/281/694/png-transparent-p-value-statistical-significance-statistics-null-hypothesis-test-statistic-statistical-significance.png&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;T-분포를 따르기에 위와 같은 T-분포의 구간에 맞춰 어디서 p-value가 위치하는지 확인하고 그에 따라 귀무가설을 채택할지 기각할지 기준의 값으로 사용한다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tpow70KGTYY&quot;&gt;https://www.youtube.com/watch?v=tpow70KGTYY&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://angeloyeo.github.io/2020/03/25/hypothesis.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://angeloyeo.github.io/2020/03/25/hypothesis.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>AI/Data Science</category>
      <category>p-value</category>
      <category>가설검정</category>
      <category>데이터과학</category>
      <category>확률과통계</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/674</guid>
      <comments>https://sonseungha.tistory.com/674#entry674comment</comments>
      <pubDate>Tue, 11 Apr 2023 23:02:46 +0900</pubDate>
    </item>
    <item>
      <title>[MLflow] #5. MLflow Model Registry</title>
      <link>https://sonseungha.tistory.com/687</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MLflow 플랫폼은 크게 MLflow Tracking, MLflow Projects, MLflow Models, MLflow Model Registry의 컴포넌트로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 그 중 MLflow Tracking 기능에 대해서 정리한다. MLflow Model Registry의 기본적인 기능은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;MLflow Model Registry&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;MLflow 모델의 전체 수명 주기를 공동으로 관리하기 위한 중앙 집중식 모델 스토어, API 및 UI 모음&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;모델 계보(MLflow 실험 및 실행이 모델을 생성함), 모델 버전 관리, 단계 전환(예: 스테이징에서 프로덕션으로) 및 주석을 제공.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 설명하면 $Model Registry$ 는 이름에서 파악이 되듯 모델의 저장소 역할을 한다. 모델은 앞서 설명했지만 간단하게 MLflow 프로젝트의 개별 실행을 통해 생성되는 아티팩트 중 하나인 모델을 저장하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 $Model Registry$에 저장된 모델은 어디서든 쉽게 불러와 사용할 수 있다.&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;Model Registry의 컨셉&lt;/b&gt;&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;Model&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MLflow Model은 $mlflow.&amp;lt;model_flavor&amp;gt;.log_model()$ API를 사용하여 생성된 실험 또는 실행에서 생성된다. 일단 이렇게 모델로 생성이 되어야 Model Registry에 등록할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Registered Model (&lt;/b&gt;&lt;b&gt;등록된 모델)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;등록된 모델은 고유한 이름을 가지며 버전과 스테이지 변환과 관련된 단계, 모델 계보, 기타 메타데이터 등으 포함된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Model Version&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 등록된 모델은 하나 이상의 버전을 가지고 있다. 새로운 모델이 추가되면 버전 1로 등록이 되며, 동일한 모델명을 가진 모델이 추가되면 새로운 버전으로 기존 버전에 1추가하여 등록된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Model Stage&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 개별 모델 버전은 주어진 시간에 하나의 스테이지에 할당될 수 있다. MLflow는 스테이징, 프로덕션 또는 아카이브와 같은 일반적인 사용 사례에 대해 미리 정의된 단계를 제공한다. 한 스테이지에서 다른 스테이지로 모델 버전을 전환할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Annotation and Descriptions&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘 설명, 사용된 데이터 세트 또는 방법론과 같은 팀에 유용한 설명 및 관련 정보를 포함하여 Markdown을 사용하여 최상위 모델 및 각 버전에 개별적으로 주석을 추가할 수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;MLflow Model 등록하기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. mlflow ui 에서 등록하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mlflow run을 통해 예제를 실행한 후 mlflow ui를 들어가면 아래와 같은 화면을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1SkVf/btr8JqoNarp/ntpk4iKDsKFwBt3wOuo5Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1SkVf/btr8JqoNarp/ntpk4iKDsKFwBt3wOuo5Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1SkVf/btr8JqoNarp/ntpk4iKDsKFwBt3wOuo5Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1SkVf%2Fbtr8JqoNarp%2Fntpk4iKDsKFwBt3wOuo5Sk%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;700&quot; height=&quot;560&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;713&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;위 화면 우측 하단에 표기된 Register Model을 클릭하면 방금 학습한 모델을 Model Registry에 등록할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NMmaH/btr8wQiUrEp/hTiqMV6lzLDvWNjkGjjABK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NMmaH/btr8wQiUrEp/hTiqMV6lzLDvWNjkGjjABK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NMmaH/btr8wQiUrEp/hTiqMV6lzLDvWNjkGjjABK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNMmaH%2Fbtr8wQiUrEp%2FhTiqMV6lzLDvWNjkGjjABK%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;700&quot; height=&quot;426&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 등록한 모델은 상단 Models 메뉴에 들어가면 Registered Models 항목으로 볼 수 있다. 방금 등록한 모델이 &lt;b&gt;Vesrion 1&lt;/b&gt;로 등록되어있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/szR1n/btr8H1XLAyr/iUoESwpMwK5vpXbKpoF0QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/szR1n/btr8H1XLAyr/iUoESwpMwK5vpXbKpoF0QK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/szR1n/btr8H1XLAyr/iUoESwpMwK5vpXbKpoF0QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FszR1n%2Fbtr8H1XLAyr%2FiUoESwpMwK5vpXbKpoF0QK%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;700&quot; height=&quot;336&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Version 1&lt;/b&gt;을 클릭해서 들어가보자. 들어가면 &lt;b&gt;Stage&lt;/b&gt;를 &lt;b&gt;Staging, Production, Archived&lt;/b&gt;로 변경할 수 있는 기능을 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s74xG/btr8HLHCK4a/mfJ22dd33qhIKaxlmvZVuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s74xG/btr8HLHCK4a/mfJ22dd33qhIKaxlmvZVuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s74xG/btr8HLHCK4a/mfJ22dd33qhIKaxlmvZVuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs74xG%2Fbtr8HLHCK4a%2FmfJ22dd33qhIKaxlmvZVuk%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;700&quot; height=&quot;412&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. mlflow log_model API 사용하여 등록하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제코드에서 아래와 같이 코드를 수정한다. 등록하려는 모델명을 log_model()의 파라미터로 전달한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680849378822&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@@ -12,5 +12,5 @@ if __name__ == &quot;__main__&quot;:
     score = lr.score(X, y)
     print(&quot;Score: %s&quot; % score)
     mlflow.log_metric(&quot;score&quot;, score)
-    mlflow.sklearn.log_model(lr, &quot;model&quot;)
+    mlflow.sklearn.log_model(lr, &quot;model&quot;, registered_model_name = &quot;Sklearn_LogisticRegression&quot;)
     print(&quot;Model saved in run %s&quot; % mlflow.active_run().info.run_uuid)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 수정한 다음 다시 mlflow를 실행해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1680850328486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mlflow run . --env-manager=local --experiment-name=&quot;regression-test&quot;

2023/04/07 15:51:26 INFO mlflow.projects.utils: === Created directory /tmp/tmpbktorz9c for downloading remote URIs passed to arguments of type 'path' ===
2023/04/07 15:51:26 INFO mlflow.projects.backend.local: === Running command 'python train.py' in run with ID '2f7a52208731481fa5a45e85fcb94b18' === 
Score: 0.6666666666666666
/usr/local/lib/python3.8/dist-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils.
  warnings.warn(&quot;Setuptools is replacing distutils.&quot;)
Registered model 'Sklearn_LogisticRegression' already exists. Creating a new version of this model...
2023/04/07 15:51:29 INFO mlflow.tracking._model_registry.client: Waiting up to 300 seconds for model version to finish creation.                     Model name: Sklearn_LogisticRegression, version 2
Created version '2' of model 'Sklearn_LogisticRegression'.
Model saved in run 2f7a52208731481fa5a45e85fcb94b18
2023/04/07 15:51:29 INFO mlflow.projects: === Run (ID '2f7a52208731481fa5a45e85fcb94b18') succeeded ===&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 아래와 같이 버전이 1에서 2로 변경된 것을 볼 수 있다. 만약 registered_model_name에 전달한 모델명이 기존에 등록된 모델이 아니라면 Version 1으로 등록된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bigA5x/btr8Imnow0r/K9LR1JiRxPdBeBti5gOas1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bigA5x/btr8Imnow0r/K9LR1JiRxPdBeBti5gOas1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bigA5x/btr8Imnow0r/K9LR1JiRxPdBeBti5gOas1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbigA5x%2Fbtr8Imnow0r%2FK9LR1JiRxPdBeBti5gOas1%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;700&quot; height=&quot;350&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;447&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. mlflow register_model() API 사용하여 등록하기&lt;/b&gt;&lt;/h4&gt;</description>
      <category>AI/MLOps</category>
      <author>Linuxias</author>
      <guid isPermaLink="true">https://sonseungha.tistory.com/687</guid>
      <comments>https://sonseungha.tistory.com/687#entry687comment</comments>
      <pubDate>Fri, 7 Apr 2023 09:38:48 +0900</pubDate>
    </item>
  </channel>
</rss>