Machine Learning/Advanced (hands on machine learning)

5. 머신러닝 프로젝트 - 머신러닝 알고리즘을 위한 데이터 준비

jwjwvison 2021. 5. 17. 18:11

 이제 머신러닝 알고리즘을 위해 데이터를 준비할 차례이다. 이 작업은 수동으로 하는 대신 함수를 만들어 자동화해야 하는 이유가 있다.

 예측 변수와 타깃값에 같은 변형을 적용하지 않기 위해 예측 변수와 레이블을 분리한다. (drop()은 데이터 복사본을 만들며 strat_train_set에는 영향을 주지 않는다)

housing=strat_train_set.drop('median_house_value',axis=1)    # median_house_value 를 뺀 데이터
housing_labels=strat_train_set['median_house_value'].copy()  # median_house_value 데이터만 추출

 

 대부분의 머신러닝 알고리즘은 누락된 특성을 다루지 못한다. 이를 고치는 방법에는 세 가지가 있다.

housing.dropna(subset=['total_bedrooms'])  #옵션 1
housing.drop('total_bedrooms',axis=1)      #옵션 2
median=housing['total_bedrooms'].median()  #옵션 3
housing['total_bedrooms'].fillna(median,inplace=True)

 옵션 3을 선택하면 훈련 세트에서 중간값을 계산하고 누락된 값을 이 값으로 채워 넣어야 한다.

 

 사이킷런의 SimpleImputer는 누락된 값을 손쉽게 다루도록 해준다.

from sklearn.impute import SimpleImputer
imputer=SimpleImputer(strategy='median')

 중간값이 수치형 특성에서만 계산될 수 있기 때문에 텍스트 특성인 ocean_proximity를 제외한 데이터 복사본을 생성한다. 그리고 imputer 객체의 fit() 메서드를 사용해 훈련 데이터에 적용할 수 있다.

housing_num=housing.drop('ocean_proximity',axis=1)
imputer.fit(housing_num)

 imputer는 각 특성의 중간값을 계산해서 그 결과를 객체의 statistics_ 속성에 저장한다.

 

이제 학습된 imputer 객체를 사용해 훈련 세트에서 누락된 값을 학습한 중간값으로 바꿀 수 있다.

X=imputer.transform(housing_num)

 이 결과는 변형된 특성들이 들어 있는 평범한 넘파이 배열이다. 이를 다시 판다스 데이터프레임으로 간단히 되돌릴 수 있다.

housing_tr=pd.DataFrame(X,columns=housing_num.columns,index=housing_num.index)

 

 

 지금까지는 수치형 특성만 다루었으므로 텍스트 특성을 살펴보자.

housing_cat=housing[['ocean_proximity']]
housing_cat.head(10)

 이 특성은 범주형 특성이다. 대부분의 머신러닝 알고리즘은 순자를 다루므로 이 카테고리를 텍스트에서 숫자로 변환해보자. 이를 위해 사이킷런의 OrdinalEncoder 클래스를 사용한다.

from sklearn.preprocessing import OrdinalEncoder
ordinal_encoder=OrdinalEncoder()
housing_cat_encoded=ordinal_encoder.fit_transform(housing_cat)
housing_cat_encoded[:10]

 categories_ 인스턴스 변수를 사용해 카테고리 목록을 얻을 수 있다.

ordinal_encoder.categories_

 

 이 표현 방식의 문제는 머신러닝 알고리즘이 가까이 있는 두 값이 떨어져 있는 두 값보다 더 비슷하다고 생각한다는 점이다. 일부 경우에는 괜찮다(예를 들어 'bad', 'average', 'good', 'execellent' 와 같은 순서가 있는 카테고리의 경우). 사이킷런은 범주의 값을 원-핫 벡터로 바꾸기 위한 OneHotEncoder 클래스를 제공한다.

from sklearn.preprocessing import OneHotEncoder
cat_encoder=OneHotEncoder()
housing_cat_1hot=cat_encoder.fit_transform(housing_cat)
housing_cat_1hot

 출력을 보면 넘파이 배열이 아니고 사이파이 희소 행렬(sparse matrix) 이다.

housing_cat_1hot.toarray()

cat_encoder.categories_