작성자: admin 작성일시: 2016-05-31 21:33:51 조회수: 2063 다운로드: 162
카테고리: 머신 러닝 태그목록:

회귀분석용 가상 데이터 생성 방법

Scikit-learn 의 datasets 서브 패키지에는 회귀분석용 가상 데이터를 생성하는 명령어인 make_regression() 이 있다.

선형회귀 데이터

make_regression() 명령으로 만들어진 데이터는 종속 변수 $y$ 의 값이 독립 변수 $x$ 벡터의 선형 조합인 선형관계를 가진다. 다만 정확한 선형관계가 아니라 다변수 정규분포인 오차 $e$ 를 가진다.

$$ y = b + w^T x + e $$

위 식에서 $b$는 y 절편 즉, 바이어스(bias) 값이다.

make_regression() 사용법은 다음과 같다.

  • 입력
    • n_samples : 정수 (옵션, 디폴트 100)
      • 표본의 갯수
    • n_features : 정수 (옵션, 디폴트 100)
      • 독립 변수(feature)의 수(차원)
    • n_targets : 정수 (옵션, 디폴트 1)
      • 종속 변수(target)의 수(차원)
    • n_informative : 정수 (옵션, 디폴트 10)
      • 독립 변수(feature) 중 실제로 종속 변수와 상관 관계가 있는 독립 변수의 수(차원)
    • effective_rank: 정수 또는 None (옵션, 디폴트 None)
      • 독립 변수(feature) 중 서로 독립인 독립 변수의 수. 만약 None이면 모두 독립
    • tail_strength : 0부터 1사이의 실수 (옵션, 디폴트 0.5)
      • effective_rank가 None이 아닌 경우 독립 변수간의 상관 관계 형태를 결정하는 변수
    • bias : 실수 (옵션, 디폴트 0.0)
      • 절편
    • noise : 실수 (옵션, 디폴트 0.0)
      • 출력 즉, 종속 변수에 더해지는 오차의 표준 편차
    • coef : 불리언 (옵션, 디폴트 False)
      • True 이면 선형 모형의 계수도 출력
    • 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개인 경우에는 다음과 같은 관계를 만족하는 임의의 데이터 $x$, $y$, $w$, $e$ 가 만들어진다.

$$ y = b + w x + e $$

$x$는 독립 변수 벡터, $y$는 종속 변수 벡터, $w$는 스칼라값인 계수, $e$는 오차 벡터이다. 오차 벡터는 가우시안 정규 분포를 따른다. $b$는 bias 인수로 주어진 y절편이다.

In:
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)
In:
X
Out:
array([[ 0.97873798],
       [ 2.2408932 ],
       [ 1.86755799],
       [ 0.95008842],
       [ 1.76405235],
       [ 0.4105985 ],
       [-0.97727788],
       [ 0.40015721],
       [-0.10321885],
       [-0.15135721]])
In:
y
Out:
array([  77.48913677,  177.41712535,  147.85924209,   75.22087885,
        139.66444108,   32.50811146,  -77.37353667,   31.6814481 ,
         -8.17209494,  -11.98332915])
In:
w
Out:
array(79.17250380826646)
In:
plt.scatter(X, y, s=100)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

위 코드를 실행하여 나온 선형 모형은 다음과 같다.

$$ y = 79.1725 x $$

noise 인수를 증가시키면 $\text{Var}[e]$가 증가하고 bias 인수를 증가시키면 y 절편 $b$가 증가한다.

In:
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

  1. make_regression과 같은 기능을 하는 함수 make_regression2를 만들어라. 단 make_regression2coef=True 라고 가정한다. 즉 항상 가중치 계수를 반환한다. 또한 1차원 독립 변수만 생성할 수 있으므로 다음과 같은 인수만 가진다.

    • n_samples
    • bias
    • noise
    • random_state
  2. make_regression2 함수에 coef 인수를 추가하여 make_regression3 함수를 만들어라. make_regression3 함수는 가중치를 스스로 생성하지 않고 coef 인수로 받은 가중치 계수 값을 그대로 사용하며 가중치 계수를 반환하지 않는다.

이번에는 n_features 즉, 독립 변수가 2개인 표본 데이터를 생성하여 스캐터 플롯을 그리면 다음과 같다. 종속 변수 값은 점의 명암으로 표시하였다.

In:
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()

만약 실제로 y값에 영향을 미치는 독립 변수는 하나 뿐이라면 다음과 같이 사용한다.

In:
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()

만약 두 독립 변수가 상관관계가 있다면 다음과 같이 생성하고 스캐터 플롯에서도 이를 알아볼 수 있다.

In:
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()
In:
X, y, w = make_regression(n_samples=300, n_features=2, effective_rank=1, noise=0, 
                          tail_strength=1, 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()