[빅데이터 직무연구회] 8회차 모임 정리
모임 요일 : 6월 25일 월요일 오후 4시
2장, 3장, 5장 복습
2.3.7 SVM (P. 125 ~ P. 137)
- SVM은 데이터를 여러 그룹으로 분류하는 데에 쓰일 수 있다. (P.129 3차원)
- 학습방법 : 클래스 사이의 경계에 위치한 데이터 포인트 (서포트 벡터) 와의 거리를 계산해 새로운 데이터 포인트 클래스를 예측 (P. 131)
- 매개변수 C와 gamma의 역할 (그림 2-42)
- 데이터 전처리 (= 표준화)
3.3 데이터 전처리와 스케일 조정 (P.169 ~ P.178)
3.3.2 데이터 변환 적용하기
- 전처리 MinMaxScaler
- 훈련세트와 테스트세트로 나누기(In[4])
- 객체생성(In[5])
- fit 메서드로 훈련 데이터 적용(In[6]) - 최솟값과 최댓값 계산
- transform 메서드로 사용해 훈련 데이터스케일 조정(In[7])
- transform 메서드로 테스트 세트도 변환(In[8])
5. 모델 평가와 성능향상 (P. 305)
5.1 교차검증
5.2 그리드서치
매개변수를 튜닝하여 일반화 성능을 개선하는데 사용 (P.316) - https://en.wikipedia.org/wiki/Hyperparameter_optimization
각 파라미터를 적당한 범위 내에서 변경하면서 가장 성능이 좋은 파라미터 값을 검토해주는 방법으로 (ex. C & gamma) 튜닝하여 일반화 성능을 개선시킬 수 있다.
5.2.2 매개변수 과대적합과 검증 세트 (그림 5-5)
Chapter 6. 알고리즘 체인과 파이프라인
1. Pipe line 이란?
2. 모델 체인의 예시
6.1 데이터 전처리와 매개변수 선택
2. 테스트 세트 예측 시
SVC fit : 훈련 폴드 + 검증 폴드
SVC predict : 테스트 세트
scaler fit : 훈련 폴드 + 검증 폴드
따라서 교차 검증의 분할 방식은 모델이 새 데이터를 만났을 때 올바로 반영하지 못한다. 검증 폴드 데이터의 정보가 모델 구축 과정에 이미 누설되었으므로 교차 검증에서 최적의 매개변수를 찾지 못하고 낙관적인 결과가 만들어 지게 된다.
이 문제를 해결하기 위해, 교차 검증의 분할이 모든 전처리 과정보다 앞서 이뤄져야 한다. 따라서 Pipeline 기능을 사용하면 된다.
6.2 파이프라인 구축하기
6.3 그리드 서치에 파이프라인 적용하기
6.4 파이프라인 인터페이스
파이프라인에 들어갈 추정기는 마지막 단계를 제외하고는 모두 transform 메서드를 가지고 있어야 한다.
내부적으로 Pipeline.fit 메서드가 실행되는 동안, 파이프라인은 각 단계에서 이전 단계의 transform의 출력을 입력으로 받아 fit 과 transform 메서드를 차례로 호출한다. (또는 fit_transform ) 그리고 마지막 단계는 fit 메서드만 호출한다.
6.4.1 make_pipeline 을 사용한 파이프라인 생성
각 단계의 이름을 지정하지 않으면, 자동으로 만들어준다. 파이썬 클래스 이름의 소문자 버전이다. 같은 파이썬 클래스를 사용하면 이름 뒤에 숫자가 추가로 붙는다.
의미 있는 이름을 붙이려면 Pipeline으로 객체를 직접 만드는 것이 좋다.
6.4.2 단계 속성에 접근하기
6.4.3 그리드 서치 안의 파이프라인 속서에 접근하기
GridSearchCV로 최적의 모델을 찾은 후 전체 훈련 데이터로 학습한 모델이 grid.best_estimator_ 에 저장되어 있다. 한 단계의 best_estimator_ 에 접근하려면, 파이프라인의 named_steps 속성을 사용한다.
6.5 전처리와 모델의 매개변수를 위한 그리드 서치
6.6 모델 전략을 위한 그리드 서치
%load_ext watermark
%watermark -v -p sklearn,numpy,scipy,matplotlib
%matplotlib inline
from preamble import *
from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 데이터 적재와 분할
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
# 훈련 데이터의 최솟값, 최댓값을 계산합니다
scaler = MinMaxScaler().fit(X_train)
# 훈련 데이터의 스케일을 조정합니다
X_train_scaled = scaler.transform(X_train)
svm = SVC()
# 스케일 조정된 훈련데이터에 SVM을 학습시킵니다
svm.fit(X_train_scaled, y_train)
# 테스트 데이터의 스케일을 조정하고 점수를 계산합니다
X_test_scaled = scaler.transform(X_test)
print("테스트 점수: {:.2f}".format(svm.score(X_test_scaled, y_test)))
from sklearn.model_selection import GridSearchCV
# 이 코드는 예를 위한 것입니다. 실제로 사용하지 마세요.
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],
'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
grid = GridSearchCV(SVC(), param_grid=param_grid, cv=5)
grid.fit(X_train_scaled, y_train)
print("최상의 교차 검증 정확도: {:.2f}".format(grid.best_score_))
print("테스트 점수: {:.2f}".format(grid.score(X_test_scaled, y_test)))
print("최적의 매개변수: ", grid.best_params_)
mglearn.plots.plot_improper_processing()
from sklearn.pipeline import Pipeline
pipe = Pipeline([("scaler", MinMaxScaler()), ("svm", SVC())])
pipe.fit(X_train, y_train)
print("테스트 점수: {:.2f}".format(pipe.score(X_test, y_test)))
param_grid = {'svm__C': [0.001, 0.01, 0.1, 1, 10, 100],
'svm__gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)
grid.fit(X_train, y_train)
print("최상의 교차 검증 정확도: {:.2f}".format(grid.best_score_))
print("테스트 세트 점수: {:.2f}".format(grid.score(X_test, y_test)))
print("최적의 매개변수: {}".format(grid.best_params_))
mglearn.plots.plot_proper_processing()
rnd = np.random.RandomState(seed=0)
X = rnd.normal(size=(100, 10000))
y = rnd.normal(size=(100,))
from sklearn.feature_selection import SelectPercentile, f_regression
select = SelectPercentile(score_func=f_regression, percentile=5).fit(X, y)
X_selected = select.transform(X)
print("X_selected.shape: {}".format(X_selected.shape))
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Ridge
print("교차 검증 점수 (릿지): {:.2f}".format(
np.mean(cross_val_score(Ridge(), X_selected, y, cv=5))))
pipe = Pipeline([("select", SelectPercentile(score_func=f_regression,
percentile=5)),
("ridge", Ridge())])
print("교차 검증 점수 (파이프라인): {:.2f}".format(
np.mean(cross_val_score(pipe, X, y, cv=5))))
def fit(self, X, y):
X_transformed = X
for name, estimator in self.steps[:-1]:
# 마지막 단계를 빼고 fit과 transform을 반복합니다
X_transformed = estimator.fit_transform(X_transformed, y)
# 마지막 단계 fit을 호출합니다
self.steps[-1][1].fit(X_transformed, y)
return self
def predict(self, X):
X_transformed = X
for step in self.steps[:-1]:
# 마지막 단계를 빼고 transform을 반복합니다
X_transformed = step[1].transform(X_transformed)
# 마지막 단계 predict을 호출합니다
return self.steps[-1][1].predict(X_transformed)
from sklearn.pipeline import make_pipeline
# 표준적인 방법
pipe_long = Pipeline([("scaler", MinMaxScaler()), ("svm", SVC(C=100))])
# 간소화된 방법
pipe_short = make_pipeline(MinMaxScaler(), SVC(C=100))
print("파이프라인 단계:\n{}".format(pipe_short.steps))
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
pipe = make_pipeline(StandardScaler(), PCA(n_components=2), StandardScaler())
print("파이프라인 단계:\n{}".format(pipe.steps))
# cancer 데이터셋에 앞서 만든 파이프라인을 적용합니다
pipe.fit(cancer.data)
# "pca" 단계의 두 개 주성분을 추출합니다
components = pipe.named_steps["pca"].components_
print("components.shape: {}".format(components.shape))
from sklearn.linear_model import LogisticRegression
pipe = make_pipeline(StandardScaler(), LogisticRegression())
param_grid = {'logisticregression__C': [0.01, 0.1, 1, 10, 100]}
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=4)
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
print("최상의 모델:\n{}".format(grid.best_estimator_))
print("로지스틱 회귀 단계:\n{}".format(
grid.best_estimator_.named_steps["logisticregression"]))
print("로지스틱 회귀 계수:\n{}".format(
grid.best_estimator_.named_steps["logisticregression"].coef_))
from sklearn.datasets import load_boston
boston = load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target,
random_state=0)
from sklearn.preprocessing import PolynomialFeatures
pipe = make_pipeline(
StandardScaler(),
PolynomialFeatures(),
Ridge())
param_grid = {'polynomialfeatures__degree': [1, 2, 3],
'ridge__alpha': [0.001, 0.01, 0.1, 1, 10, 100]}
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5, n_jobs=-1)
grid.fit(X_train, y_train)
mglearn.tools.heatmap(grid.cv_results_['mean_test_score'].reshape(3, -1),
xlabel="ridge__alpha", ylabel="polynomialfeatures__degree",
xticklabels=param_grid['ridge__alpha'],
yticklabels=param_grid['polynomialfeatures__degree'], vmin=0)
print("최적의 매개변수: {}".format(grid.best_params_))
print("테스트 세트 점수: {:.2f}".format(grid.score(X_test, y_test)))
param_grid = {'ridge__alpha': [0.001, 0.01, 0.1, 1, 10, 100]}
pipe = make_pipeline(StandardScaler(), Ridge())
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
print("다항 특성이 없을 때 점수: {:.2f}".format(grid.score(X_test, y_test)))
pipe = Pipeline([('preprocessing', StandardScaler()), ('classifier', SVC())])
from sklearn.ensemble import RandomForestClassifier
param_grid = [
{'classifier': [SVC()], 'preprocessing': [StandardScaler()],
'classifier__gamma': [0.001, 0.01, 0.1, 1, 10, 100],
'classifier__C': [0.001, 0.01, 0.1, 1, 10, 100]},
{'classifier': [RandomForestClassifier(n_estimators=100)],
'preprocessing': [None], 'classifier__max_features': [1, 2, 3]}]
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.2f}".format(grid.best_score_))
print("테스트 세트 점수: {:.2f}".format(grid.score(X_test, y_test)))
'인공지능' 카테고리의 다른 글
[빅데이터 직무연구회] 7회차 모임 정리 - 소스 (0) | 2018.06.26 |
---|---|
[빅데이터 직무연구회] 7회차 모임 정리 (0) | 2018.06.26 |
[빅데이터 직무연구회] 6회차 모임 정리 (2) (0) | 2018.06.06 |
[빅데이터 직무연구회] 6회차 모임 정리 (1) (0) | 2018.06.06 |
[빅데이터 직무연구회] 5회차 모임 예제 소스 (3) (0) | 2018.05.19 |
댓글