본문 바로가기
핸즈온 머신러닝

Chapter2 - 머신러닝 프로젝트 처음부터 끝까지(2)

by winston1214 2021. 1. 5.
반응형

2021/01/04 - [핸즈온 머신러닝] - Chapter2 - 머신러닝 프로젝트 처음부터 끝까지(1)

 

Chapter2 - 머신러닝 프로젝트 처음부터 끝까지(1)

Big Picture : 비즈니스의 목적이 무엇인지 정확히 판단해야한다! 성능 지표 선택:  - RMSE(평균 제곱 오차): np.sqrt(mean_square_error(true_y,pred_y)  - MAE(평균 절대 오차) : mean_absolute_error(treu_y,..

bigdata-analyst.tistory.com

 

## 머신러닝을 위한 데이터 준비

데이터 전처리 자동화를 만드는 이유

- 어떤 데이터셋에 대해서도 변환을 빠르게 반복할 수 있다.

- 변환 라이브러리 점진적 구축 가능

- 새 데이터를 주입하기 전에 변환시키는데 함수 사용 가능

- 여러가지 데이터 변환을 쉽게 시도할 수 있고 최적의 조합을 확인할 수 있음

 

## 데이터 정제

종속변수를 따로 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')

imputer

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 (우) LabelEncoding

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상속시켜줘야됨.

 

 

반응형

댓글