Machine Learning in Action ch.8.4 & 8.5 Regression
8.4 데이터를 이해하기 위한 축소 계수
우리가 가지고 있는 데이터의 속성이 데이터 점보다 많다면, 즉,데이터 행렬 X에서 열의 개수(n)이 행의 개수(m)보다 많을 때, 예측 불가능하다.또한 데이터 속성이 데이터 점보다 많다면 데이터 행렬 X에 전체 순위가 없다고 말한다.
이 문제를 해결하기 위해 능형 회귀와 전방향 단계별 회귀라는 두 가지 축소 방법이 존재한다.
8.4.1 능형 회귀
능형 회귀는 추가적인 행렬을 더해 비특이 행렬을 만든다.
람다 값은 모든 ws의 합계에 최댓값을 부여하기 위해 사용된다. 이렇게 뚜렷한 패널티가 있기 때문에 우리는 중요하지 않은 매개변수를 줄일 수 있다. 이것을 축소하고 한다.
축소 방법은 중요하지 않은 매개변수들을 버림으로써 데이터를 더울 더 잘 이해할 수 있게 한다.
def ridgeRegres(xMat,yMat,lam=0.2):
xTx = xMat.T*xMat
denom = xTx + eye(shape(xMat)[1])*lam
if linalg.det(denom) == 0.0:
print("This matrix is singular, cannot do inverse")
return
ws = denom.I * (xMat.T*yMat)
return ws
ridgeTest() 함수에서 서로 다른 30개의 람다 값을 가지고 ridgeRegres() 함수를 호출한다.
위 플롯은 30개의 람다 값에 따른 계수의 변화량을 보여주고 있다.
8.4.2 라소
라소는 일반적인 최소 제곱 회귀와 유사한 능형 회쉬 방정식으로 표현될 수 있다.
능형 회귀는 아래와 같은 제약이 추가된다.
이 식은 모든 가중치들의 제곱의 합이 람다보다 작거나 같다는 것을 의미한다.
능형 회귀와 유사한 또 다른 축소 기술로 라소라는 것이 있다.
라소는 가중치에 대해 다름과 같은 다른 조건을 도입한다.
위 조건에서 제곱이 아닌 절대값으로 취한다.
그림이 구할 수 없어 그냥 말로 적어야 겠다.
8.4.3 전방향 단계별 회귀
여기서는 라소보다 더 쉬우면서 라소와 유사한 결과를 도출하는 알고리즘인 단계별 회귀를 다룬다. 이러한 알고리즘을 탐욕 알고리즘이라 한다.
알고리즘 문제 해결 전략에 나온 탐욕 알고리즘이다.
def stageWise(xArr,yArr,eps=0.01,numIt=100):
xMat = mat(xArr); yMat=mat(yArr).T
yMean = mean(yMat,0)
yMat = yMat - yMean #can also regularize ys but will get smaller coef
xMat = regularize(xMat)
m,n=shape(xMat)
#returnMat = zeros((numIt,n)) #testing code remove
ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy()
for i in range(numIt):
print(ws.T)
lowestError = inf;
for j in range(n):
for sign in [-1,1]:
wsTest = ws.copy()
wsTest[j] += eps*sign
yTest = xMat*wsTest
rssE = rssError(yMat.A,yTest.A)
if rssE < lowestError:
lowestError = rssE
wsMax = wsTest
ws = wsMax.copy()
returnMat[i,:]=ws.T
return returnMat
회귀 계수를 미세하게 변경해가면서 현 시점에서 최적의 계수를 찾는 방법이다.
매 단계마다 각 계수에 단위 증감값을 더한 조합을 구하고
그 중에서 가장 오류가 가장 작은 계수를 선택한다.
이 과정을 지정 회수만큼 반복한다.
8.5 성향/변화량 관계
일반적으로 오류는 성향,오류,임의 노이즈 등 세 가지 구성요소의 합으로 생각된다.
축소 방법을 적용할 때는 계수의 일부가 작아지고 또 어떤 것은 0이 되었다. 이것이 모델에 성향을 추가한 예이다. 계수가 0이 됨으로써 모델의 복잡도를 줄이는 것이다.
8.6 요약
이번 장은 특히 어렵기 때문에 요약을 좀 해야겠다.
회귀는 입력 행렬 X에 대해서 X^T*X의 역행렬을 계산만 할 수 있다면 어떠한 형태의 데이터 집합으로도 수행이 가능하다.
(m,n)인 데이터 행렬에서 m
축소 방법에는 능형 회귀, 라소 회귀, 단계적 선형 회귀 등이 있다.
댓글
댓글 쓰기