Python SciPy

머신러닝과 SciPy의 연동

PyExplorer 2025. 4. 1. 11:36
728x90

머신러닝과 SciPy의 연동

1. 개요

Python에서 머신러닝 작업을 수행할 때 대부분 scikit-learn, TensorFlow, PyTorch와 같은 전용 라이브러리를 활용합니다. 하지만 SciPy 역시 데이터 전처리, 최적화, 통계 분석과 같은 머신러닝의 핵심 작업을 지원하는 기능을 제공합니다. 본 포스팅에서는 SciPy를 활용해 머신러닝 모델을 구축하고, 데이터 분석과 성능 최적화를 진행하는 방법을 알아보겠습니다.

2. SciPy와 머신러닝의 관계

SciPy는 과학적 컴퓨팅을 위한 라이브러리로, 수치 연산과 통계 분석 기능을 제공합니다. 머신러닝에서 SciPy는 다음과 같은 역할을 수행합니다.

  • 데이터 전처리: 희소 행렬(sparse matrix)과 다차원 배열(ndarray) 처리
  • 최적화: scipy.optimize 모듈을 이용한 모델 최적화
  • 통계 분석: scipy.stats를 이용한 데이터 분석과 특성 추출
  • 행렬 연산: scipy.linalg을 이용한 선형 대수 연산

이러한 기능을 이용하면 SciPy만으로도 간단한 머신러닝 워크플로우를 구성할 수 있습니다.

3. SciPy를 활용한 머신러닝 예제

여기서는 다음과 같은 예제를 통해 SciPy와 머신러닝의 연동 방법을 설명하겠습니다.

  • 데이터 생성과 전처리: SciPy의 stats 모듈을 이용해 데이터를 생성하고, 전처리하는 방법
  • 모델 학습: SciPy의 optimize 모듈을 활용해 간단한 선형 회귀 모델을 훈련하는 방법
  • 성능 평가: SciPy의 통계 모듈을 이용한 성능 분석 방법

3.1 데이터 생성과 전처리

먼저, SciPy의 scipy.stats 모듈을 이용해 가상의 데이터를 생성하고 전처리하는 방법을 살펴보겠습니다.

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

# 랜덤 시드 설정
np.random.seed(0)

# 가상의 데이터 생성
x = np.linspace(0, 10, 100)
y = 2.5 * x + 5 + np.random.normal(0, 2, size=len(x))

# 데이터 시각화
plt.scatter(x, y, label='Data')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.title('Generated Data')
plt.show()

이 예제에서는 선형 관계를 가지는 데이터를 생성했습니다. 여기서 노이즈는 정규분포(scipy.stats.norm)를 이용해 추가했습니다.

3.2 선형 회귀 모델 학습

다음으로, SciPy의 optimize.curve_fit을 이용해 선형 회귀 모델을 학습하는 방법을 살펴보겠습니다.

from scipy.optimize import curve_fit

# 선형 모델 정의
def linear_model(x, a, b):
    return a * x + b

# 최적의 파라미터 추정
params, _ = curve_fit(linear_model, x, y)
a, b = params

print(f"Estimated parameters: a = {a:.2f}, b = {b:.2f}")

# 예측과 시각화
y_pred = linear_model(x, a, b)
plt.scatter(x, y, label='Original Data')
plt.plot(x, y_pred, color='red', label='Fitted Line')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.title('Linear Regression using SciPy')
plt.show()

위 코드는 선형 회귀 모델을 정의하고, curve_fit 함수를 사용해 최적의 계수를 추정하는 과정입니다.

3.3 성능 평가

모델의 성능을 평가하기 위해 결정 계수(R²)와 평균 제곱 오차(MSE)를 계산해보겠습니다.

from sklearn.metrics import mean_squared_error, r2_score

# 성능 지표 계산
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)

print(f"Mean Squared Error: {mse:.2f}")
print(f"R-squared: {r2:.2f}")

이 결과를 통해 모델이 데이터를 얼마나 잘 설명하는지 확인할 수 있습니다.

4. 고급 활용: 로지스틱 회귀

SciPy를 이용해 이진 분류 문제를 해결하는 로지스틱 회귀 모델을 구축하는 방법도 살펴보겠습니다.

4.1 데이터 생성

# 이진 분류를 위한 데이터 생성
x = np.linspace(0, 10, 100)
y = (x > 5).astype(int) + np.random.binomial(1, 0.1, size=len(x))

plt.scatter(x, y)
plt.xlabel('X')
plt.ylabel('Class (0 or 1)')
plt.title('Binary Classification Data')
plt.show()

4.2 로지스틱 모델 정의와 최적화

from scipy.special import expit

# 로지스틱 모델 정의
def logistic_model(x, w, b):
    return expit(w * x + b)

# 최적화 수행
params, _ = curve_fit(logistic_model, x, y)
w, b = params

print(f"Estimated parameters: w = {w:.2f}, b = {b:.2f}")

# 예측과 시각화
y_pred = logistic_model(x, w, b)
plt.scatter(x, y, label='Original Data')
plt.plot(x, y_pred, color='red', label='Logistic Regression')
plt.xlabel('X')
plt.ylabel('Probability')
plt.legend()
plt.title('Logistic Regression using SciPy')
plt.show()

이와 같이 SciPy의 최적화 기능을 이용하면 간단한 로지스틱 회귀 모델도 구축할 수 있습니다.

5. 결론

이번 포스팅에서는 SciPy를 활용해 머신러닝 모델을 구축하고 성능을 평가하는 방법을 살펴보았습니다. SciPy는 데이터 생성, 최적화, 통계 분석 등 다양한 기능을 제공하여 머신러닝 워크플로우를 지원합니다. 특히 간단한 모델을 빠르게 구현하거나, 복잡한 최적화 문제를 해결하는 데 유용하게 활용될 수 있습니다.

728x90