이제 머신러닝 알고리즘을 위해 데이터를 준비할 차례이다. 이 작업은 수동으로 하는 대신 함수를 만들어 자동화해야 하는 이유가 있다.
예측 변수와 타깃값에 같은 변형을 적용하지 않기 위해 예측 변수와 레이블을 분리한다. (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_
'Machine Learning > Advanced (hands on machine learning)' 카테고리의 다른 글
7. 모델훈련 - 경사하강법 (0) | 2021.05.18 |
---|---|
6. 모델훈련 - 선형 회귀 (0) | 2021.05.18 |
4. 머신러닝 프로젝트 - 데이터 이해를 위한 탐색과 시각화 (0) | 2021.05.15 |
3- 머신러닝 프로젝트 - 데이터 가져오기 (0) | 2021.05.15 |
2. 머신러닝 프로젝트 - 큰 그림 그리기 (0) | 2021.05.15 |