2021/01/04 - [핸즈온 머신러닝] - Chapter2 - 머신러닝 프로젝트 처음부터 끝까지(1)
## 머신러닝을 위한 데이터 준비
데이터 전처리 자동화를 만드는 이유
- 어떤 데이터셋에 대해서도 변환을 빠르게 반복할 수 있다.
- 변환 라이브러리 점진적 구축 가능
- 새 데이터를 주입하기 전에 변환시키는데 함수 사용 가능
- 여러가지 데이터 변환을 쉽게 시도할 수 있고 최적의 조합을 확인할 수 있음
## 데이터 정제
종속변수를 따로 housing_labels라는 변수에 저장한 후 독립변수만 있는 데이터셋의 변수를 구축
housing = start_train_set.drop('median_house_value',axis=1) # 종속변수 제거
housing_labels = start_train_set['median_house_value'].copy()
결측치 데이터 처리하는 방법
1. 결측치가 있는 행 제거
2. 전체 특성 제거
3. 특정값으로 결측치 보간
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번
최종적으로 중앙값으로 결측치를 대체하였다.
### Imputer function
핸즈온에 나와있는 sklearn.preprocessing.Imputer 함수는 sklearn이 버전업 되면서 사라지고 SimpleImputer로 대체된다.
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='median')
housing_num = housing.drop('ocean_proximity',axis=1) # 문자열 변수 삭제
imputer.fit(housing_num)
imputer.statistics_ # 각 특성의 중간값을 계산해서 statistics_ 속성에 저장
문자열 변수를 삭제하고 결측치를 중앙값으로 대체한다. strategy 의 옵션에 따라 대체값을 조절할 수 있다.(default='mean')
SimpleImputer 모듈로 각 컬럼의 중앙값을 추출한다.
그리고 transform으로 dataframe 에 적용
X = imputer.transform(housing_num)
housing_tr = pd.DataFrame(X,columns=housing_num.columns,index=list(housing.index.values))
## Sklearn의 설계 철학
•일관성 : 모든 객체가 일관되고 단순한 인터페이스 공유
-Estimator : 모델의 파라미터들을 추정하는 객체(지도 학습에서 학습을 담당. Fitting model 생각하면 됨, 모델을 설계한다.)
-Transformer : 데이터셋 변환기
-Predictor : 예측값 반환
•검사 가능 : 하이퍼파라미터 검사 가능. Imputer.statstics_ 처럼 값 확인도 가능
•클래스 남용 방지 : numpy array or sparse matrix로 반환
•조합성 : 기존의 구성요소를 최대한 재사용. 여러 개를 합칠 수 있음
•합리적인 기본값 : default 값이 웬만하면 있다.
## 텍스트와 범주형 데이터 다루기
문자열을 그대로 모델은 인식을 못한다. 따라서 수치형으로 변환해주는 Encoding을 해야함
Encoding의 큰 종류 -> LabelEncoding, OneHotEncoding
- LabelEncoding(from sklearn.preprocessing import LabelEncoding):
- 범주형 데이터를 숫자로 바꿔주는 것. Ex) 남:0 여:1
- OneHotEncoding(from sklearn.preprocessing import OneHotEncoding)
- 범주형 데이터를 숫자로 바꿔 줌. 하지만! 한 특성이 1이면 나머지 특성은 0
OneHotEncoding 쓰는 경우 : 문자형 분리 자체에 의미를 둘 때(ex. male, Female) -> 단점 : 다중공선성 문제 발생 가능
LabelEncoding 쓰는 경우 : 숫자의 크기가 의미가 있을 때(ex.AGE 카테고리형 변수를 바꿀 때)
LabelEncoding 예시가 적절치 못하지만 나이가 많을수록 더 높은 점수를 주고 싶다 그러면 labelencoding을 사용한다.
labelencoding 단점 : 숫자의 크기에 의미가 부여됨
### 변환기 만들기
from sklearn.base import BaseEstimator, TransformerMixin
# 컬럼 인덱스
rooms_ix, bedrooms_ix, population_ix, household_ix = 3, 4, 5, 6
class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
def __init__(self, add_bedrooms_per_room = True): # no *args or **kargs
self.add_bedrooms_per_room = add_bedrooms_per_room
def fit(self, X, y=None):
return self # nothing else to do
def transform(self, X, y=None):
rooms_per_household = X[:, rooms_ix] / X[:, household_ix]
population_per_household = X[:, population_ix] / X[:, household_ix]
if self.add_bedrooms_per_room:
bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]
return np.c_[X, rooms_per_household, population_per_household,
bedrooms_per_room]
else:
return np.c_[X, rooms_per_household, population_per_household]
attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)
housing_extra_attribs = attr_adder.transform(housing.values)
•Sklearn.base.BaseEstimator, sklearn.base.TransformerMixin 을 상속하며 변환기를 만들 수 있다.
•BaseEstiamtor : class의 매개변수를 가져오고 설정할 수 있음
•TransformerMixin : transform 함수를 구현하기 위한 모듈
•Get_params() 와 set_params()는 파이프라인과 그리드 탐색에 꼭 필요한 method임. 따라서 꼭 BaseEstimator를 상속시켜줘야됨.
'핸즈온 머신러닝' 카테고리의 다른 글
Chapter 4 - 모델 훈련(1) (0) | 2021.01.31 |
---|---|
Chpater3 - 분류 (0) | 2021.01.10 |
Chapter2 - 머신러닝 프로젝트 처음부터 끝까지(3) (0) | 2021.01.05 |
Chapter2 - 머신러닝 프로젝트 처음부터 끝까지(1) (1) | 2021.01.04 |
Chapter1 - 한눈에 보는 머신러닝 (1) | 2020.12.29 |
댓글