자료를 공개한 저자 오렐리앙 제롱에게 깊은 감사를 드립니다. 이와 더불어 한빛미디어로부터 강의준비에 필요한 자료를 지원받았음을 밝히며, 이에 대해 진심어린 감사를 전합니다.
head()
, info()
, describe()
, hist()
등을 사용하여 데이터 구조 훑어보기head()
메서드 활용 결과¶info()
메서드 활용 결과¶모델 학습 시작 이전
테스트 세트에 포함된 데이터는 미리 분석하지 말 것.
훈련 세트와 데이터 세트를 구분하는 방식에 따라 결과가 조금씩 달라짐
여기서는 계층적 샘플링 활용
계층: 동질 그룹
테스트 세트: 전체 계층을 대표하도록 각 계층별로 적절한 샘플 추출
소득의 범주: 계층별로 충분한 크기의 샘플이 포함되도록 지정
대부분 구역의 중간 소득이 1.5~6.0(15,000~60,000$) 사이
소득 구간을 아래 숫자를 기준으로 5개로 구분
[0, 1.5, 3.0, 4.6, 6.0, np,inf]
구역이 집결된 지역과 그렇지 않은 지역 구분 가능
샌프란시스코의 베이 에어리어, LA, 샌디에고 등 밀집된 지역 확인 가능
'조합 특성 추가' 과정도 다른 사이킷런 API와 호환이 되는 방식으로 사용자가 직접 구현하는 방법을 설명
사이킷런에서 제공하는 API는 일관되고 단순한 인터페이스를 제공
누락된 특성값 존재 경우
total_bedrooms
특성에 207개 구역에 대한 값이 null로 채워져 있음, 즉, 일부 구역에 대한 정보가 누락됨.
생성되는 더미 특성은 사용된 범주를 사용
예를 들어, 해안 근접도 특성 대신에 다섯 개의 범주 전부를 새로운 특성으로 추가 -> 각각의 특성값을 아래와 같이 정함
앞서 살펴본 다음 세 가지 특성을 자동으로 추가하는 변환기 클래스를 정의
변환기 클래스를 선언하기 위해서는 fit() 메서드와 transform() 메서드만 정의하면 됨
주의: fit() 메서드의 리턴값은 self
class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
def __init__(self, add_bedrooms_per_room = True):
...
def fit(self, X, y=None):
return self
def transform(self, X):
...
정규화(normalization)라고도 불림
특성값 $x$를 $\frac{x-min}{max-min}$로 변환
변환 결과: 0에서 1 사이
특성값 $x$ 를 $\frac{x-\mu}{\sigma}$로 변환
결과: 변환된 데이터들이 표준정규분포를 이룸
사이킷런의 Pipeline 클래스가 이 기능을 지원
수치형 데이터 전처리 과정을 파이프라인으로 묶은 방법
pipeline
클래스 활용¶num_pipeline = Pipeline([
('imputer', SimpleImputer(strategy="median")),
('attribs_adder', CombinedAttributesAdder()),
('std_scaler', StandardScaler()),
])
마지막 추정기를 제외하면 모두 변환기 즉, fit_transform() 메서드를 포함하고 있어야 함
생성된 파이프라인 객체의 fit() 메서드를 호출하면, 마지막 단계 이전까지는 해당 변환기의 fit_transform() 메소드가 연속해서 호출되며, 최종적으로 마지막 추정기의 fit() 메서드가 호출
사이킷런의 ColumnTransformer
클래스를 이용하여 특성별로 지정된 전처리를 처리할 수 있도록 지정 가능
num_pipeline
변환기OneHotEncoder
변환기full_pipeline = ColumnTransformer([
("num", num_pipeline, num_attribs),
("cat", OneHotEncoder(), cat_attribs),
])
housing_prepared = full_pipeline.fit_transform(housing)
전처리 후 두 요소를 결정해야함
목표: 구역별 중간 주택 가격 예측 모델
MAE는 맨해튼 노름 또는 $\ell_1$ 노름으로도 불림
이상치가 많은 경우 활용
LinearRegression
예측기 클래스가 제공from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)
lin_reg.predict(housing_prepared))
DecisionTreeRegressor
예측기가 결정 트리 회귀 모델을 생성from sklearn.tree import DecisionTreeRegressor
tree_reg = DecisionTreeRegressor(random_state=42)
tree_reg.fit(housing_prepared, housing_labels)
housing_predictions = tree_reg.predict(housing_prepared)
from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_reg, housing_prepared, housing_labels,
scoring="neg_mean_squared_error", cv=10)
tree_rmse_scores = np.sqrt(-scores)
주의
효용함수: k-겹 교차 검증의 모델 학습 과정에서 성능을 측정할 때 높을 수록 좋은 효용함수 활용
RMSE의 음숫값을 이용하여 훈련되는 모델 평가
scoring="neg_mean_squared_error"
교차 검증 결과 평가를 위해 다시 음숫값(-scores
)을 사용해야 함.
lin_scores = cross_val_score(lin_reg, housing_prepared, housing_labels,
scoring="neg_mean_squared_error", cv=10)
lin_rmse_scores = np.sqrt(-lin_scores)
display_scores(lin_rmse_scores)
RandomForestRegressor
사용법은 기본적으로 동일함.from sklearn.ensemble import RandomForestRegressor
forest_reg = RandomForestRegressor(n_estimators=100, random_state=42)
forest_reg.fit(housing_prepared, housing_labels)
housing_predictions = forest_reg.predict(housing_prepared)
GridSearchCV
활용cv=5
)이므로, 총 ($18 \times 5 = 90$)번 훈련함.from sklearn.model_selection import GridSearchCV
param_grid = [
{'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},
{'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},
]
forest_reg = RandomForestRegressor(random_state=42)
grid_search = GridSearchCV(forest_reg, param_grid, cv=5,
scoring='neg_mean_squared_error',
return_train_score=True)
grid_search.fit(housing_prepared, housing_labels)
조합의 수가 커지거나, 설정된 탐색 공간이 커지면 랜덤 탐색이 효율적
사이킷런의 RandomizedSearchCV
추정기가 랜덤 탐색을 지원
n_iter=10
: 랜덤 탐색이 총 10회 진행n_estimators
와 max_features
값을 지정된 구간에서 무작위 선택cv=5
: 5-겹 교차검증. 따라서 랜덤 포레스트 학습이 ($10 \times 5=50$)번 이루어짐from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
param_distribs = {
'n_estimators': randint(low=1, high=200),
'max_features': randint(low=1, high=8),
}
forest_reg = RandomForestRegressor(random_state=42)
rnd_search = RandomizedSearchCV(forest_reg, param_distributions=param_distribs,
n_iter=10, cv=5, scoring='neg_mean_squared_error', random_state=42)
rnd_search.fit(housing_prepared, housing_labels)
그리드 탐색과 랜덤 탐색 등을 통해 얻어진 최상의 모델을 분석해서 문제에 대한 좋은 통창을 얻을 수 있음
예를 들어, 최상의 랜덤 포레스트 모델에서 사용된 특성들의 중요도를 확인하여 일부 특성을 제외핳 수 있음.
final_model = grid_search.best_estimator_
테스트 세트 전처리
transform()
메서드를 직접 활용fit()
메서드는 전혀 사용하지 않음최상의 모델을 이용하여 예측하기
최상의 모델 평가 및 론칭