Machine Learning/Advanced (hands on machine learning)

4. 머신러닝 프로젝트 - 데이터 이해를 위한 탐색과 시각화

jwjwvison 2021. 5. 15. 13:28

 먼저 테스트 세트를 떼어놓았는지 확인하고 훈련 세트에 대해서만 탐색을 한다. 훈련 세트를 손상시키지 않기 위해 복사본을 만들어 사용한다.

housing=strat_train_set.copy()

 

 지리 정보(위도와 경도)가 있으니 모든 구역을 산점도로 만들어 데이터를 시각화하는 것은 좋은 생각이다.

# housing.plot(kind='scatter',x='longitude',y='latitude')
plt.scatter(housing['longitude'],housing['latitude'])

 

 이 그림은 캘리포니아 지역을 잘 나타내지만 어떤 특별한 패턴을 찾기는 힘들다. alph 옵션을 0.1로 주면 데이터 포인트가 밀집된 영역을 잘 보여준다.

housing.plot(kind='scatter',x='longitude',y='latitude',alpha=0.1)

 우리 뇌는 그림에서 패턴을 잘 인식해내지만 더 두드러진 패턴을 보려면 매개변수를 다양하게 조절해봐야 한다. 

 

 이제 주택 가격을 나타내보겠다. 원의 반지름은 구역의 인구를 나타내고 (매개변수 s), 색상은 가격을 나타낸다(매개변수 c). 여기서는 미리 정의된 컬러 맵 중 파란색(낮은 가격)에서 빨간색(높은 가격)까지 범위를 가지는 jet를 사용한다 (매개변수 cmap).

housing.plot(kind='scatter',x='longitude',y='latitude',alpha=0.4,s=housing['population']/100,label='population',
             figsize=(10,7),c='median_house_value',cmap=plt.get_cmap('jet'),colorbar=True,sharex=False)
plt.legend()

 

 데이터셋이 너무 크지 않으므로 모든 특성 간의 표준 상관계수(standard correlation coeffieient)corr() 메서드를 이용해 쉽게 계산할 수 있다. 중간 주택 가격과 다른 특성 사이의 상관관계 크기가 얼마나 되는지 살펴보자.

corr_matrix=housing.corr()
corr_matrix['median_house_value'].sort_values(ascending=False)

 상관관계 범위는 -1부터 1까지 이다. 1에 가까우면 강한 양의 상관관계를 가진다는 뜻이다. 0에 가까우면 선형적인 상관관계가 없다는 뜻이다.

 

 특성 사이의 상관관계를 확인하는 다른 방법은 숫자형 특성 사이에 산점도를 그려주는 판다스의 scatter_matrix 함수를 사용하는 것이다.

from pandas.plotting import scatter_matrix

attributes=['median_house_value','median_income','total_rooms','housing_median_age']
scatter_matrix(housing[attributes],figsize=(12,8))

 

 중간 주택 가격을 예측하는 데 가장 유용할 것 같은 특성은 중간 소득 이므로 상관관계 산점도를 확대해보자.

housing.plot(kind='scatter',x='median_income',y='median_house_value',alpha=0.1)

 

 이 그래프는 몇가지 사실을 보여준다. 첫째, 상관관계가 매우 강하다. 위쪽으로 향하는 경향을 볼 수 있으며 포인트들이 너무 널리 퍼져 있지 않다. 둘째, 앞서 본 가격 제한값이 500,000달러 에서 수평선으로 잘 보인다. 하지만 이 그래프에서 직선에 가까운 형태를 더 볼 수 있다. 450,000 근처에 수평선이 보이고 350,000 와 280,000 에도 있고 그 아래 조금 더 보인다. 알고리즘이 데이터에서 이런 이상한 형태를 학습하지 않도록 해당 구역을 제거하는 것이 좋다.

 

 머신러닝 알고리즘용 데이터를 준비하기 전에 마지막으로 해볼 수 있는 것은 여러 특성의 조합을 시도해보는 것이다.

housing['rooms_per_household']=housing['total_rooms']/housing['households']
housing['bedrooms_per_rooms']=housing['total_bedrooms']/housing['total_rooms']
housing['population_per_household']=housing['population']/housing['households']
corr_matrix=housing.corr()
corr_matrix['median_house_value'].sort_values(ascending=False )

 새로운 bedrooms_per_room 특성은 전체 방 개수나 침실 개수보다 중간 주택 가격과의 상관관계가 훨씬 높다.