머신러닝과 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는 데이터 생성, 최적화, 통계 분석 등 다양한 기능을 제공하여 머신러닝 워크플로우를 지원합니다. 특히 간단한 모델을 빠르게 구현하거나, 복잡한 최적화 문제를 해결하는 데 유용하게 활용될 수 있습니다.
'Python SciPy' 카테고리의 다른 글
SciPy를 활용한 신호 처리와 시계열 데이터 분석 (0) | 2025.04.01 |
---|---|
SciPy 최적화와 통계를 결합한 데이터 분석 (0) | 2025.03.31 |
SciPy 레이블링과 객체 분석 (SciPy.ndimage) (0) | 2025.03.30 |
SciPy 엣지 검출과 히스토그램 분석: SciPy.ndimage를 활용한 이미지 처리 (0) | 2025.03.29 |
SciPy 이미지 필터링과 변형 (0) | 2025.03.28 |