Day 10 - 핸즈온 머신러닝 2장 - part 4

채원·2025년 7월 20일

핸즈온 머신러닝

목록 보기
5/6

2장이 지나치게 길어지고 있다.
사실 분량이 많은 것도 맞기는 하다...
최대한 빨리 마무리하고 뒷내용으로 넘어가도록... 노력하겠다.


상관관계 조사하기

모든 특성 간의 표준 상관계수corr() 메서드를 사용해 쉽게 계산할 수 있다.

corr_matrix["median_house_value"].sort_values(ascending=False)
median_house_value    1.000000
median_income         0.688380
total_rooms           0.137455
housing_median_age    0.102175
households            0.071426
total_bedrooms        0.054635
population           -0.020153
longitude            -0.050859
latitude             -0.139584
Name: median_house_value, dtype: float64

상관관계의 범위는 -1부터 1까지로, 1에 가까우면 강한 양의 상관관계, -1에 가까우면 강한 음의 상관관계를 가진다는 뜻이다.

판다스의 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))  
plt.show()

이 그림을 보았을 때, 중간 주택 가격을 예측하는 데 중간 소득이 가장 유용해보인다는 것을 발견할 수 있다. 이 산점도를 확대해보자.

이 그래프를 통해 알 수 있는 사실은 다음과 같다.

  1. 상관관계가 매우 강하다.
    • 위쪽으로 향하는 경향이 보인다.
    • 포인트들이 너무 많이 퍼져 있지는 않다.
  2. 가격의 한계값이 수평선으로 잘 보이는데, 이러한 형태가 다른 곳에서도 더 나타나므로 이상한 형태를 알고리즘이 학습하지 않도록 구역을 제거할 수 있다.

특성 조합으로 실험하기

특정 구역의 가구 당 방 개수가 몇 개인지, 방 당 침실 개수가 몇 개인지 등 여러 특성을 조합하여 새로운 특성을 만들 수 있다.

housing["rooms_per_house"] = housing["total_rooms"] / housing["population"]  
housing["bedrooms_ratio"] = housing["total_bedrooms"] / housing["total_rooms"]  
housing["population_per_house"] = housing["population"] / housing["households"]
median_house_value      1.000000
median_income           0.688380
rooms_per_house         0.202050
total_rooms             0.137455
housing_median_age      0.102175
households              0.071426
total_bedrooms          0.054635
population             -0.020153
population_per_house   -0.038224
longitude              -0.050859
latitude               -0.139584
bedrooms_ratio         -0.256397
Name: median_house_value, dtype: float64

기존의 다른 특성들에 비해 bedrooms_ratio, rooms_per_house 특성이 중간 주택 가격과의 상관관계가 높게 나타나는 것을 확인할 수 있다.

머신러닝 알고리즘을 위한 데이터 준비

머신러닝 알고리즘을 위해 데이터를 준비하는 과정은 함수를 만들어 자동화해야 하는데, 그 이유는 다음과 같다.

  • 어떤 데이터셋에 대해서도 데이터 변환을 손쉽게 반복할 수 있음.
  • 향후 프로젝트에 재사용 가능한 변환 라이브러리를 점진적으로 구축할 수 있음.
  • 실제 시스템에서 알고리즘에 새 데이터를 주입하기 전에 이 함수를 사용해 변환할 수 있음.
  • 여러 가지 데이터 변환을 쉽게 시도해볼 수 있고 어떤 조합이 가장 좋은지 확인하는 데 편리함.

데이터 정제

먼저, total_bedrooms 특성에 값이 없는 경우가 있는데, 이를 수정해보자. 방법에는 다음과 같이 세 가지가 있다.

  1. 해당 구역을 제거하기
  2. 전체 특성을 삭제하기
  3. 대체 : 누락된 갓을 어떤 값으로 채우기

판다스의 dropana(), drop(), fillna() 메서드로 이런 작업을 간단하게 처리할 수 있다.

# housing.dropna(subset=["total_bedrooms"], inplace=True)  
  
# housing.drop("total_bedrooms", axis=1, inplace=True)  
  
median = housing["total_bedrooms"].median()  
housing["total_bedrooms"].fillna(median, inplace=True)
profile
학부생

0개의 댓글