Scikit-learn의 datasets 서브 패키지는 회귀분석용 가상 데이터를 생성하는 명령어인 make_regression()
를 제공한다. make_regression()
명령으로 만들어진 데이터는 종속 변수 $y$의 값이 독립 변수 $x$ 벡터의 선형 조합인 선형관계를 가진다. ($b$는 y절편 즉, 바이어스(bias) 값이다)
여기에 정규분포 $\epsilon$만큼의 오차(disturbance)가 추가되는데 이 오차는 종속 변수 $y$에 영향을 미치는 요인 중에서 우리가 고려하지 않는 것들의 영향을 모두 합친 것이라고 생각하면 된다. 중심 극한 정리에 따라 이러한 모든 영향의 합은 정규 분포를 따를 가능성이 높기 때문에 오차 $\epsilon$는 보통 기댓값이 0인 정규 분포 확률 변수로 가정한다.
$$ y = b + w^Tx + \epsilon $$위 식에서 $x$, $w$는 $M$차원 벡터($M$은 입력 차원) $y$, $b$, $\epsilon$는 모두 스칼라 값이다.
복수의 데이터에 대해서는 다음처럼 쓸 수 있다.
$$ y = b\mathbf{1} + Xw + \epsilon $$이 경우에는 $y$는 $N$차원 벡터($N$은 데이터의 갯수), $X$는 $N\times M$차원 행렬($M$은 입력 차원), $w$는 $M$차원 벡터, $\epsilon$는 $N$차원 벡터, $\mathbf{1}$는 $N$차원 1-벡터이다.
make_regression()
명령은 내부적으로 입력(독립 변수) 데이터인 $X$ 행렬, 오차 $\epsilon$ 벡터, 계수 $w$ 벡터를 확률적으로 생성한 후, 위 관계식에 따라 출력(종속 변수) 데이터 $y$ 벡터를 계산하여 $X$, $y$ 값을 출력한다. 자세한 사용법은 다음과 같다.
X, y = make_regression(...)
또는
X, y, w = make_regression(..., coef=True, ...)
입력 인수는 다음과 같다.
n_samples
: 정수 (옵션, 디폴트 100)n_features
: 정수 (옵션, 디폴트 100)n_targets
: 정수 (옵션, 디폴트 1)bias
: 실수 (옵션, 디폴트 0.0)noise
: 실수 (옵션, 디폴트 0.0)coef
: 불리언 (옵션, 디폴트 False)random_state
: 정수 (옵션, 디폴트 None)출력은 다음과 같다.
X
: [n_samples
, n_features
] 형상의 2차원 배열y
: [n_samples
] 형상의 1차원 배열 또는 [n_samples
, n_targets
] 형상의 2차원 배열coef
: [n_features
] 형상의 1차원 배열 또는 [n_features
, n_targets
] 형상의 2차원 배열 (옵션)coef
가 True 인 경우에만 출력됨다음은 독립 변수가 1개, 종속 변수가 1개이며 noise
인수값이 0이므로 오차가 없는 경우이다.
from sklearn.datasets import make_regression
X, y, w = make_regression(n_samples=10, n_features=1, bias=0, noise=0,
coef=True, random_state=0)
X
y
w
plt.scatter(X, y, s=100)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
위 코드를 실행하여 나온 선형 모형은 다음과 같다.
$$ y = 79.1725 x $$noise
인수를 증가시키면 $\text{Var}[\epsilon]$가 증가하고 bias
인수를 증가시키면 y 절편 $b$가 증가한다.
X, y, w = make_regression(n_samples=50, n_features=1, bias=100, noise=10,
coef=True, random_state=0)
plt.scatter(X, y, s=100)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
연습 문제 1¶
|
이번에는 n_features
즉, 독립 변수가 2개인 표본 데이터를 생성하여 스캐터 플롯을 그리면 다음과 같다. 종속 변수 값은 점의 명암으로 표시하였다.
X, y, w = make_regression(n_samples=300, n_features=2, noise=10,
coef=True, random_state=0)
plt.scatter(X[:,0], X[:,1], c=y, s=100, cmap=mpl.cm.bone)
plt.xlabel("x1")
plt.ylabel("x2")
plt.axis("equal")
plt.show()
make_regression
명령은 위에서 설명한 인수 이외에도 다음과 같은 인수를 가질 수 있다.
n_informative
: 정수 (옵션, 디폴트 10)effective_rank
: 정수 또는 None (옵션, 디폴트 None)tail_strength
: 0부터 1사이의 실수 (옵션, 디폴트 0.5)effective_rank
가 None이 아닌 경우 독립 변수간의 상관관계를 결정하는 변수. 0.5면 독립 변수간의 상관관계가 없다.예를 들어 2차원의 x 데이터 중 실제로 y값에 영향을 미치는 독립 변수는 하나 뿐이라면 다음처럼 n_informative=1
로 설정한다.
X, y, w = make_regression(n_samples=300, n_features=2, n_informative=1,
noise=0, coef=True, random_state=0)
plt.scatter(X[:,0], X[:,1], c=y, s=100, cmap=mpl.cm.bone)
plt.xlabel("x1")
plt.ylabel("x2")
plt.axis("equal")
plt.show()
만약 두 독립 변수간의 상관관계를 증가시키고 싶다면 다음처럼 tail_strength
를 0에 가까운 작은 값으로 설정한다.
X, y, w = make_regression(n_samples=300, n_features=2, effective_rank=1, noise=0,
tail_strength=0, coef=True, random_state=0)
plt.scatter(X[:,0], X[:,1], c=y, s=100, cmap=mpl.cm.bone)
plt.xlabel("x1")
plt.ylabel("x2")
plt.axis("equal")
plt.show()
만약 실제로 y값에 영향을 미치는 "종속 변수"는 하나 뿐이라면 다음과 같이 사용한다.
만약 두 "종속 변수"가 상관관계가 있다면 다음과 같이 생성하고 스캐터 플롯에서도 이를 알아볼 수 있다.
=>
여기서 "종속변수"가 아니라 "독립변수"인 것 같습니다.
수정하였습니다. 지적 감사드립니다.