본문 바로가기

파이썬 데이터 분석

[python스터디] 머신러닝/비지도학습/차원축소 Feature Selection(변수선택)

안녕하세요 오늘은 머신러닝 스터디 중 비지도학습을 위한 차원축소의 방법으로 '변수선택'

스터디 해보도록 하겠습니다.

 

차원축소를 하는 이유는?

3차원(x,y,z축)그래프를 2차원으로 만든다고 이해하시면 되는데요.

그 이유는

첫번째로 시각적으로 보기 쉽게하기 위한 이유가 있고요.

두번째로 X,Y,Z축을 PC1, PC2 2개축으로 변환함에 따라 새로운 변수가 생기기 때문이고요.

마지막으로 빅데이터는 한개 컬럼만해도 로우값이 100만개에 달한답니다.

변수/특징이 많아지면 이를 채우기 위한 데이터도 많아져야하는데, 여기서 차원의 저주라고 하는 데이터의 문제가 발생할 수 있기 때문죠.

 

그래서 우리는 차원축소의 방법으로 변수선택(Feature Selection)을 실습해보려고 합니다.

변수선택은 한마디로 의미있는 변수만 선택하고 나머지는 버리는 것을 말합니다.

주로 공분산과 상관계수를 이용한 상관분석을 통해 변수와의 상관관계를 파악해서

상관관계가 높으면 선택하고 아니면 선택하지 않습니다.

 

그러기 위해서는 변수와의 관계에 대한 가설을 먼저 세워야겠죠?

우리가 실습할 데이터는 학습데이터로 유명한 보스턴 집값데이터입니다.

 

아래와 같이 여러변수가 있는데,

우리는 범죄율이 높으면 집값이 낮을까?라는 가설을 가지고

범죄율(Crime)과 집값(medv)의 상관관계를 살펴보도록 하겠습니다.

우리의 가설이 맞다면? -> 그래프는 x축 범죄율, y축 집값일 때, 우하향하는 형태를 보여줄 껍니다.

그러면 Seaborn 라이브러리 jointplot을 통해 시각화해서 살펴보도록 하겠습니다.

sns.jointplot(data=data, x='crim', y='medv', kind = 'reg')

우리의 가설이 어느정도 맞다고 판단이 되는데, 공분산과 상관계수를 확인해보겠습니다.

 

공분산을 구하기 위해서는 x.cov(y)라는 함수를 사용하면 쉽게 구할수 있습니다

단, x와 y에 같은 시리즈형의 데이터를 대입해야합니다.

data['crim'].cov(data['medv'])

공분산은 음의 상관관계를 보이는 것으로 보이는데요.

공분산은 사실 x,y값의 영향을 받기 때문에

상관성은 낮지만 절대적 점수가 높은 쪽이 상관성은 높지만 절대적 점수가 낮은 쪽 보다 공분산이 높게 나올 수 있기때문에 꼭 상관계수를 확인해봐야합니다.

 

상관계수는 공분산의 이러한 단점을 보완하기 위해 공분산을 분산의 크기만큼 나눠서

수치가 -1과 1사이에 위치하도록 합니다.

이 때 값은 아래 피어슨의 상관계수에 따라 확인을 해보면 됩니다.

 

 

피어슨의 상관계수

1) 0.9 ~ 0.6 : 강한 상관관계

2) 0.6 ~ 0.3 : 양의 상관관계

3) 0.3 ~ 0.1 : 상관 관계 있음

 

상관계수를 구하는 함수는 x.corr(y)이고 역시 x와 y에 같은 시리즈형의 데이터를 대입합니다

data['crim'].corr(data['medv'])

-0.38로 음의 상관관계가 있다고 볼 수 있겠네요!

 

그래서 범죄율이 높으면 짒갑이 낮아진다라는 가설을 검증하였으므로

범죄율을 변수로 선택해도 된다고 판단이 됩니다.