음수가 아닌 최소 제곱 회귀

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 음수가 아닌 최소 제곱 회귀 (Non-negative least squares regression) 라는, 회귀 계수가 음수가 아닌 제약을 가진 선형 회귀에 대해 배울 것입니다. 파이썬의 scikit-learn 라이브러리를 사용하여 이 알고리즘을 구현하고, 기존의 선형 회귀와 비교해 볼 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접속하십시오.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공해 주시면 문제를 신속하게 해결해 드리겠습니다.

랜덤 데이터 생성

알고리즘을 테스트하기 위해 랜덤 데이터를 생성할 것입니다. 50 개의 특징을 가진 200 개의 샘플을 만들고 각 특징에 대한 실제 계수를 3 으로 설정할 것입니다. 그런 다음 계수를 임계값으로 설정하여 음수가 아닌 값으로 만들 것입니다. 마지막으로 샘플에 약간의 노이즈를 추가할 것입니다.

import numpy as np

np.random.seed(42)

n_samples, n_features = 200, 50
X = np.random.randn(n_samples, n_features)
true_coef = 3 * np.random.randn(n_features)
true_coef[true_coef < 0] = 0
y = np.dot(X, true_coef)
y += 5 * np.random.normal(size=(n_samples,))

데이터를 학습 및 테스트 세트로 분할

데이터를 학습 세트와 테스트 세트로 50% 씩 분할할 것입니다.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)

음수가 아닌 최소 제곱 회귀 적합

이제 음수가 아닌 최소 제곱 회귀를 사용하여 데이터를 적합할 것입니다. 이는 scikit-learn 의 LinearRegression 클래스를 사용하여 positive=True 매개변수로 수행됩니다. 그런 다음 테스트 세트에 대한 값을 예측하고 R2 점수를 계산할 것입니다.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

reg_nnls = LinearRegression(positive=True)
y_pred_nnls = reg_nnls.fit(X_train, y_train).predict(X_test)
r2_score_nnls = r2_score(y_test, y_pred_nnls)
print("NNLS R2 score", r2_score_nnls)

일반 선형 회귀 적합

이제 일반 선형 회귀를 사용하여 데이터를 적합할 것입니다. 이는 scikit-learn 의 LinearRegression 클래스를 사용하여 수행됩니다. 그런 다음 테스트 세트에 대한 값을 예측하고 R2 점수를 계산할 것입니다.

reg_ols = LinearRegression()
y_pred_ols = reg_ols.fit(X_train, y_train).predict(X_test)
r2_score_ols = r2_score(y_test, y_pred_ols)
print("OLS R2 score", r2_score_ols)

회귀 계수 비교

이제 음수가 아닌 최소 제곱 회귀와 일반 선형 회귀 사이의 회귀 계수를 비교할 것입니다. 계수를 서로 그래프로 나타내면 높은 상관관계를 보일 것입니다. 그러나 음수가 아닌 최소 제곱 제약 조건으로 인해 일부 계수가 0 으로 축소됩니다. 이는 음수가 아닌 최소 제곱이 본질적으로 희소 결과를 생성하기 때문입니다.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(reg_ols.coef_, reg_nnls.coef_, linewidth=0, marker=".")

low_x, high_x = ax.get_xlim()
low_y, high_y = ax.get_ylim()
low = max(low_x, low_y)
high = min(high_x, high_y)
ax.plot([low, high], [low, high], ls="--", c=".3", alpha=0.5)
ax.set_xlabel("OLS 회귀 계수", fontweight="bold")
ax.set_ylabel("음수가 아닌 최소 제곱 회귀 계수", fontweight="bold")

요약

이 실험에서 음수가 아닌 최소 제곱 회귀와 일반 선형 회귀의 차이점을 배웠습니다. scikit-learn 을 사용하여 이 알고리즘을 구현하고 무작위 데이터를 생성하여 학습 데이터 세트와 테스트 데이터 세트로 분할하여 일반 선형 회귀와 비교했습니다. 그런 다음 두 모델을 데이터에 적합하고 테스트 세트에 대한 값을 예측하고 R2 점수를 계산했습니다. 마지막으로 두 모델 간의 회귀 계수를 비교하여 음수가 아닌 최소 제곱 회귀가 희소 결과를 생성하는 것을 관찰했습니다.