관리 메뉴

FU11M00N

[ numpy ] 다중 회귀분석 본문

AI/Numpy

[ numpy ] 다중 회귀분석

호IT 2021. 4. 5. 11:30

- 다중 회귀분석

변수가 2차원 데이터라면 아래와 같이 예를 들어 데이터를 볼 수 있습니다.

 

x1 = [1,2,3,4]
x2 = [2,2,4,1]
y = [ 4, 6, 10, 9 ] 

이 데이터는

y = 2 * x1 + x2 

이 관계를 이루고 있으며 두 개의 상관계수 2, 1로 이뤄진 관계입니다.

 

변수가 하나 늘어난 것만으로도 이를 한눈에 풀기는 상당히 어려워지며

여기에 상수까지 추가될 경우 직관적으로 관계를 알아채기는 쉽지 않습니다.

하지만 결국 위의 문제는 데이터의 차원이 증가했을 뿐 각각의 변숫값이 각각의 계수와 1차원적으로 결합된 형태이며 이는 기존의 회귀분석으로 충분히 해결이 가능합니다.

 

- 다중 변수 입력값 생성

회귀분석 라이브러리는 기본적으로 다중회귀분석을 지원하도록 설계되어 있으며

이 때문에 변수 값이 하나라도 항상 이를 배열 속에 넣어서 입력하도록 요구합니다.

 

변수가 하나인 회귀분석에서는 이 때문에

x1 = [1,2,3] 
 
x: 
[[1]
 [2]
 [3]]

형태로 reshape 하여 사용했습니다.

 

 

값이 하나 이상인 경우는 다음과 같이 구성합니다.

x1 = [1,2,3,4]
x2 = [2,2,4,1]
 
x : 
[[1 2]
 [2 2]
 [3 4]
 [4 1]]

이는 conatenate 나 c_ 를 사용하면 간단하게 해결이 된다. 먼저 데이터 x1과 x2를 하나의 배열로 묶어줍니다.

x1 = np.array([1,2,3,4])
x2 = np.array([2,2,4,1])
x = np.c_[x1, x2]
print(x)

이제 y 값을 추가해서 회귀분석을 실행해보도록 하겠습니다

 

 

 

이미 x의 값은 2차 원화 되어 있으므로 따로 reshape를 할 필요가 없습니다.

y = np.array( [ 4, 6, 10, 9 ] )
regr.fit(x,y)

아무 에러 회귀분석이 수행된 걸 볼 수 있다. 이를 찍어보면 계수 값 (coef_) 은 해당 입력에 대한 각각의 계수 2와 1의 를 배열로 갖고 있습니다.

 

print("coef:", regr.coef_ )

coef: [3.00065477]

 

- 회귀 분석 결과를 이용해 y값 유추

coef_ 값은 문제는 그래프로 쉽게 표현되던 x->y의 관계에 비해 x1,x2 -> y 의 관계는

이를 시각화시키기가 쉽지 않습니다.

 

하지만 x 입력에 coef를 곱한 후에 더해줌으로써 유추된 상관계수를 사용한 결괏값과 실제 y값을 비교해 볼 수 있다.

이를 위해 먼저 x와 coef를 곱해줍니다.

 

y_ = regr.coef_ * x 
print(y_)

이 결과 [ x1 * 2, x2 * 1 ] 들의 배열이 구성됩니다.

 

좌측과 우측의 값을 더하면 됩니다.

이때 np.sum을 사용하도록 하겠다.

 

np.sum 은 각 축별로 합산 값을 구해줍니다.

## np.sum 사용법 
 
  data = np.array([[1,2], [3,4]])
 
  np.sum(data, axis = 0 ) 
  -> [4,6] 
 
  np.sum(data, axis = 1 ) 
  -> [3, 7] 

이제 np.sum을 이용해 위의 x를 가로축으로 합산해주면 다음과 같습니다.

print( np.sum(y_, axis = 1) ) 

 

 

이것은 결국 x1 * 2 + x2 * 1의 값이 되어 y 값과 같아짐을 알 수 있습니다.

 

스코어 역시 바로 x, y를 대입해서 얻을 수 있습니다.

print(regr.score(x,y))

오차가 없는 선형 데이터 이므로 결정계수가 1가 출력됩니다.

 

- 다중 회귀 분석 예제

# 다음의 데이터를 회귀 분석하여 계수값과 상수값 , 결정 개수 구하기

x1 = np.array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) 
x2 = np.array([0.9, 0.7, 0.2, 0.9, 0.6, 0. , 0.1, 0.6, 0.9, 0.7])
y = np.array([0.69, 0.85, 0.48, 0.75, 0.68, 0.59, 0.65, 0.87, 1.06, 1.16])

# 시작

x = np.c_[x1,x2]
regr.fit(x,y)
print(regr.coef_)
print(regr.intercept_)
print(regr.score(x,y))



2차원 시각화

x1, x2 -> y를 도표화시키기는 쉽지 않지만 (3차원 그래프를 사용해야 가능) 이미지로 표현은 가능합니다.

다음과 같은 관계를 갖는 x1, x2와 y를 생각해보겠습니다.

y = x1 + x2 

이때 다음은 100개의 0~9까지의 x1과 x2의 조합을 만들어 더해줍니다.

x1, x2 = np.ogrid[:10, :10]
print(x1 + x2)

 

좌측 상단은 x1, x2 가 0,0 이므로 0 + 0이며 제일 우측 하단은 9 + 9로 18이 들어갑니다.

 

 

 

이를 이미지화시키면 다음과 같습니다.

plt.imshow(x1 + x2, cmap = 'gray')

이 원리를 이용하여 위에서 다뤘던

x1 = [1,2,3,4]
x2 = [2,2,4,1]
y = [ 4, 6, 10, 9 ] 

회귀 분석한 결과인 아래와 같이 시각화 가능합니다.

coef: [2. 1.]

 

 

x1,x2 = np.ogrid[:10, :10]
plt.imshow( x1 * 2 + x2 , cmap = 'gray')

결과적으로 다음 코드는 회귀분석의 결과를 흑백 이미지로 시각화시켜줍니다.

 

x1,x2 = np.ogrid[:10, :10]
c = regr.coef_
plt.imshow( x1 + c[0] + x2 + c[1] + regr.intercept_ , cmap = 'gray)

 

 

 

# 해당 데이터 시각화 하기
x1 = np.array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
x2 = np.array([0.9, 0.7, 0.2, 0.9, 0.6, 0. , 0.1, 0.6, 0.9, 0.7])
y = np.array([ 7.3,  8.3, 10.2,  8.5,  9.8, 12. , 12.1, 11. , 10.5, 11.5])

 

 

Comments