<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>move84</title>
    <link>https://move84s.tistory.com/</link>
    <description>move84s 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 26 May 2026 10:38:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>move84</managingEditor>
    <item>
      <title>머신러닝: 공분산(Covariance) 완벽 이해</title>
      <link>https://move84s.tistory.com/778</link>
      <description>&lt;p&gt;머신러닝과 통계학에서 공분산은 두 변수 간의 관계를 나타내는 중요한 지표다. 이 글에서는 공분산의 정의, 계산 방법, 그리고 실제 데이터 분석에서 어떻게 활용되는지를 자세히 설명한다. 공분산을 통해 데이터의 숨겨진 패턴을 발견하고, 더 나아가 예측 모델의 성능을 향상시키는 방법을 알아본다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  공분산(Covariance)이란?&lt;/strong&gt;&lt;br&gt;공분산은 두 개의 확률변수가 함께 변하는 정도를 나타내는 통계적 척도다. 즉, 한 변수가 변할 때 다른 변수가 어떤 경향성을 보이는지를 측정한다. 공분산 값이 양수면 두 변수는 양의 상관관계를 가지며, 음수면 음의 상관관계를 가진다. 공분산이 0이면 두 변수 간에 선형적인 관계가 없음을 의미한다. 그러나 공분산은 변수들의 스케일에 따라 값이 달라지기 때문에 상관관계의 강도를 직접적으로 비교하기는 어렵다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  공분산 계산 방법&lt;/strong&gt;&lt;br&gt;공분산은 다음과 같은 수식으로 계산한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모집단 공분산: cov(X, Y) = Σ [(Xi - μX)(Yi - μY)] / N&lt;/li&gt;
&lt;li&gt;표본 공분산: cov(X, Y) = Σ [(Xi - X̄)(Yi - Ȳ)] / (n-1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;X, Y는 각각 확률변수를 나타낸다.&lt;/li&gt;
&lt;li&gt;Xi, Yi는 각 변수의 개별 데이터 포인트를 나타낸다.&lt;/li&gt;
&lt;li&gt;μX, μY는 각 변수의 모집단 평균을 나타낸다.&lt;/li&gt;
&lt;li&gt;X̄, Ȳ는 각 변수의 표본 평균을 나타낸다.&lt;/li&gt;
&lt;li&gt;N은 모집단 크기를 나타낸다.&lt;/li&gt;
&lt;li&gt;n은 표본 크기를 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;표본 공분산을 계산할 때 분모를 (n-1)로 나누는 이유는 불편추정량을 구하기 위해서다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  공분산의 활용 예시&lt;/strong&gt;&lt;br&gt;공분산은 다양한 분야에서 활용된다. 예를 들어, 주식 시장에서 두 주식의 수익률 간의 공분산을 계산하여 투자 포트폴리오를 구성할 수 있다. 또한, 머신러닝에서는 특성(feature) 간의 관계를 파악하여 모델의 성능을 향상시키는 데 사용될 수 있다.&lt;/p&gt;
&lt;p&gt;예를 들어, 광고 지출과 매출 간의 관계를 분석한다고 가정해보자. 광고 지출이 증가함에 따라 매출도 증가하는 경향이 있다면, 광고 지출과 매출 간의 공분산은 양수가 될 것이다. 반대로, 어떤 특정한 변수가 증가함에 따라 다른 변수가 감소하는 경향이 있다면 공분산은 음수가 될 것이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

# 예시 데이터
advertising_spend = np.array([100, 200, 300, 400, 500])  # 광고 지출
sales = np.array([500, 650, 800, 950, 1100])  # 매출

# 공분산 계산
covariance = np.cov(advertising_spend, sales)[0, 1]

print(&amp;quot;공분산:&amp;quot;, covariance)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 광고 지출과 매출 간의 공분산을 계산하는 간단한 예제다. &lt;code&gt;numpy&lt;/code&gt; 라이브러리의 &lt;code&gt;cov&lt;/code&gt; 함수를 사용하여 공분산을 계산할 수 있다. 결과값은 두 변수 간의 관계를 나타내며, 양수인지 음수인지, 그리고 그 크기를 통해 관계의 강도를 파악할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  공분산의 한계와 보완&lt;/strong&gt;&lt;br&gt;공분산은 변수 간의 관계를 파악하는 데 유용하지만, 몇 가지 한계점을 가지고 있다. 가장 큰 문제는 변수들의 스케일에 따라 값이 달라진다는 점이다. 따라서 공분산 값 자체로는 관계의 강도를 직접적으로 비교하기 어렵다.&lt;/p&gt;
&lt;p&gt;이러한 문제를 해결하기 위해 상관계수(correlation coefficient)를 사용한다. 상관계수는 공분산을 각 변수의 표준편차로 나누어 정규화한 값으로, -1과 1 사이의 값을 가진다. 상관계수를 사용하면 변수들의 스케일에 영향을 받지 않고 관계의 강도를 비교할 수 있다.&lt;/p&gt;
&lt;p&gt;상관계수는 다음과 같이 계산된다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상관계수(r) = cov(X, Y) / (σX * σY)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;σX, σY는 각 변수의 표준편차를 나타낸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;공분산 (Covariance): 두 변수가 함께 변하는 정도를 나타내는 통계적 척도&lt;/li&gt;
&lt;li&gt;상관계수 (Correlation Coefficient): 공분산을 정규화하여 변수 간의 관계 강도를 비교하기 쉽게 만든 값&lt;/li&gt;
&lt;li&gt;표준편차 (Standard Deviation): 데이터가 평균으로부터 흩어진 정도&lt;/li&gt;
&lt;li&gt;모집단 (Population): 연구 대상이 되는 전체 집단&lt;/li&gt;
&lt;li&gt;표본 (Sample): 모집단에서 추출한 일부 데이터&lt;/li&gt;
&lt;li&gt;불편추정량 (Unbiased Estimator): 추정량의 기대값이 실제 모수와 일치하는 추정량&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>공분산</category>
      <category>머신러닝</category>
      <category>모집단</category>
      <category>상관계수</category>
      <category>표본</category>
      <category>표준편차</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/778</guid>
      <comments>https://move84s.tistory.com/778#entry778comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:15:15 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝: 선형성과 비선형성의 의미</title>
      <link>https://move84s.tistory.com/777</link>
      <description>&lt;p&gt;머신러닝 모델을 이해하는 데 있어 선형성과 비선형성은 핵심적인 개념이다. 이 두 가지 특성은 모델의 복잡성과 데이터에 대한 적합성에 큰 영향을 미친다. 이 글에서는 선형성과 비선형성의 기본적인 의미를 설명하고, 머신러닝에서 이들이 어떻게 활용되는지 알아본다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  선형성 (Linearity)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;선형성은 입력과 출력 간의 관계가 직선 또는 초평면(hyperplane)으로 표현될 수 있는 특성을 의미한다. 즉, 입력 변수의 변화에 따라 출력이 일정 비율로 변하는 관계이다. 선형 모델은 비교적 단순하며, 해석이 용이하다는 장점이 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  선형성의 조건&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;선형성을 만족하기 위한 조건은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;가산성 (Additivity)&lt;/strong&gt;:  두 입력 x와 y에 대한 함수의 값의 합은, 각 입력에 대한 함수의 값을 더한 것과 같다.  f(x + y) = f(x) + f(y)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;동차성 (Homogeneity)&lt;/strong&gt;: 입력 x에 상수 a를 곱한 값에 대한 함수의 값은, 원래 함수의 값에 상수 a를 곱한 것과 같다. f(ax) = a*f(x)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 두 조건을 모두 만족해야 선형성을 가진다고 할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  선형 모델의 예시&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;가장 기본적인 선형 모델은 선형 회귀(Linear Regression)이다. 선형 회귀는 독립 변수와 종속 변수 간의 선형 관계를 모델링한다. 예를 들어, 집의 크기와 가격 사이의 관계를 선형 회귀로 나타낼 수 있다.&lt;/p&gt;
&lt;p&gt;y = ax + b&lt;/p&gt;
&lt;p&gt;여기서 y는 종속 변수(집 가격), x는 독립 변수(집 크기), a는 기울기, b는 절편을 나타낸다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# Sample data
x = np.array([1, 2, 3, 4, 5]).reshape((-1, 1))  # 집 크기
y = np.array([2, 4, 5, 4, 5])  # 집 가격

# Linear Regression 모델 생성 및 학습
model = LinearRegression()
model.fit(x, y)

# 예측
x_new = np.array([6]).reshape((-1, 1))
y_pred = model.predict(x_new)
print(f&amp;#39;Predicted price for size 6: {y_pred}&amp;#39;)

# 시각화
plt.scatter(x, y, label=&amp;#39;Actual Data&amp;#39;)
plt.plot(x, model.predict(x), color=&amp;#39;red&amp;#39;, label=&amp;#39;Linear Regression&amp;#39;)
plt.scatter(x_new, y_pred, color=&amp;#39;green&amp;#39;, label=&amp;#39;Predicted Data&amp;#39;)
plt.xlabel(&amp;#39;House Size&amp;#39;)
plt.ylabel(&amp;#39;House Price&amp;#39;)
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  비선형성 (Non-linearity)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;비선형성은 입력과 출력 간의 관계가 직선 또는 초평면으로 표현될 수 없는 특성을 의미한다. 즉, 입력 변수의 변화에 따라 출력이 일정하지 않은 비율로 변하는 관계이다. 비선형 모델은 복잡한 데이터 패턴을 학습할 수 있지만, 모델의 해석이 어려울 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  비선형 모델의 예시&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;비선형 모델의 대표적인 예시는 신경망(Neural Network)이다. 신경망은 여러 개의 레이어로 구성되어 있으며, 각 레이어는 비선형 활성화 함수(activation function)를 사용하여 입력을 변환한다. 이러한 비선형성 덕분에 신경망은 복잡한 데이터 패턴을 학습할 수 있다. 다른 예시로는 결정 트리(Decision Tree), 랜덤 포레스트(Random Forest), 서포트 벡터 머신(Support Vector Machine, SVM) 등이 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPRegressor

# Sample data
x = np.array([1, 2, 3, 4, 5]).reshape((-1, 1))
y = np.array([1, 3, 2, 4, 5])

# MLPRegressor 모델 생성 및 학습
model = MLPRegressor(hidden_layer_sizes=(100, 50), activation=&amp;#39;relu&amp;#39;, solver=&amp;#39;adam&amp;#39;, random_state=42)
model.fit(x, y)

# 예측
x_new = np.array([6]).reshape((-1, 1))
y_pred = model.predict(x_new)
print(f&amp;#39;Predicted value for input 6: {y_pred}&amp;#39;)

# 시각화
plt.scatter(x, y, label=&amp;#39;Actual Data&amp;#39;)
x_plot = np.linspace(min(x), max(x), 100).reshape((-1, 1))
y_plot = model.predict(x_plot)
plt.plot(x_plot, y_plot, color=&amp;#39;red&amp;#39;, label=&amp;#39;MLPRegressor&amp;#39;)
plt.scatter(x_new, y_pred, color=&amp;#39;green&amp;#39;, label=&amp;#39;Predicted Data&amp;#39;)
plt.xlabel(&amp;#39;Input&amp;#39;)
plt.ylabel(&amp;#39;Output&amp;#39;)
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  머신러닝 모델 선택 시 고려사항&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;선형 모델은 단순하고 해석이 용이하지만, 복잡한 데이터 패턴을 학습하는 데 한계가 있다. 반면, 비선형 모델은 복잡한 데이터 패턴을 학습할 수 있지만, 과적합(overfitting)의 위험이 있고 모델 해석이 어렵다. 따라서, 머신러닝 모델을 선택할 때는 데이터의 특성과 모델의 복잡성을 고려해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;데이터가 선형적인 관계를 가지는 경우: 선형 회귀, 로지스틱 회귀 등 선형 모델을 사용하는 것이 적합하다.&lt;/li&gt;
&lt;li&gt;데이터가 복잡한 비선형 관계를 가지는 경우: 신경망, 결정 트리, SVM 등 비선형 모델을 사용하는 것이 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  선형성과 비선형성의 중요성&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;선형성과 비선형성은 머신러닝 모델의 성능과 해석 가능성에 큰 영향을 미친다. 적절한 모델을 선택하고, 모델의 파라미터를 튜닝하여 최적의 성능을 얻는 것이 중요하다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;선형성 (Linearity): 입력과 출력 간의 관계가 직선으로 표현되는 특성&lt;/li&gt;
&lt;li&gt;비선형성 (Non-linearity): 입력과 출력 간의 관계가 직선으로 표현되지 않는 특성&lt;/li&gt;
&lt;li&gt;선형 회귀 (Linear Regression): 독립 변수와 종속 변수 간의 선형 관계를 모델링하는 방법&lt;/li&gt;
&lt;li&gt;신경망 (Neural Network): 여러 레이어로 구성된 비선형 모델&lt;/li&gt;
&lt;li&gt;활성화 함수 (Activation Function): 신경망 레이어에서 입력 신호를 변환하는 함수&lt;/li&gt;
&lt;li&gt;과적합 (Overfitting): 모델이 학습 데이터에 너무 맞춰져서 일반화 성능이 떨어지는 현상&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>linear regression</category>
      <category>linearity</category>
      <category>neural network</category>
      <category>non-linearity</category>
      <category>과적합</category>
      <category>비선형성</category>
      <category>선형 회귀</category>
      <category>선형성</category>
      <category>신경망</category>
      <category>활성화 함수</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/777</guid>
      <comments>https://move84s.tistory.com/777#entry777comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:14:43 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝: 간단한 모델 vs 복잡한 모델</title>
      <link>https://move84s.tistory.com/776</link>
      <description>&lt;p&gt;머신러닝 모델을 선택할 때 간단한 모델과 복잡한 모델 사이에서 어떤 것을 선택해야 할지 고민하는 경우가 많습니다. 이 글에서는 간단한 모델과 복잡한 모델의 특징을 비교하고, 어떤 상황에서 어떤 모델을 선택하는 것이 적절한지 다양한 측면에서 분석합니다. 모델 선택의 중요성과 실질적인 예시를 통해 독자들이 더 나은 결정을 내릴 수 있도록 돕는 것을 목표로 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;✨ &lt;strong&gt;간단한 모델 (Simple Models)&lt;/strong&gt;&lt;br&gt;간단한 모델은 비교적 적은 수의 파라미터를 사용하여 데이터를 학습합니다. 이러한 모델은 구현과 이해가 쉬우며, 과적합(overfitting)의 위험이 적습니다. 선형 회귀(Linear Regression)나 의사결정 트리(Decision Tree)와 같이 직관적인 알고리즘이 대표적입니다. 간단한 모델은 데이터의 특징을 명확하게 파악하고 해석하는 데 유리합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;복잡한 모델 (Complex Models)&lt;/strong&gt;&lt;br&gt;복잡한 모델은 많은 수의 파라미터를 사용하여 데이터를 학습합니다. 심층 신경망(Deep Neural Networks)이나 앙상블 모델(Ensemble Models)이 대표적입니다. 복잡한 모델은 데이터의 복잡한 패턴을 학습하는 데 효과적이지만, 과적합의 위험이 높고, 모델을 이해하고 해석하는 데 어려움이 있을 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;과적합 (Overfitting) vs 과소적합 (Underfitting)&lt;/strong&gt;&lt;br&gt;과적합은 모델이 학습 데이터에 너무 특화되어 새로운 데이터에 대한 예측 성능이 떨어지는 현상입니다. 반대로 과소적합은 모델이 데이터를 충분히 학습하지 못해 학습 데이터와 새로운 데이터 모두에 대해 낮은 예측 성능을 보이는 현상입니다. 간단한 모델은 과소적합의 위험이, 복잡한 모델은 과적합의 위험이 더 큽니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;모델 선택 기준&lt;/strong&gt;&lt;br&gt;모델을 선택할 때는 여러 가지 요소를 고려해야 합니다. 데이터의 크기와 복잡성, 필요한 예측 정확도, 계산 자원, 모델 해석 가능성 등이 중요한 기준이 됩니다.&lt;/p&gt;
&lt;ol&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;li&gt;&lt;strong&gt;모델 해석 가능성&lt;/strong&gt;: 모델의 해석이 중요할 때는 간단한 모델을, 그렇지 않을 때는 복잡한 모델을 사용하는 것이 좋습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;모델 평가 방법&lt;/strong&gt;&lt;br&gt;모델의 성능을 평가하기 위해 다양한 방법을 사용할 수 있습니다. 교차 검증(Cross-Validation), 홀드아웃 검증(Hold-out Validation) 등의 방법을 통해 모델의 일반화 성능을 측정할 수 있습니다. 또한, 정밀도(Precision), 재현율(Recall), F1 점수(F1 Score), AUC(Area Under the Curve) 등의 지표를 사용하여 모델의 성능을 정량적으로 평가할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;실험 및 검증&lt;/strong&gt;&lt;br&gt;실제로 모델을 선택할 때는 다양한 모델을 시도해 보고, 그 성능을 비교하는 것이 중요합니다. 예를 들어, 선형 회귀 모델과 심층 신경망 모델을 모두 학습시켜 보고, 교차 검증을 통해 각 모델의 성능을 비교할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.linear_model import LinearRegression
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np

# 가상의 데이터 생성
X = np.random.rand(100, 5)  # 100개의 샘플, 5개의 특징
y = np.random.rand(100)       # 100개의 타겟 값

# 데이터를 학습 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 선형 회귀 모델 학습
linear_model = LinearRegression()
linear_model.fit(X_train, y_train)
linear_predictions = linear_model.predict(X_test)
linear_mse = mean_squared_error(y_test, linear_predictions)
print(f&amp;#39;선형 회귀 모델 MSE: {linear_mse}&amp;#39;)

# 심층 신경망 모델 학습
neural_network_model = MLPRegressor(hidden_layer_sizes=(100, 50), max_iter=500, random_state=42)
neural_network_model.fit(X_train, y_train)
neural_network_predictions = neural_network_model.predict(X_test)
neural_network_mse = mean_squared_error(y_test, neural_network_predictions)
print(f&amp;#39;심층 신경망 모델 MSE: {neural_network_mse}&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;실제 사례&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;스팸 메일 분류&lt;/strong&gt;: 스팸 메일 분류의 경우, 데이터의 양이 충분하고 패턴이 복잡할 수 있으므로, 나이브 베이즈 분류기(Naive Bayes classifier)와 같은 간단한 모델보다는 심층 신경망 모델이 더 나은 성능을 보일 수 있습니다. 그러나, 모델의 해석 가능성이 중요하다면, 로지스틱 회귀(Logistic Regression)와 같은 간단한 모델을 선택하는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;주가 예측&lt;/strong&gt;: 주가 예측의 경우, 데이터의 노이즈가 많고 패턴이 복잡하므로, ARIMA 모델과 같은 전통적인 시계열 모델보다는 LSTM(Long Short-Term Memory)과 같은 순환 신경망 모델이 더 나은 성능을 보일 수 있습니다. 그러나, 계산 자원이 제한적이라면, 간단한 이동 평균 모델을 사용하는 것이 현실적인 선택일 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이미지 분류&lt;/strong&gt;: 이미지 분류의 경우, 데이터의 양이 매우 많고 패턴이 복잡하므로, CNN(Convolutional Neural Network)과 같은 심층 신경망 모델이 압도적으로 좋은 성능을 보입니다. AlexNet, VGGNet, ResNet 등 다양한 CNN 모델이 개발되어 있으며, 각각의 모델은 특정 이미지 데이터셋에 최적화되어 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;결론&lt;/strong&gt;&lt;br&gt;머신러닝 모델을 선택할 때는 간단한 모델과 복잡한 모델의 장단점을 이해하고, 데이터의 특징과 문제의 요구사항을 고려하여 적절한 모델을 선택해야 합니다. 모델의 성능은 데이터의 품질, 특징 선택, 하이퍼파라미터 튜닝 등 다양한 요소에 의해 영향을 받으므로, 지속적인 실험과 검증을 통해 최적의 모델을 찾아내는 것이 중요합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;과적합 (Overfitting): 모델이 학습 데이터에 너무 특화되어 새로운 데이터에 대한 예측 성능이 떨어지는 현상&lt;/li&gt;
&lt;li&gt;과소적합 (Underfitting): 모델이 데이터를 충분히 학습하지 못해 학습 데이터와 새로운 데이터 모두에 대해 낮은 예측 성능을 보이는 현상&lt;/li&gt;
&lt;li&gt;교차 검증 (Cross-Validation): 모델의 일반화 성능을 측정하기 위한 방법&lt;/li&gt;
&lt;li&gt;정밀도 (Precision): 모델이 Positive라고 예측한 것 중 실제로 Positive인 비율&lt;/li&gt;
&lt;li&gt;재현율 (Recall): 실제로 Positive인 것 중 모델이 Positive라고 예측한 비율&lt;/li&gt;
&lt;li&gt;F1 점수 (F1 Score): 정밀도와 재현율의 조화 평균&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>간단한 모델</category>
      <category>과소적합</category>
      <category>과적합</category>
      <category>머신러닝</category>
      <category>모델 선택</category>
      <category>복잡한 모델</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/776</guid>
      <comments>https://move84s.tistory.com/776#entry776comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:14:00 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 모델 복잡도(Model Complexity)의 의미</title>
      <link>https://move84s.tistory.com/775</link>
      <description>&lt;p&gt;머신러닝 모델을 선택하고 훈련할 때 모델 복잡도는 중요한 고려 사항이다. 모델이 너무 단순하면 데이터의 기본적인 패턴만 학습하여 과소적합(underfitting)될 수 있고, 반대로 모델이 너무 복잡하면 데이터의 노이즈까지 학습하여 과적합(overfitting)될 수 있다. 이 글에서는 모델 복잡도의 의미와 그것이 머신러닝 모델의 성능에 미치는 영향에 대해 자세히 알아본다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;모델 복잡도란?&lt;/strong&gt;&lt;br&gt;모델 복잡도는 모델이 얼마나 다양한 패턴을 학습할 수 있는지를 나타내는 지표이다. 복잡한 모델은 더 많은 파라미터를 가지고 있으며, 따라서 더 복잡한 함수를 표현할 수 있다. 예를 들어, 고차 다항 회귀 모델은 저차 다항 회귀 모델보다 더 복잡하다. 신경망에서는 레이어의 수와 각 레이어의 노드 수가 모델의 복잡도를 결정하는 주요 요인이다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;과소적합 (Underfitting)&lt;/strong&gt;&lt;br&gt;과소적합은 모델이 훈련 데이터를 충분히 학습하지 못했을 때 발생한다. 이는 모델이 너무 단순하거나, 훈련 데이터가 부족하거나, 특성(feature)이 적절하지 않을 때 나타날 수 있다. 과소적합된 모델은 훈련 데이터와 테스트 데이터 모두에서 낮은 성능을 보인다.&lt;br&gt;예를 들어, 선형 회귀 모델로 비선형 데이터를 예측하려고 할 때 과소적합이 발생할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 비선형 데이터 생성
X = np.linspace(-5, 5, 100).reshape(-1, 1)
y = X**2 + np.random.normal(0, 5, 100).reshape(-1, 1)

# 선형 회귀 모델 훈련
model = LinearRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)

# 시각화
plt.scatter(X, y, label=&amp;#39;Data&amp;#39;)
plt.plot(X, y_pred, color=&amp;#39;red&amp;#39;, label=&amp;#39;Linear Regression&amp;#39;)
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드에서 선형 회귀 모델은 이차 함수 형태의 데이터를 제대로 표현하지 못한다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;과적합 (Overfitting)&lt;/strong&gt;&lt;br&gt;과적합은 모델이 훈련 데이터의 노이즈까지 학습했을 때 발생한다. 이는 모델이 너무 복잡하거나, 훈련 데이터가 너무 적을 때 나타날 수 있다. 과적합된 모델은 훈련 데이터에서는 높은 성능을 보이지만, 테스트 데이터에서는 낮은 성능을 보인다.&lt;br&gt;예를 들어, 매우 높은 차수의 다항 회귀 모델을 사용하여 적은 수의 데이터를 학습할 때 과적합이 발생할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline

# 데이터 생성
X = np.linspace(-3, 3, 10).reshape(-1, 1)
y = np.random.normal(0, 2, 10).reshape(-1, 1) + X**2

# 10차 다항 회귀 모델 훈련
poly_model = make_pipeline(PolynomialFeatures(degree=9), LinearRegression())
poly_model.fit(X, y)

# 예측
X_test = np.linspace(-5, 5, 100).reshape(-1, 1)
y_pred = poly_model.predict(X_test)

# 시각화
plt.scatter(X, y, label=&amp;#39;Data&amp;#39;)
plt.plot(X_test, y_pred, color=&amp;#39;red&amp;#39;, label=&amp;#39;Polynomial Regression (Degree 9)&amp;#39;)
plt.xlim(-5, 5)
plt.ylim(-5, 20)
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드에서 9차 다항 회귀 모델은 훈련 데이터에 과도하게 적합되어 새로운 데이터에 대한 예측 성능이 낮아질 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;적절한 모델 복잡도 선택&lt;/strong&gt;&lt;br&gt;모델의 복잡도를 적절하게 선택하는 것은 머신러닝 모델의 성능을 최적화하는 데 중요하다. 다음은 모델 복잡도를 선택하는 데 도움이 되는 몇 가지 방법이다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;교차 검증 (Cross-Validation)&lt;/strong&gt;: 데이터를 여러 개의 폴드(fold)로 나누어 훈련 및 검증을 반복하여 모델의 성능을 평가한다. 이를 통해 과적합을 방지하고 일반화 성능을 높일 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;규제 (Regularization)&lt;/strong&gt;: 모델의 복잡도에 페널티를 부과하여 과적합을 줄인다. L1 규제와 L2 규제가 대표적이다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학습 곡선 (Learning Curve)&lt;/strong&gt;: 훈련 데이터 크기에 따른 모델의 성능 변화를 시각화하여 과적합 또는 과소적합 여부를 판단한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIC (Akaike Information Criterion) 및 BIC (Bayesian Information Criterion)&lt;/strong&gt;: 모델의 복잡도와 데이터 적합도를 고려하여 모델을 선택하는 기준을 제공한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;규제 (Regularization)&lt;/strong&gt;&lt;br&gt;규제는 모델의 복잡도를 제어하여 과적합을 방지하는 방법이다. L1 규제(Lasso)는 모델의 가중치(weight)의 절대값 합을 최소화하고, L2 규제(Ridge)는 가중치의 제곱합을 최소화한다. 이러한 규제는 모델이 불필요하게 큰 가중치를 갖지 않도록 하여 모델을 단순화한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.linear_model import Ridge

# L2 규제를 사용한 Ridge 회귀 모델
ridge_model = Ridge(alpha=1.0)  # alpha는 규제 강도를 조절하는 파라미터
ridge_model.fit(X, y)

from sklearn.linear_model import Lasso

# L1 규제를 사용한 Lasso 회귀 모델
lasso_model = Lasso(alpha=0.1)  # alpha는 규제 강도를 조절하는 파라미터
lasso_model.fit(X, y)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드에서 &lt;code&gt;alpha&lt;/code&gt; 파라미터는 규제의 강도를 조절한다. &lt;code&gt;alpha&lt;/code&gt; 값이 클수록 규제가 강해져 모델이 단순해진다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;학습 곡선 (Learning Curve)&lt;/strong&gt;&lt;br&gt;학습 곡선은 훈련 데이터 크기에 따른 모델의 성능 변화를 나타내는 그래프이다. 훈련 데이터와 검증 데이터에 대한 성능을 함께 표시하여 과적합 또는 과소적합 여부를 판단할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.model_selection import learning_curve
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
X = np.linspace(-5, 5, 100).reshape(-1, 1)
y = (X**2 + np.random.normal(0, 5, 100).reshape(-1, 1) &amp;gt; 10).astype(int).ravel()

# SVM 모델
model = SVC(kernel=&amp;#39;rbf&amp;#39;, gamma=0.1, C=1.0)

# 학습 곡선 계산
train_sizes, train_scores, test_scores = learning_curve(
    model, X, y, cv=5, scoring=&amp;#39;accuracy&amp;#39;, train_sizes=np.linspace(0.1, 1.0, 5))

# 평균 및 표준편차 계산
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)

# 학습 곡선 시각화
plt.plot(train_sizes, train_mean, label=&amp;#39;Train&amp;#39;)
plt.plot(train_sizes, test_mean, label=&amp;#39;Validation&amp;#39;)
plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.2)
plt.fill_between(train_sizes, test_mean - test_std, test_mean + test_std, alpha=0.2)
plt.xlabel(&amp;#39;Training Set Size&amp;#39;)
plt.ylabel(&amp;#39;Accuracy&amp;#39;)
plt.legend()
plt.title(&amp;#39;Learning Curve&amp;#39;)
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;학습 곡선에서 훈련 데이터 성능이 높고 검증 데이터 성능이 낮으면 과적합을 의심할 수 있으며, 훈련 데이터와 검증 데이터 성능이 모두 낮으면 과소적합을 의심할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  모델 복잡도는 머신러닝 모델의 성능에 큰 영향을 미친다. 과소적합과 과적합을 피하고, 일반화 성능이 좋은 모델을 만들기 위해서는 적절한 모델 복잡도를 선택하는 것이 중요하다. 교차 검증, 규제, 학습 곡선 등을 활용하여 모델의 복잡도를 조절하고 최적의 성능을 얻을 수 있도록 노력해야 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모델 복잡도 (Model Complexity): 모델이 얼마나 다양한 패턴을 학습할 수 있는지 나타내는 지표 (index)&lt;/li&gt;
&lt;li&gt;과소적합 (Underfitting): 모델이 훈련 데이터를 충분히 학습하지 못한 상태 (state)&lt;/li&gt;
&lt;li&gt;과적합 (Overfitting): 모델이 훈련 데이터의 노이즈까지 학습한 상태 (state)&lt;/li&gt;
&lt;li&gt;교차 검증 (Cross-Validation): 데이터를 여러 개의 폴드로 나누어 훈련 및 검증을 반복하는 방법 (method)&lt;/li&gt;
&lt;li&gt;규제 (Regularization): 모델의 복잡도에 페널티를 부과하여 과적합을 줄이는 방법 (method)&lt;/li&gt;
&lt;li&gt;학습 곡선 (Learning Curve): 훈련 데이터 크기에 따른 모델의 성능 변화를 나타내는 그래프 (graph)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>과소적합</category>
      <category>과적합</category>
      <category>교차 검증</category>
      <category>규제</category>
      <category>모델 복잡도</category>
      <category>학습 곡선</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/775</guid>
      <comments>https://move84s.tistory.com/775#entry775comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:13:25 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝에서 정지 규칙(Stopping Criteria)의 필요성</title>
      <link>https://move84s.tistory.com/774</link>
      <description>&lt;p&gt;머신러닝 모델을 훈련할 때, 언제 훈련을 멈춰야 할지를 결정하는 것은 매우 중요합니다. 과도하게 훈련된 모델은 새로운 데이터에 대해 제대로 작동하지 않을 수 있으며, 훈련이 부족한 모델은 잠재력을 충분히 발휘하지 못할 수 있습니다. 따라서 적절한 시점에 훈련을 중단시키는 정지 규칙(Stopping Criteria)은 머신러닝 모델의 성능을 최적화하는 데 필수적인 요소입니다. 본 포스트에서는 정지 규칙의 중요성과 다양한 정지 규칙에 대해 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;정지 규칙의 중요성&lt;/strong&gt;&lt;br&gt;머신러닝 모델 훈련 시 정지 규칙은 과적합(Overfitting)과 과소적합(Underfitting)을 방지하는 데 중요한 역할을 합니다. 과적합은 모델이 훈련 데이터에는 지나치게 잘 맞지만, 새로운 데이터에는 제대로 일반화되지 못하는 현상입니다. 반대로 과소적합은 모델이 훈련 데이터를 충분히 학습하지 못해 성능이 낮은 상태를 의미합니다. 적절한 정지 규칙은 모델이 최적의 성능을 발휘할 수 있도록 훈련 과정을 조절하여 이러한 문제를 해결합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;다양한 정지 규칙&lt;/strong&gt;&lt;br&gt;다양한 정지 규칙이 존재하며, 각 규칙은 모델의 특성과 데이터셋에 따라 적합성이 다릅니다. 주요 정지 규칙은 다음과 같습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;최대 반복 횟수(Maximum Iterations):&lt;/strong&gt;&lt;br&gt;모델 훈련을 특정 횟수만큼 반복한 후 중단합니다. 예를 들어, 경사 하강법(Gradient Descent)을 사용하는 경우 최대 반복 횟수를 설정하여 모델이 무한정 훈련되는 것을 방지할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.linear_model import SGDRegressor

# 최대 반복 횟수를 1000으로 설정
model = SGDRegressor(max_iter=1000)
model.fit(X_train, y_train)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;조기 종료(Early Stopping):&lt;/strong&gt;&lt;br&gt;검증 데이터셋(Validation Dataset)을 사용하여 모델의 성능을 주기적으로 평가하고, 성능이 더 이상 개선되지 않으면 훈련을 중단합니다. 이는 과적합을 방지하는 데 효과적입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import train_test_split
import numpy as np

# 가상의 데이터 생성
X = np.random.rand(100, 5)
y = np.random.rand(100)

# 훈련 데이터와 검증 데이터로 분리
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

model = SGDRegressor(max_iter=1, warm_start=True)  # warm_start를 True로 설정해야 이전 학습 상태를 유지합니다.
n_epochs = 100
val_errors = []

best_val_error = float(&amp;#39;inf&amp;#39;)
patience = 10
counter = 0

for epoch in range(n_epochs):
    model.fit(X_train, y_train)
    y_pred = model.predict(X_val)
    val_error = np.mean((y_pred - y_val)**2)
    val_errors.append(val_error)

    if val_error &amp;lt; best_val_error:
        best_val_error = val_error
        counter = 0
    else:
        counter += 1
        if counter &amp;gt; patience:
            print(&amp;quot;Early stopping!&amp;quot;)
            break&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;손실 함수 변화량(Loss Function Change):&lt;/strong&gt;&lt;br&gt;손실 함수의 변화량이 특정 임계값 이하로 떨어지면 훈련을 중단합니다. 이는 모델이 더 이상 유의미하게 학습하지 않는다고 판단될 때 유용합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 이전 손실과 현재 손실의 차이가 특정 값 이하일 때 멈춤
previous_loss = float(&amp;#39;inf&amp;#39;)
tolerance = 0.0001  # 임계값 설정

for epoch in range(max_epochs):
    model.fit(X_train, y_train)
    current_loss = calculate_loss(model, X_train, y_train)

    if abs(previous_loss - current_loss) &amp;lt; tolerance:
        print(f&amp;quot;손실 변화량이 임계값 이하로 떨어져 훈련을 중단합니다. Epoch: {epoch}&amp;quot;)
        break

    previous_loss = current_loss&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;모델 복잡도(Model Complexity):&lt;/strong&gt;&lt;br&gt;모델의 복잡도가 특정 수준을 넘어서면 훈련을 중단합니다. 이는 모델이 너무 복잡해져서 과적합될 가능성을 줄입니다. 예를 들어, 결정 트리(Decision Tree)의 최대 깊이를 제한하거나, 신경망(Neural Network)의 레이어 수를 제한하는 방법이 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.tree import DecisionTreeClassifier

# 결정 트리의 최대 깊이를 5로 제한
model = DecisionTreeClassifier(max_depth=5)
model.fit(X_train, y_train)&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;정지 규칙 선택 시 고려사항&lt;/strong&gt;&lt;br&gt;정지 규칙을 선택할 때는 다음과 같은 사항을 고려해야 합니다.&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;li&gt;&lt;strong&gt;훈련 시간:&lt;/strong&gt; 훈련 시간이 제한적이라면 최대 반복 횟수를 설정하여 훈련 시간을 관리할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;실제 예시&lt;/strong&gt;&lt;br&gt;이미지 분류 모델을 훈련할 때, 검증 데이터셋의 정확도가 더 이상 증가하지 않으면 조기 종료를 사용하여 훈련을 중단할 수 있습니다. 이는 모델이 훈련 데이터에 과적합되는 것을 방지하고, 새로운 이미지에 대한 일반화 성능을 높이는 데 도움이 됩니다. 예를 들어, TensorFlow나 PyTorch와 같은 딥러닝 프레임워크에서는 콜백(Callback) 함수를 사용하여 조기 종료를 쉽게 구현할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```python
import tensorflow as tf
from tensorflow.keras.callbacks import EarlyStopping

# EarlyStopping 콜백 정의
early_stopping = EarlyStopping(
    monitor=&amp;#39;val_loss&amp;#39;,  # 검증 손실을 기준으로 모니터링
    patience=10,         # 10 에포크 동안 개선이 없으면 종료
    restore_best_weights=True  # 가장 좋은 가중치로 복원
)

# 모델 훈련 시 콜백 함수 전달
model.fit(
    X_train, y_train,
    epochs=100,
    validation_data=(X_val, y_val),
    callbacks=[early_stopping]
)
```&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;과적합 (Overfitting):&lt;/strong&gt; 모델이 훈련 데이터에 너무 잘 맞춰져 새로운 데이터에 대한 성능이 떨어지는 현상. (영어: Overfitting)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;과소적합 (Underfitting):&lt;/strong&gt; 모델이 훈련 데이터를 충분히 학습하지 못해 성능이 낮은 현상. (영어: Underfitting)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;조기 종료 (Early Stopping):&lt;/strong&gt; 검증 데이터셋을 사용하여 모델의 성능을 모니터링하고, 성능이 더 이상 개선되지 않으면 훈련을 중단하는 방법. (영어: Early Stopping)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;검증 데이터셋 (Validation Dataset):&lt;/strong&gt; 모델의 성능을 평가하고 훈련 과정을 조절하기 위해 사용되는 데이터셋. (영어: Validation Dataset)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;손실 함수 (Loss Function):&lt;/strong&gt; 모델의 예측값과 실제값의 차이를 나타내는 함수. (영어: Loss Function)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최대 반복 횟수 (Maximum Iterations):&lt;/strong&gt; 모델 훈련을 반복할 최대 횟수를 지정하는 정지 규칙. (영어: Maximum Iterations)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>검증 데이터셋</category>
      <category>과소적합</category>
      <category>과적합</category>
      <category>손실 함수</category>
      <category>정지 규칙</category>
      <category>조기 종료</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/774</guid>
      <comments>https://move84s.tistory.com/774#entry774comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:12:44 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝: 훈련 손실과 검증 손실의 개념</title>
      <link>https://move84s.tistory.com/773</link>
      <description>&lt;p&gt;머신러닝 모델을 훈련할 때 훈련 손실과 검증 손실은 모델의 성능을 평가하고 개선하는 데 중요한 지표다. 이 두 손실을 이해하고 적절히 활용하면 과적합을 방지하고 모델의 일반화 성능을 높일 수 있다. 본 포스트에서는 훈련 손실과 검증 손실의 정의, 중요성, 그리고 실제 머신러닝 과정에서 어떻게 활용되는지에 대해 자세히 설명한다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;훈련 손실 (Training Loss)&lt;/strong&gt;&lt;br&gt;훈련 손실은 모델이 훈련 데이터셋에 얼마나 잘 적합되는지를 나타내는 지표다. 훈련 데이터셋을 모델에 입력했을 때 모델이 예측한 값과 실제 값 사이의 차이를 측정하며, 이 차이를 줄이는 방향으로 모델의 가중치를 조정한다. 손실 함수(Loss Function)는 이 차이를 정량화하는 데 사용되며, 평균 제곱 오차(Mean Squared Error, MSE), 교차 엔트로피 오차(Cross-Entropy Loss) 등이 대표적인 예다. 훈련 과정에서는 이 훈련 손실을 최소화하는 것을 목표로 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

# 예시: 평균 제곱 오차 (MSE)
def mean_squared_error(y_true, y_predicted):
    return np.mean((y_true - y_predicted)**2)

# 실제 값
y_true = np.array([1, 2, 3, 4, 5])
# 예측 값
y_predicted = np.array([1.1, 1.9, 3.0, 4.1, 4.9])

# MSE 계산
mse = mean_squared_error(y_true, y_predicted)
print(f&amp;#39;평균 제곱 오차 (MSE): {mse}&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;검증 손실 (Validation Loss)&lt;/strong&gt;&lt;br&gt;검증 손실은 훈련된 모델이 처음 보는 데이터에 얼마나 잘 일반화되는지를 나타내는 지표다. 훈련 데이터셋 외에 별도의 검증 데이터셋을 사용하여 모델의 성능을 평가하며, 검증 손실은 이 검증 데이터셋에 대한 모델의 예측 오차를 측정한다. 검증 손실은 모델이 과적합되었는지 여부를 판단하는 데 중요한 역할을 한다. 과적합(Overfitting)은 모델이 훈련 데이터에만 지나치게 잘 맞고, 새로운 데이터에 대해서는 성능이 떨어지는 현상을 의미한다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;훈련 손실과 검증 손실의 관계&lt;/strong&gt;&lt;br&gt;훈련 과정에서 훈련 손실은 지속적으로 감소하는 경향을 보인다. 그러나 검증 손실은 초기에는 훈련 손실과 함께 감소하다가 특정 시점 이후에는 오히려 증가할 수 있다. 이는 모델이 훈련 데이터에 과적합되기 시작했음을 의미한다. 따라서 훈련을 중단하거나 규제(Regularization) 기법을 사용하여 과적합을 방지해야 한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;과소적합 (Underfitting):&lt;/strong&gt; 훈련 손실과 검증 손실 모두 높은 상태로, 모델이 데이터의 패턴을 충분히 학습하지 못한 경우다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;과적합 (Overfitting):&lt;/strong&gt; 훈련 손실은 낮지만 검증 손실이 높은 상태로, 모델이 훈련 데이터에만 지나치게 적합되어 새로운 데이터에 대한 예측 성능이 낮은 경우다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최적 상태 (Optimal):&lt;/strong&gt; 훈련 손실과 검증 손실이 모두 낮고, 그 차이가 크지 않은 상태로, 모델이 데이터의 패턴을 잘 학습하고 일반화 성능도 높은 경우다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 예시: 훈련 손실과 검증 손실의 변화
import matplotlib.pyplot as plt

# 에포크(Epoch)에 따른 훈련 손실과 검증 손실
epochs = range(1, 11)
training_loss = [2.5, 1.8, 1.4, 1.1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4]
validation_loss = [2.8, 2.2, 1.9, 1.7, 1.6, 1.7, 1.8, 2.0, 2.2, 2.4]

# 그래프 그리기
plt.plot(epochs, training_loss, &amp;#39;b-&amp;#39;, label=&amp;#39;Training Loss&amp;#39;)
plt.plot(epochs, validation_loss, &amp;#39;r-&amp;#39;, label=&amp;#39;Validation Loss&amp;#39;)
plt.title(&amp;#39;Training Loss vs. Validation Loss&amp;#39;)
plt.xlabel(&amp;#39;Epochs&amp;#39;)
plt.ylabel(&amp;#39;Loss&amp;#39;)
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 그래프에서 훈련 손실은 계속 감소하지만, 검증 손실은 특정 시점 이후에 증가하는 것을 확인할 수 있다. 이 지점이 과적합이 시작되는 시점이며, 훈련을 중단하거나 모델을 개선해야 한다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt; ️ &lt;strong&gt;과적합 방지 기법&lt;/strong&gt;&lt;br&gt;과적합을 방지하기 위해 다양한 기법들이 사용된다. 몇 가지 대표적인 방법은 다음과 같다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;규제 (Regularization):&lt;/strong&gt; 모델의 복잡도를 줄여 과적합을 방지하는 방법으로, L1 규제, L2 규제 등이 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;드롭아웃 (Dropout):&lt;/strong&gt; 신경망의 일부 뉴런을 임의로 제거하여 모델이 특정 뉴런에 과도하게 의존하는 것을 방지한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;데이터 증강 (Data Augmentation):&lt;/strong&gt; 훈련 데이터셋의 크기를 늘려 모델의 일반화 성능을 높이는 방법으로, 이미지 회전, 확대, 축소 등이 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;조기 종료 (Early Stopping):&lt;/strong&gt; 검증 손실이 더 이상 감소하지 않을 때 훈련을 중단하여 과적합을 방지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 예시: L2 규제를 사용한 선형 회귀 모델
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 데이터 생성
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 5])

# 훈련 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# L2 규제를 사용한 Ridge 회귀 모델 생성
ridge_model = Ridge(alpha=1.0)  # alpha는 규제 강도

# 모델 훈련
ridge_model.fit(X_train, y_train)

# 예측
y_pred = ridge_model.predict(X_test)

# MSE 계산
mse = mean_squared_error(y_test, y_pred)
print(f&amp;#39;MSE: {mse}&amp;#39;)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;훈련 손실 (Training Loss): 훈련 데이터셋에 대한 모델의 예측 오차. (Training Loss)&lt;/li&gt;
&lt;li&gt;검증 손실 (Validation Loss): 검증 데이터셋에 대한 모델의 예측 오차. (Validation Loss)&lt;/li&gt;
&lt;li&gt;과적합 (Overfitting): 모델이 훈련 데이터에만 지나치게 적합되어 새로운 데이터에 대한 예측 성능이 낮은 현상. (Overfitting)&lt;/li&gt;
&lt;li&gt;규제 (Regularization): 모델의 복잡도를 줄여 과적합을 방지하는 기법. (Regularization)&lt;/li&gt;
&lt;li&gt;드롭아웃 (Dropout): 신경망의 일부 뉴런을 임의로 제거하여 모델의 일반화 성능을 높이는 기법. (Dropout)&lt;/li&gt;
&lt;li&gt;조기 종료 (Early Stopping): 검증 손실이 더 이상 감소하지 않을 때 훈련을 중단하여 과적합을 방지하는 기법. (Early Stopping)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>검증 손실</category>
      <category>과적합</category>
      <category>규제</category>
      <category>드롭아웃</category>
      <category>조기 종료</category>
      <category>훈련 손실</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/773</guid>
      <comments>https://move84s.tistory.com/773#entry773comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:12:07 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝: 가설(Hypothesis)과 모델(Model)의 차이</title>
      <link>https://move84s.tistory.com/772</link>
      <description>&lt;p&gt;머신러닝을 공부하다 보면 가설(Hypothesis)과 모델(Model)이라는 용어를 자주 접하게 된다. 이 두 용어는 밀접하게 연관되어 있지만, 엄밀히 말하면 서로 다른 의미를 지닌다. 이 글에서는 가설과 모델의 차이점을 명확히 이해하고, 머신러닝 학습 과정에서 이들이 어떻게 활용되는지 살펴본다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;가설(Hypothesis)이란?&lt;/strong&gt;&lt;br&gt;가설은 데이터의 패턴을 설명하거나 예측하기 위해 우리가 세우는 &amp;#39;가능성 있는 설명&amp;#39;이다. 쉽게 말해, &amp;#39;이러한 관계가 있을 것이다&amp;#39;라는 추측이나 가정이다. 머신러닝에서는 특정 입력(feature)과 출력(label) 간의 관계를 나타내는 함수 또는 규칙의 형태를 가설이라고 할 수 있다. 예를 들어, &amp;#39;광고비가 증가하면 매출도 증가할 것이다&amp;#39;라는 가설을 세울 수 있다. 여기서 중요한 점은 가설은 아직 검증되지 않은 상태라는 것이다.&lt;br&gt;수학적으로 표현하면, 가설은 h(x)와 같이 표현될 수 있다. 여기서 x는 입력 변수를 의미하며, h는 가설 함수를 의미한다. 가설 함수는 입력 x에 대한 예측값을 반환한다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;모델(Model)이란?&lt;/strong&gt;&lt;br&gt;모델은 가설을 구체화하고, 학습 데이터를 통해 최적화된 결과물이다. 즉, 가설을 검증하고 데이터를 학습하여 얻어진 &amp;#39;구체적인 형태&amp;#39;라고 할 수 있다. 모델은 특정 문제에 대한 예측이나 분류를 수행할 수 있는 형태로 표현된다. 예를 들어, 선형 회귀 모델은 &amp;#39;매출 = a * 광고비 + b&amp;#39;와 같은 수식으로 표현될 수 있으며, 여기서 a와 b는 학습 데이터를 통해 결정된 값이다.&lt;br&gt;모델은 학습 알고리즘을 통해 데이터를 학습하면서 가설을 조정하고 개선해 나간다. 학습된 모델은 새로운 데이터에 대한 예측을 수행하는 데 사용될 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;가설과 모델의 관계&lt;/strong&gt;&lt;br&gt;가설과 모델은 서로 밀접하게 연관되어 있다. 모델은 가설을 기반으로 만들어지며, 학습 데이터를 통해 가설을 검증하고 구체화하는 과정을 거친다. 즉, 가설은 모델의 기초가 되며, 모델은 가설을 현실 세계에 적용할 수 있도록 만들어주는 역할을 한다.&lt;br&gt;머신러닝 학습 과정은 다음과 같이 요약할 수 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;가설 설정: 문제 해결을 위해 적절한 형태의 가설 함수를 선택한다. (예: 선형 함수, 비선형 함수)&lt;/li&gt;
&lt;li&gt;모델 학습: 학습 데이터를 이용하여 가설 함수의 파라미터(parameter)를 최적화한다.&lt;/li&gt;
&lt;li&gt;모델 평가: 테스트 데이터를 이용하여 학습된 모델의 성능을 평가한다.&lt;/li&gt;
&lt;li&gt;모델 개선: 필요에 따라 가설을 수정하거나, 다른 학습 알고리즘을 적용하여 모델을 개선한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;Python 예제&lt;/strong&gt;&lt;br&gt;다음은 Python을 사용하여 선형 회귀 모델을 학습하는 간단한 예제이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
from sklearn.linear_model import LinearRegression

# Sample data
X = np.array([[1], [2], [3], [4], [5]])  # 광고비
y = np.array([2, 4, 5, 4, 5])  # 매출

# Create a linear regression model
model = LinearRegression()

# Train the model
model.fit(X, y)

# Print the model parameters
print(&amp;quot;Coefficient (기울기):&amp;quot;, model.coef_)
print(&amp;quot;Intercept (절편):&amp;quot;, model.intercept_)

# Predict the sales for a new advertising cost
new_X = np.array([[6]])
predicted_y = model.predict(new_X)
print(&amp;quot;Predicted sales for advertising cost 6:&amp;quot;, predicted_y)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 scikit-learn 라이브러리를 사용하여 선형 회귀 모델을 학습하고, 새로운 광고비에 대한 매출을 예측하는 방법을 보여준다. 여기서 LinearRegression()은 선형 회귀라는 가설을 구현한 모델이며, fit() 함수는 학습 데이터를 사용하여 모델의 파라미터(기울기와 절편)를 최적화하는 과정이다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;예시를 통한 이해&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;예시 1:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;문제: 스팸 메일 분류&lt;/li&gt;
&lt;li&gt;가설: 특정 단어가 포함된 메일은 스팸일 가능성이 높다.&lt;/li&gt;
&lt;li&gt;모델: 나이브 베이즈 분류기 (Naive Bayes classifier) - 가설을 기반으로 학습 데이터를 통해 스팸 메일 분류 규칙을 학습한 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예시 2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;문제: 이미지 속 객체 인식&lt;/li&gt;
&lt;li&gt;가설: 특정 패턴의 픽셀 조합은 특정 객체를 나타낸다.&lt;/li&gt;
&lt;li&gt;모델: Convolutional Neural Network (CNN) - 가설을 기반으로 학습 데이터를 통해 이미지 속 객체를 인식하는 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;  &lt;strong&gt;핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가설 (Hypothesis): 데이터 패턴에 대한 가능성 있는 설명 또는 추측&lt;/li&gt;
&lt;li&gt;모델 (Model): 학습 데이터를 통해 최적화된 가설의 구체적인 형태&lt;/li&gt;
&lt;li&gt;학습 알고리즘 (Learning Algorithm): 모델을 학습시키는 방법 (예: 경사 하강법)&lt;/li&gt;
&lt;li&gt;파라미터 (Parameter): 모델의 학습 가능한 변수 (예: 선형 회귀 모델의 기울기와 절편)&lt;/li&gt;
&lt;li&gt;feature (특징): 머신러닝 모델에 입력되는 변수&lt;/li&gt;
&lt;li&gt;label (레이블): 머신러닝 모델이 예측해야 하는 값&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>Feature</category>
      <category>Label</category>
      <category>가설</category>
      <category>머신러닝</category>
      <category>모델</category>
      <category>파라미터</category>
      <category>학습 알고리즘</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/772</guid>
      <comments>https://move84s.tistory.com/772#entry772comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:11:32 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝에서의 상관계수 이해</title>
      <link>https://move84s.tistory.com/771</link>
      <description>&lt;p&gt;머신러닝 모델을 개발하고 평가할 때, 데이터 내 변수들 간의 관계를 파악하는 것은 매우 중요합니다. 그 중에서도 상관계수는 두 변수 간의 선형적 관계의 강도와 방향을 나타내는 지표로 널리 활용됩니다. 이 글에서는 상관계수의 개념, 종류, 활용 방법, 그리고 해석 시 주의사항에 대해 자세히 알아보겠습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  상관계수란? (What is Correlation Coefficient?)&lt;/strong&gt;&lt;br&gt;상관계수(Correlation Coefficient)는 두 변수 사이의 선형적인 관계의 정도를 나타내는 통계적 척도입니다. 상관계수의 값은 -1부터 +1 사이의 값을 가지며, +1은 완벽한 양의 선형 상관관계, -1은 완벽한 음의 선형 상관관계, 0은 선형 상관관계가 없음을 의미합니다. 여기서 &amp;#39;선형적&amp;#39;이라는 단어가 중요한데, 상관계수는 변수 간의 비선형적인 관계는 잘 나타내지 못합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  상관계수의 종류 (Types of Correlation Coefficients)&lt;/strong&gt;&lt;br&gt;다양한 종류의 상관계수가 존재하며, 각 상관계수는 데이터의 특성과 측정하고자 하는 관계에 따라 선택됩니다. 대표적인 상관계수는 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;피어슨 상관계수 (Pearson Correlation Coefficient): 두 변수가 모두 연속형 변수일 때 사용되며, 변수 간의 선형적인 관계의 강도를 측정합니다. 이는 공분산을 각 변수의 표준편차의 곱으로 나눈 값입니다.&lt;/li&gt;
&lt;li&gt;스피어만 상관계수 (Spearman Correlation Coefficient): 두 변수가 순위 척도(ordinal scale)일 때 또는 연속형 변수이지만 선형성이 가정되지 않을 때 사용됩니다. 각 변수의 실제 값 대신 순위를 사용하여 상관관계를 계산합니다.&lt;/li&gt;
&lt;li&gt;켄달의 타우 (Kendall&amp;#39;s Tau): 스피어만 상관계수와 유사하게 순위 척도 변수 간의 상관관계를 측정하지만, 계산 방식이 다릅니다. 켄달의 타우는 데이터 쌍의 일치성(concordance)과 불일치성(discordance)을 기반으로 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  상관계수의 계산 (Calculating Correlation Coefficient)&lt;/strong&gt;&lt;br&gt;피어슨 상관계수는 다음과 같은 수식으로 계산됩니다.&lt;/p&gt;
&lt;p&gt;r = Σ((xi - x̄)(yi - ȳ)) / (√(Σ(xi - x̄)²) * √(Σ(yi - ȳ)²))&lt;/p&gt;
&lt;p&gt;여기서 xi와 yi는 각각 i번째 데이터 포인트의 x값과 y값이며, x̄와 ȳ는 각각 x와 y의 평균입니다.&lt;/p&gt;
&lt;p&gt;다음은 파이썬을 사용하여 피어슨 상관계수를 계산하는 간단한 예제입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

# 예시 데이터
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# 평균 계산
x_mean = np.mean(x)
y_mean = np.mean(y)

# 분자와 분모 계산
numerator = np.sum((x - x_mean) * (y - y_mean))
denominator_x = np.sqrt(np.sum((x - x_mean)**2))
denominator_y = np.sqrt(np.sum((y - y_mean)**2))
denominator = denominator_x * denominator_y

# 상관계수 계산
correlation_coefficient = numerator / denominator

print(f&amp;quot;피어슨 상관계수: {correlation_coefficient}&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 두 변수 x와 y 사이의 피어슨 상관계수를 계산하는 방법을 보여줍니다. numpy 라이브러리를 사용하여 평균을 계산하고, 분자와 분모를 계산한 다음, 상관계수를 계산합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  상관계수의 활용 (Using Correlation Coefficient)&lt;/strong&gt;&lt;br&gt;상관계수는 다양한 머신러닝 및 통계 분석에서 유용하게 활용됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;특성 선택 (Feature Selection): 머신러닝 모델을 학습하기 전에, 목표 변수와 높은 상관관계를 가지는 특성을 선택하여 모델의 성능을 향상시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;다중공선성 (Multicollinearity) 탐지: 독립 변수들 간에 높은 상관관계가 존재하면 다중공선성 문제가 발생할 수 있습니다. 상관계수를 사용하여 다중공선성을 탐지하고, 이를 해결하기 위한 조치를 취할 수 있습니다.&lt;/li&gt;
&lt;li&gt;데이터 탐색 (Data Exploration): 데이터 분석 초기 단계에서 변수들 간의 관계를 파악하여 데이터에 대한 이해도를 높일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  상관계수 해석 시 주의사항 (Cautions when Interpreting Correlation Coefficient)&lt;/strong&gt;&lt;br&gt;상관계수를 해석할 때는 몇 가지 주의해야 할 점이 있습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인과관계 (Causation) 혼동 금지: 상관관계는 인과관계를 의미하지 않습니다. 두 변수 사이에 높은 상관관계가 있다고 해서 한 변수가 다른 변수를 유발한다고 단정할 수 없습니다.&lt;/li&gt;
&lt;li&gt;비선형 관계 무시: 상관계수는 선형적인 관계만 측정할 수 있습니다. 변수 간의 비선형적인 관계는 상관계수로 파악하기 어렵습니다.&lt;/li&gt;
&lt;li&gt;이상치 (Outlier) 영향: 이상치는 상관계수에 큰 영향을 미칠 수 있습니다. 이상치를 제거하거나, 로버스트한 상관계수(예: 스피어만 상관계수)를 사용하는 것을 고려해야 합니다.&lt;/li&gt;
&lt;li&gt;데이터 범위 고려: 상관계수는 데이터의 특정 범위 내에서만 유효할 수 있습니다. 데이터 범위를 벗어나는 경우 상관관계가 달라질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  예시 (Example)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;두 변수 x와 y가 있다고 가정해 봅시다. x는 학생의 공부 시간이고, y는 시험 점수입니다. 만약 x와 y의 피어슨 상관계수가 0.8이라면, 공부 시간이 늘어날수록 시험 점수가 높아지는 경향이 있다는 것을 의미합니다. 하지만 이것이 공부 시간을 늘리면 반드시 시험 점수가 높아진다는 인과관계를 의미하는 것은 아닙니다. 다른 요인(예: 학생의 지능, 학습 방법 등)도 시험 점수에 영향을 미칠 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;상관계수는 머신러닝 모델 개발 및 데이터 분석에서 중요한 도구입니다. 하지만 상관계수를 사용할 때는 그 의미와 한계를 정확히 이해하고, 해석 시 주의사항을 고려해야 합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;주요 용어 정리:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상관계수 (Correlation Coefficient): 변수 간의 선형적 관계의 강도와 방향을 나타내는 지표&lt;/li&gt;
&lt;li&gt;피어슨 상관계수 (Pearson Correlation Coefficient): 연속형 변수 간의 선형적 관계 측정&lt;/li&gt;
&lt;li&gt;스피어만 상관계수 (Spearman Correlation Coefficient): 순위 척도 변수 간의 상관관계 측정&lt;/li&gt;
&lt;li&gt;켄달의 타우 (Kendall&amp;#39;s Tau): 순위 척도 변수 간의 상관관계 측정 (데이터 쌍의 일치성/불일치성 기반)&lt;/li&gt;
&lt;li&gt;다중공선성 (Multicollinearity): 독립 변수들 간의 높은 상관관계&lt;/li&gt;
&lt;li&gt;특성 선택 (Feature Selection): 목표 변수와 높은 상관관계를 가지는 특성 선택&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>다중공선성</category>
      <category>상관계수</category>
      <category>스피어만 상관계수</category>
      <category>켄달의 타우</category>
      <category>특성 선택</category>
      <category>피어슨 상관계수</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/771</guid>
      <comments>https://move84s.tistory.com/771#entry771comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:10:58 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝에서의 분산(Variance)과 표준편차(Standard Deviation) 이해</title>
      <link>https://move84s.tistory.com/770</link>
      <description>&lt;p&gt;머신러닝 모델을 구축하고 평가할 때 데이터의 분포를 이해하는 것은 매우 중요합니다. 분산과 표준편차는 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타내는 기본적인 통계적 척도입니다. 이 글에서는 분산과 표준편차의 정의, 중요성, 그리고 머신러닝에서 어떻게 활용되는지를 자세히 설명합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  분산(Variance)이란?&lt;/strong&gt;&lt;br&gt;분산은 데이터가 평균으로부터 얼마나 멀리 떨어져 있는지를 제곱한 값들의 평균입니다. 즉, 데이터의 흩어진 정도를 나타내는 지표입니다. 분산이 크다는 것은 데이터가 평균에서 멀리 떨어져 분포하고 있다는 의미이며, 분산이 작다는 것은 데이터가 평균 주변에 모여 있다는 의미입니다.&lt;/p&gt;
&lt;p&gt;분산을 계산하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;각 데이터 포인트에서 평균을 뺍니다.&lt;/li&gt;
&lt;li&gt;결과를 제곱합니다.&lt;/li&gt;
&lt;li&gt;모든 제곱된 값을 더합니다.&lt;/li&gt;
&lt;li&gt;결과를 데이터 포인트의 개수로 나눕니다(모집단의 경우) 또는 (데이터 포인트의 개수 - 1)로 나눕니다(표본의 경우).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;수식으로 표현하면 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모집단 분산(σ^2) = Σ(xi - μ)^2 / N&lt;/li&gt;
&lt;li&gt;표본 분산(s^2) = Σ(xi - x̄)^2 / (n - 1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서 xi는 각 데이터 포인트, μ는 모집단 평균, x̄는 표본 평균, N은 모집단 크기, n은 표본 크기를 의미합니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  표준편차(Standard Deviation)란?&lt;/strong&gt;&lt;br&gt;표준편차는 분산의 제곱근입니다. 분산은 제곱된 값을 사용하기 때문에 원래 데이터의 단위와 다를 수 있습니다. 표준편차는 원래 데이터와 동일한 단위를 가지므로 데이터의 흩어진 정도를 더 직관적으로 이해할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;p&gt;표준편차를 계산하는 방법은 분산을 계산한 후 제곱근을 취하면 됩니다.&lt;/p&gt;
&lt;p&gt;수식으로 표현하면 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;모집단 표준편차(σ) = √(σ^2)&lt;/li&gt;
&lt;li&gt;표본 표준편차(s) = √(s^2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;표준편차가 크다는 것은 데이터가 평균에서 넓게 분포하고 있다는 의미이며, 표준편차가 작다는 것은 데이터가 평균 주변에 밀집되어 있다는 의미입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  분산과 표준편차의 중요성&lt;/strong&gt;&lt;br&gt;분산과 표준편차는 데이터의 특성을 파악하고 이해하는 데 매우 중요한 역할을 합니다. 머신러닝에서는 다음과 같은 이유로 분산과 표준편차를 중요하게 생각합니다.&lt;/p&gt;
&lt;ol&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; 분산과 표준편차는 특성 스케일링에 사용됩니다. 특성 스케일링은 특성들의 값 범위를 비슷하게 만들어 모델의 학습 속도를 높이고 성능을 개선하는 데 도움을 줍니다. 예를 들어, StandardScaler는 각 특성의 값을 평균이 0, 표준편차가 1이 되도록 변환합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모델 평가:&lt;/strong&gt; 분산과 표준편차는 모델의 예측 결과가 얼마나 안정적인지를 평가하는 데 사용될 수 있습니다. 예를 들어, 여러 번 모델을 학습시켜 예측 결과를 얻은 후 예측 값들의 분산이나 표준편차를 계산하여 모델의 안정성을 평가할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  Python을 이용한 분산과 표준편차 계산 예제&lt;/strong&gt;&lt;br&gt;Python의 NumPy 라이브러리를 사용하면 분산과 표준편차를 쉽게 계산할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

data = np.array([1, 2, 3, 4, 5])

# 분산 계산
variance = np.var(data)
print(&amp;quot;분산:&amp;quot;, variance)

# 표준편차 계산
std_dev = np.std(data)
print(&amp;quot;표준편차:&amp;quot;, std_dev)

# 표본 분산 계산 (ddof=1)
sample_variance = np.var(data, ddof=1)
print(&amp;quot;표본 분산:&amp;quot;, sample_variance)

# 표본 표준편차 계산 (ddof=1)
sample_std_dev = np.std(data, ddof=1)
print(&amp;quot;표본 표준편차:&amp;quot;, sample_std_dev)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 NumPy를 사용하여 데이터의 분산과 표준편차를 계산하는 예제입니다. &lt;code&gt;np.var()&lt;/code&gt; 함수는 분산을 계산하고, &lt;code&gt;np.std()&lt;/code&gt; 함수는 표준편차를 계산합니다. &lt;code&gt;ddof=1&lt;/code&gt;은 표본 분산과 표본 표준편차를 계산하기 위해 사용됩니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  분산과 표준편차 활용 예시&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;예를 들어, 어떤 쇼핑몰에서 고객들의 구매 금액 데이터를 분석한다고 가정해 보겠습니다.&lt;/p&gt;
&lt;ol&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;ul&gt;
&lt;li&gt;표준편차가 높다면, 구매 금액이 고객마다 크게 다르다는 것을 의미합니다. 이 경우, 고객 세분화를 통해 맞춤형 마케팅 전략을 수립할 수 있습니다. 예를 들어, 고액 구매 고객에게는 프리미엄 서비스를 제공하고, 저액 구매 고객에게는 할인 쿠폰을 제공하는 등의 전략을 세울 수 있습니다.&lt;/li&gt;
&lt;li&gt;표준편차가 낮다면, 구매 금액이 고객들 사이에서 비교적 유사하다는 것을 의미합니다. 이 경우, 대중적인 마케팅 전략을 통해 매출을 증대시킬 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;또 다른 예로, 머신러닝 모델의 성능을 평가할 때 교차 검증을 수행하여 여러 번 모델을 학습시키고 예측 결과를 얻습니다. 이 예측 결과들의 표준편차를 계산하여 모델의 안정성을 평가할 수 있습니다. 표준편차가 낮다면 모델이 안정적으로 예측을 수행한다고 판단할 수 있으며, 표준편차가 높다면 모델의 예측 결과가 불안정하다고 판단할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  요약&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;분산과 표준편차는 데이터의 흩어진 정도를 나타내는 기본적인 통계적 척도이며, 머신러닝에서 데이터 분포 이해, 이상치 탐지, 특성 스케일링, 모델 평가 등 다양한 목적으로 활용됩니다. Python의 NumPy 라이브러리를 사용하면 분산과 표준편차를 쉽게 계산할 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  핵심 용어&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;분산 (Variance): 데이터가 평균으로부터 흩어진 정도의 제곱값&lt;/li&gt;
&lt;li&gt;표준편차 (Standard Deviation): 분산의 제곱근으로, 데이터가 평균으로부터 흩어진 정도&lt;/li&gt;
&lt;li&gt;모집단 (Population): 연구 대상이 되는 전체 집단&lt;/li&gt;
&lt;li&gt;표본 (Sample): 모집단에서 선택된 일부 데이터&lt;/li&gt;
&lt;li&gt;이상치 (Outlier): 데이터의 일반적인 패턴에서 벗어난 값&lt;/li&gt;
&lt;li&gt;특성 스케일링 (Feature Scaling): 특성들의 값 범위를 비슷하게 만드는 과정&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>standard deviation</category>
      <category>variance</category>
      <category>데이터 분포</category>
      <category>분산</category>
      <category>특성 스케일링</category>
      <category>표준편차</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/770</guid>
      <comments>https://move84s.tistory.com/770#entry770comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:10:24 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝에서의 데이터 정규 분포의 의미</title>
      <link>https://move84s.tistory.com/769</link>
      <description>&lt;p&gt;머신러닝에서 데이터의 분포는 모델의 성능에 큰 영향을 미친다. 그중에서도 정규 분포는 통계적 추론과 모델링에서 매우 중요한 역할을 한다. 이 글에서는 정규 분포의 기본적인 개념과 머신러닝에서 정규 분포가 가지는 의미, 그리고 실제 데이터에 적용하는 방법에 대해 자세히 알아본다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  정규 분포(Normal Distribution)란?&lt;/strong&gt;&lt;br&gt;정규 분포는 가우시안 분포(Gaussian Distribution)라고도 불리며, 평균값을 중심으로 좌우 대칭인 종 모양의 분포를 가진다. 정규 분포는 평균(mean)과 표준편차(standard deviation)라는 두 가지 파라미터에 의해 결정된다. 평균은 분포의 중심을 나타내고, 표준편차는 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타낸다. 표준편차가 작을수록 데이터는 평균 주위에 모여 있고, 클수록 넓게 퍼져 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  왜 정규 분포가 중요할까?&lt;/strong&gt;&lt;br&gt;정규 분포는 다음과 같은 이유로 머신러닝에서 중요한 역할을 한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;중심 극한 정리(Central Limit Theorem)&lt;/strong&gt;: 독립적인 확률 변수들의 합은 표본의 크기가 충분히 커질수록 정규 분포에 가까워진다. 이는 많은 자연 현상과 통계적 추론에서 정규 분포를 가정할 수 있는 근거가 된다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;통계적 추론의 용이성&lt;/strong&gt;: 정규 분포를 따르는 데이터는 평균과 표준편차만으로 분포를 완벽하게 설명할 수 있기 때문에, 가설 검정, 신뢰 구간 추정 등 다양한 통계적 추론을 쉽게 수행할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;많은 머신러닝 모델의 가정&lt;/strong&gt;: 선형 회귀(Linear Regression), 로지스틱 회귀(Logistic Regression) 등의 많은 머신러닝 모델은 데이터가 정규 분포를 따른다는 가정을 한다. 데이터가 정규 분포를 따르지 않을 경우, 모델의 성능이 저하될 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  정규 분포와 머신러닝&lt;/strong&gt;&lt;br&gt;머신러닝에서 정규 분포는 데이터 전처리, 모델링, 성능 평가 등 다양한 단계에서 활용된다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;데이터 전처리&lt;/strong&gt;: 데이터가 정규 분포를 따르지 않을 경우, 정규화를 통해 정규 분포에 가깝게 만들 수 있다. 예를 들어, StandardScaler는 데이터를 평균이 0이고 표준편차가 1인 정규 분포로 변환한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;이상치 탐지(Outlier Detection)&lt;/strong&gt;: 정규 분포를 이용하여 이상치를 탐지할 수 있다. 데이터가 정규 분포를 따른다는 가정하에, 평균에서 일정 표준편차 이상 떨어진 값들을 이상치로 간주할 수 있다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;생성 모델(Generative Model)&lt;/strong&gt;: 정규 분포는 Variational Autoencoder(VAE), Generative Adversarial Network(GAN) 등의 생성 모델에서 잠재 공간(latent space)의 분포로 자주 사용된다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt; ️ Python을 이용한 정규 분포 시뮬레이션&lt;/strong&gt;&lt;br&gt;Python의 NumPy와 Matplotlib 라이브러리를 이용하여 정규 분포를 시뮬레이션하고 시각화할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np
import matplotlib.pyplot as plt

# 평균과 표준편차 설정
mu = 0  # 평균
sigma = 1  # 표준편차

# 정규 분포에서 1000개의 샘플 생성
samples = np.random.normal(mu, sigma, 1000)

# 히스토그램 그리기
plt.hist(samples, bins=50, density=True, alpha=0.7, color=&amp;#39;blue&amp;#39;)

# 정규 분포 곡선 그리기
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x - mu)**2 / (2 * sigma**2) ), color=&amp;#39;red&amp;#39;)

plt.title(&amp;#39;Normal Distribution&amp;#39;)
plt.xlabel(&amp;#39;Value&amp;#39;)
plt.ylabel(&amp;#39;Probability Density&amp;#39;)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 평균이 0이고 표준편차가 1인 정규 분포에서 1000개의 샘플을 생성하고, 히스토그램과 정규 분포 곡선을 함께 그리는 예제이다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  정규성 검정(Normality Test)&lt;/strong&gt;&lt;br&gt;데이터가 실제로 정규 분포를 따르는지 확인하기 위해 정규성 검정을 수행할 수 있다. 대표적인 정규성 검정 방법으로는 Shapiro-Wilk 검정, Kolmogorov-Smirnov 검정 등이 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from scipy.stats import shapiro

# Shapiro-Wilk 검정
stat, p = shapiro(samples)
print(&amp;#39;Statistics=%.3f, p=%.3f&amp;#39; % (stat, p))

# p-value가 유의 수준(예: 0.05)보다 작으면 귀무 가설(정규 분포를 따른다는 가설)을 기각한다.
alpha = 0.05
if p &amp;gt; alpha:
    print(&amp;#39;Sample looks Gaussian (fail to reject H0)&amp;#39;)
else:
    print(&amp;#39;Sample does not look Gaussian (reject H0)&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위 코드는 Shapiro-Wilk 검정을 수행하여 데이터가 정규 분포를 따르는지 검정하는 예제이다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  데이터 변환(Data Transformation)&lt;/strong&gt;&lt;br&gt;데이터가 정규 분포를 따르지 않을 경우, 로그 변환(log transformation), Box-Cox 변환 등의 방법을 사용하여 정규 분포에 가깝게 만들 수 있다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;로그 변환&lt;/strong&gt;: 데이터가 양수이고 오른쪽으로 치우쳐진(skewed) 경우, 로그 변환을 통해 분포를 정규 분포에 가깝게 만들 수 있다. 로그 변환은 큰 값을 작게 만들고, 작은 값을 크게 만들어 데이터의 분포를 균등하게 만든다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Box-Cox 변환&lt;/strong&gt;: Box-Cox 변환은 데이터의 분포를 정규 분포에 가깝게 만드는 일반적인 방법이다. Box-Cox 변환은 다음과 같은 수식을 사용한다.&lt;/p&gt;
&lt;p&gt;y = (x^lambda - 1) / lambda  (lambda != 0)&lt;br&gt;y = log(x) (lambda = 0)&lt;/p&gt;
&lt;p&gt;여기서 x는 원래 데이터, y는 변환된 데이터, lambda는 변환 파라미터이다. 최적의 lambda 값을 찾아 데이터를 변환한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;  결론&lt;/strong&gt;&lt;br&gt;정규 분포는 머신러닝에서 매우 중요한 개념이다. 데이터의 분포를 이해하고, 필요에 따라 정규화 또는 변환을 수행함으로써 모델의 성능을 향상시킬 수 있다. 또한, 정규 분포는 다양한 통계적 추론과 모델링에서 기본적인 가정이 되므로, 정규 분포에 대한 이해는 머신러닝 전문가에게 필수적이다.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;핵심 용어 정리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;정규 분포 (Normal Distribution): 평균과 표준편차로 정의되는 종 모양의 분포&lt;/li&gt;
&lt;li&gt;중심 극한 정리 (Central Limit Theorem): 독립적인 확률 변수들의 합은 표본 크기가 커질수록 정규 분포에 가까워짐&lt;/li&gt;
&lt;li&gt;정규성 검정 (Normality Test): 데이터가 정규 분포를 따르는지 확인하는 통계적 검정&lt;/li&gt;
&lt;li&gt;로그 변환 (Log Transformation): 데이터를 로그 스케일로 변환하여 분포를 조정하는 방법&lt;/li&gt;
&lt;li&gt;Box-Cox 변환 (Box-Cox Transformation): 데이터의 분포를 정규 분포에 가깝게 만드는 일반적인 변환 방법&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>머신러닝</category>
      <category>central limit theorem</category>
      <category>normal distribution</category>
      <category>normality test</category>
      <category>정규분포</category>
      <category>정규성검정</category>
      <category>중심극한정리</category>
      <author>move84</author>
      <guid isPermaLink="true">https://move84s.tistory.com/769</guid>
      <comments>https://move84s.tistory.com/769#entry769comment</comments>
      <pubDate>Wed, 16 Apr 2025 07:09:48 +0900</pubDate>
    </item>
  </channel>
</rss>