비모수 회귀(Nonparametric Regression)는 데이터의 관계를 모델링하는 데에 파라미터화된 함수 형태를 사용하지 않는 회귀 분석 기법입니다. 이는 데이터의 구조나 분포에 대한 가정을 거의 하지 않는다는 점에서 파라미터화된 모형과 대조됩니다. 비모수 회귀는 데이터로부터 학습하여 관계를 모델링하는데, 이를 통해 새로운 입력에 대한 예측을 수행할 수 있습니다.
비모수 회귀는 일반적으로 다음과 같은 방법을 사용하여 구현됩니다.
1. 커널 회귀(Kernel Regression)
커널 회귀는 가까운 이웃 데이터 포인트들의 가중 평균을 사용하여 예측을 수행하는 방법입니다. 입력 데이터 포인트를 중심으로 하는 가중치를 커널 함수를 통해 할당하고, 가중치를 기반으로 예측을 계산합니다. 이를 통해 데이터의 국부적인 패턴을 모델링할 수 있습니다.
library(kernlab)
# 데이터 준비
X <- seq(-5, 5, by = 0.1)
Y <- sin(X) + rnorm(length(X), mean = 0, sd = 0.2)
# 커널 회귀 모델 생성
kernel_model <- ksvm(Y ~ X, data = data.frame(X = X, Y = Y), kernel = "rbfdot", kpar = "automatic")
# 새로운 입력에 대한 예측 수행
new_X <- seq(-5, 5, by = 0.1)
predictions <- predict(kernel_model, data.frame(X = new_X))
2. K-최근접 이웃 회귀(K-Nearest Neighbors Regression)
K-최근접 이웃 회귀는 입력 데이터 포인트 주변의 K개의 가장 가까운 이웃들을 사용하여 예측을 수행하는 방법입니다. 가장 가까운 이웃들의 결과를 평균이나 중앙값 등을 계산하여 예측값을 구합니다. K의 선택에 따라 모델의 유연성이 결정됩니다.
library(caret)
# 데이터 준비
X <- seq(-5, 5, by = 0.1)
Y <- sin(X) + rnorm(length(X), mean = 0, sd = 0.2)
# K-최근접 이웃 회귀 모델 생성
knn_model <- train(X, Y, method = "knn")
# 새로운 입력에 대한 예측 수행
new_X <- seq(-5, 5, by = 0.1)
predictions <- predict(knn_model, data.frame(X = new_X))
3. 회귀 트리(Regression Trees)
회귀 트리는 입력 공간을 분할하는 의사 결정 트리를 사용하여 데이터를 모델링합니다. 각 분할 영역에서의 평균 또는 중앙값을 사용하여 예측을 수행합니다. 이러한 분할은 데이터의 비선형 관계를 모델링할 수 있는 유연성을 제공합니다.
library(rpart)
# 데이터 준비
X <- seq(-5, 5, by = 0.1)
Y <- sin(X) + rnorm(length(X), mean = 0, sd = 0.2)
# 회귀 트리 모델 생성
tree_model <- rpart(Y ~ X, data = data.frame(X = X, Y = Y))
# 새로운 입력에 대한 예측 수행
new_X <- seq(-5, 5, by = 0.1)
predictions <- predict(tree_model, data.frame(X = new_X))
비모수 회귀는 데이터에 대한 가정이 적기 때문에, 비선형성이나 이상치 등 다양한 데이터 패턴에 적합한 모델링을 할 수 있습니다. 그러나 데이터에 따라 적절한 방법을 선택해야하며, 모델의 유연성에 따른 과적합 문제에 주의해야 합니다.
4. Spline 회귀분석
스플라인 회귀(Regularized Splines)는 비선형 회귀 모델링을 위해 사용되는 방법 중 하나입니다. 이 방법은 선형 회귀 모델에 비선형성을 추가하기 위해 스플라인 함수를 사용하며, 회귀 계수에 대한 제약 조건(규제)을 부여하여 과적합을 방지하고 모델의 일반화 성능을 향상시킵니다. 스플라인 회귀는 데이터의 국소적인 패턴을 모델링할 수 있으면서도 부드러운 곡선을 생성하는 장점이 있습니다.
자연 스플라인(Natural Cubic Spline)은 스플라인 회귀 방법 중 하나로, 데이터를 부드럽게 연결하는 비선형 함수를 생성하는 데 사용됩니다. 자연 스플라인은 입력 공간을 구간으로 나누고, 각 구간에서 3차 다항식을 사용하여 데이터의 국부적인 패턴을 모델링합니다. 이때, 자연 스플라인은 데이터의 양 끝 지점에서의 곡률(2차 미분)을 제한함으로써 부드러운 곡선을 생성합니다.
자연 스플라인을 구성하기 위해서는 다음과 같은 단계를 따릅니다:
- 구간 분할: 입력 공간을 여러 구간으로 분할합니다. 일반적으로 구간은 데이터 포인트들의 연속적인 영역으로 설정됩니다.
- 다항식 적합: 각 구간에서 3차 다항식을 적합합니다. 이를 위해 구간별로 다항식의 계수를 결정하는 회귀 문제를 풀어야 합니다.
- 부드러움 조건: 자연 스플라인은 양 끝 지점에서의 곡률을 제한하여 부드러운 곡선을 형성합니다. 이를 위해 추가적인 제약 조건이 필요합니다.
자연 스플라인은 주로 보간(Interpolation) 문제에 사용되며, 데이터 포인트를 통과하는 연속적인 곡선을 생성합니다. 이를 통해 데이터의 국부적인 패턴을 모델링하고 부드러운 예측을 수행할 수 있습니다.
library(splines)
# 데이터 준비
X <- seq(-5, 5, by = 0.1)
Y <- sin(X) + rnorm(length(X), mean = 0, sd = 0.2)
# 자연 스플라인 모델 생성
spline_model <- lm(Y ~ ns(X, df = 4))
# 새로운 입력에 대한 예측 수행
new_X <- seq(-5, 5, by = 0.1)
predictions <- predict(spline_model, data.frame(X = new_X))
5. Local regression
로컬 회귀(Local Regression)는 주어진 데이터 포인트 주변의 국소적인 구조를 모델링하는 비모수 회귀 방법입니다. 로컬 회귀는 가중치 함수를 사용하여 입력 공간에서 가까운 이웃 데이터 포인트에 더 많은 가중치를 부여하고, 해당 이웃 데이터 포인트들을 사용하여 예측을 수행합니다. 이를 통해 데이터의 비선형 패턴을 캡처할 수 있습니다.
library(locfit)
# 데이터 준비
X <- seq(-5, 5, by = 0.1)
Y <- sin(X) + rnorm(length(X), mean = 0, sd = 0.2)
# 로컬 회귀 모델 생성
local_model <- locfit(Y ~ X)
# 새로운 입력에 대한 예측 수행
new_X <- seq(-5, 5, by = 0.1)
predictions <- predict(local_model, newdata = data.frame(X = new_X))
6. GAM(Generalized Addictive Model)
Generalized Additive Model(GAM)은 일반화된 가법 모델로, 비선형 관계를 모델링하기 위해 선형 예측 변수들의 합으로 이루어진 모델입니다. GAM은 선형 모델의 확장으로서, 각 예측 변수가 비선형적으로 데이터에 영향을 미칠 수 있도록 허용합니다.
GAM은 다음과 같은 주요 특징을 가지고 있습니다:
1. 비선형성 모델링: GAM은 각 예측 변수가 비선형적인 형태로 데이터에 영향을 미칠 수 있도록 허용합니다. 이를 위해 예측 변수들을 부분적으로 결합한 함수 형태로 모델링합니다.
2. 가법성(Additivity): GAM은 예측 변수들의 합으로 이루어진 모델로, 각 변수들이 독립적으로 데이터에 영향을 미치며 그 영향은 더해집니다. 이는 모델의 해석력을 높이고, 예측 변수들 간의 상호작용을 간단히 처리할 수 있게 합니다.
3. 일반화된 선형 모델화: GAM은 종속 변수가 연속형일 때 일반화된 선형 모델화를 통해 예측을 수행할 수 있습니다. 종속 변수가 이항형이나 다항형일 경우, 적절한 링크 함수와 오차 분포를 사용하여 일반화 선형 모델화를 적용할 수 있습니다.
library(mgcv)
# 데이터 준비
X <- seq(-5, 5, by = 0.1)
Y <- sin(X) + rnorm(length(X), mean = 0, sd = 0.2)
# GAM 모델 생성
gam_model <- gam(Y ~ s(X))
# 새로운 입력에 대한 예측 수행
new_X <- seq(-5, 5, by = 0.1)
predictions <- predict(gam_model, newdata = data.frame(X = new_X))
댓글