피처가 많을 때 머신러닝 어떻게 하나요 - 1편

728x90
반응형

서론

 

데이터를 접하다보면, 피처가 많은 경우가 있습니다. 너무 많은 피처를 어떻게 선택할 것인지, 그리고 어떻게 다룰 것인지에 대해 알아보겠습니다.

 

예시로 캐글의 대회 중 House Prices - Advanced Regression Techniques 데이터를 활용하겠습니다.

https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques

 

House Prices - Advanced Regression Techniques | Kaggle

 

www.kaggle.com

 

1. 데이터 파악하기

 

데이터 프레임을 train로 지정하였습니다.

 

train = pd.read_csv('train 데이터 경로/train.csv')

train.shape()

코드 실행 시 화면

 

해당 코드를 통해 데이터 프레임의 행, 열 갯수를 알 수 있습니다.

 

train.info()

 

코드 실행 시 화면

 

해당 코드를 통해 각 피처별 데이터 갯수, 데이터 타입을 알 수 있습니다.

 

피처의 갯수가 많은 것을 알게 되었습니다. 더군다나, object, int64, float64 타입이 혼재되어 있습니다. 이런 경우에는 우선 타겟 데이터의 분포를 확인하는 것도 방법입니다.

 

이 데이터에서는 SalePrice를 예측하는 Competition이므로, SalePrice의 분포를 우선 살펴보겠습니다.

 

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

ax = sns.distplot(train['SalePrice'])
ax.set(ylabel="Frequency")
ax.set(xlabel="SalePrice")
ax.set(title="SalePrice distribution")
plt.show()

Target 분포 시각화

 

 

Target 데이터의 왜도와 첨도를 알아보겠습니다.

 

# Skew and kurt
print("Skewness: %f" % train['SalePrice'].skew())
print("Kurtosis: %f" % train['SalePrice'].kurt())

 

"왜도(Skewness)"와 "첨도(Kurtosis)"는 데이터의 분포 형태를 설명하는 통계학적 개념입니다.

 

1. 왜도(Skewness): 데이터의 비대칭도를 나타내는 지표입니다. 왜도값이 0이면 데이터의 분포가 정규 분포를 따르며, 왼쪽으로 치우친 경우 왜도값이 0보다 크고, 오른쪽으로 치우친 경우 왜도값이 0보다 작습니다.

 

주어진 데이터의 왜도값은 1.882876으로, 이는 데이터가 왼쪽으로 약간 치우쳐져 있음을 나타냅니다.

 

2. 첨도(Kurtosis): 데이터의 뾰족함을 나타내는 지표입니다. 첨도값이 0이면 데이터의 분포가 정규 분포를 따르며, 첨도값이 0보다 크면 정규 분포보다 뾰족한 분포(즉, 이상치가 더 많은 분포)를 나타내고, 첨도값이 0보다 작으면 정규 분포보다 완만한 분포(즉, 이상치가 더 적은 분포)를 나타냅니다.

 

주어진 데이터의 첨도값은 6.536282로, 이는 정규 분포보다 뾰족한 분포를 가지고 있음을 나타냅니다. 이 두 가지 지표를 통해 데이터의 분포 형태를 이해하는 데 도움이 됩니다.

 

타겟의 분포를 알아보았습니다. 그렇다면, 이번에는 수치형 데이터들과 타겟의 관계를 알아보도록 하겠습니다.

 

numeric_dtypes = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
numeric = []
for i in train.columns:
    if train[i].dtype in numeric_dtypes:
        if i in ['TotalSF', 'Total_Bathrooms','Total_porch_sf','haspool','hasgarage','hasbsmt','hasfireplace']:
            pass
        else:
            numeric.append(i)     

for i, feature in enumerate(list(train[numeric]), 1):
    if(feature=='MiscVal'):
        break
    sns.scatterplot(x=feature, y='SalePrice', data=train)
    plt.show()

피처와의 관계성 시각화
피처와의 관계 시각화2
피처와의 관계 시각화3
피처와의 관계 시각화4

 

수많은 피처들의 각 경향성이 나타납니다. 여기서 우리가 주로 주목할 것은 x축의 증가에 따라 y축에 영향을 주는 피처들입니다. 즉, 유효한 영향을 주는 인자들을 한눈에 볼 수 있습니다.

 

결론

 

많은 피처가 있는 데이터를 처음 접하게 되면 어디서부터 시작할지 막막합니다. 이번 글에서 살펴본 것처럼 데이터의 전체적인 틀을 보고, 선택과 집중을 할 필요가 있습니다. 이후에는 적절한 피처를 찾아서 유효한 피처들을 좀 더 면밀히 분석하고, 학습시키는 과정을 통해 머신러닝을 진행할 수 있습니다.

 

이후에는 피처 엔지니어링 등 작업을 통해 접근하는 방법에 대해 다뤄보도록 하겠습니다.

반응형