Definition
- 연속적인 함수 공간에서 정의된 확률 과정으로, 주어진 데이터로부터 함수의 분포를 추정하는 강력한 비모수적 방법입니다.
- Gaussian Process는 주로 회귀 분석, 분류, 최적화 문제에서 사용되며, 특히 불확실성을 정량화하는 데 유용합니다.
- Bayesian Analytics에서 Infinite Space에 대해 Prior를 적용하기 위한 방안으로 활용됩니다.
Pros & Cons
Pros
- 비모수적 접근: 모델의 구조를 사전 정의하지 않고 데이터로부터 학습합니다.
- 불확실성 정량화: 예측 값뿐만 아니라 예측의 불확실성도 제공하여 모델의 신뢰도를 평가할 수 있습니다.
- 유연성: 다양한 커널 함수를 사용하여 복잡한 데이터 분포를 모델링할 수 있습니다.
- 베이지안 접근: 사전 정보를 결합하여 예측의 신뢰성을 높일 수 있습니다.
Cons
- 고계산 비용: 큰 데이터셋에 대해 계산 비용이 높아질 수 있습니다.
- 메모리 소모: 데이터 포인트 수에 따라 메모리 사용량이 증가합니다.
- 하이퍼파라미터 선택: 최적의 커널 함수와 하이퍼파라미터를 선택하는 과정이 복잡할 수 있습니다.
Sample
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
np.random.seed(42)
order_count = np.random.uniform(1, 10, 100)
time_of_day = np.random.choice([0, 1, 2], size=100)
rider_scale = np.random.uniform(5, 20, 100)
delivery_time = 30 + 3 * distance + 2 * order_count + 100 / rider_acceptance_rate + 100 / rider_scale + np.random.normal(0, 5, 100)
delivery_time[time_of_day == 2] += np.random.normal(0, 10, sum(time_of_day == 2))
X = np.vstack((distance, order_count, time_of_day, rider_acceptance_rate, rider_scale)).T
y = delivery_time
kernel = C(1.0, (1e-3, 1e3)) * RBF(1, (1e-2, 1e2))
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(X, y)
distance_pred = np.linspace(1, 20, 30)
order_count_pred = np.linspace(1, 10, 30)
time_of_day_pred = np.array([0, 1, 2])
rider_acceptance_rate_pred = np.linspace(50, 100, 30)
rider_scale_pred = np.linspace(5, 20, 30)
X_pred = np.array(np.meshgrid(distance_pred, order_count_pred, time_of_day_pred, rider_acceptance_rate_pred, rider_scale_pred)).T.reshape(-1, 5)
y_pred, sigma = gp.predict(X_pred, return_std=True)
plt.figure(figsize=(14, 7))
plt.subplot(1, 2, 1)
plt.scatter(distance, delivery_time, c=time_of_day, cmap='viridis', label='Training Data')
plt.colorbar(label='Time of Day')
plt.xlabel('Distance (km)')
plt.ylabel('Delivery Time (min)')
plt.title('Training Data Distribution')
plt.legend()
plt.subplot(1, 2, 2)
plt.scatter(X_pred[:, 0], y_pred, c=X_pred[:, 2], cmap='viridis', s=10, label='Predictions')
plt.fill_between(X_pred[:, 0], y_pred - 1.96 * sigma, y_pred + 1.96 * sigma, color='blue', alpha=0.2)
plt.colorbar(label='Time of Day')
plt.xlabel('Distance (km)')
plt.ylabel('Delivery Time (min)')
plt.title('Gaussian Process Regression Predictions')
plt.legend()
plt.tight_layout()
plt.show()](<import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
np.random.seed(42)
order_count = np.random.uniform(1, 10, 100)
time_of_day = np.random.choice([0, 1, 2], size=100)
rider_scale = np.random.uniform(5, 20, 100)
delivery_time = 30 + 3 * distance + 2 * order_count + 100 / rider_acceptance_rate + 100 / rider_scale + np.random.normal(0, 5, 100)
delivery_time[time_of_day == 2] += np.random.normal(0, 10, sum(time_of_day == 2))
X = np.vstack((distance, order_count, time_of_day, rider_acceptance_rate, rider_scale)).T
y = delivery_time
kernel = C(1.0, (1e-3, 1e3)) * RBF(1, (1e-2, 1e2))
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)
gp.fit(X, y)
distance_pred = np.linspace(1, 20, 30)
order_count_pred = np.linspace(1, 10, 30)
time_of_day_pred = np.array([0, 1, 2])
rider_acceptance_rate_pred = np.linspace(50, 100, 30)
rider_scale_pred = np.linspace(5, 20, 30)
X_pred = np.array(np.meshgrid(distance_pred, order_count_pred, time_of_day_pred, rider_acceptance_rate_pred, rider_scale_pred)).T.reshape(-1, 5)
y_pred, sigma = gp.predict(X_pred, return_std=True)
plt.figure(figsize=(14, 7))
plt.subplot(1, 2, 1)
plt.scatter(distance, delivery_time, c=time_of_day, cmap='viridis', label='Training Data')
plt.colorbar(label='Time of Day')
plt.xlabel('Distance (km)')
plt.ylabel('Delivery Time (min)')
plt.title('Training Data Distribution')
plt.legend()
plt.subplot(1, 2, 2)
plt.scatter(X_pred[:, 0], y_pred, c=X_pred[:, 2], cmap='viridis', s=10, label='Predictions')
plt.fill_between(X_pred[:, 0], y_pred - 1.96 * sigma, y_pred + 1.96 * sigma, color='blue', alpha=0.2)
plt.colorbar(label='Time of Day')
plt.xlabel('Distance (km)')
plt.ylabel('Delivery Time (min)')
plt.title('Gaussian Process Regression Predictions')
plt.legend()
plt.tight_layout()
plt.show()
Member discussion