728x90
01. 사이킷런 소개와 특징¶
◎ 사이킷런¶
- 사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 라이브러리입니다.
-- 사이킷런 특징
- 쉽고 가장 파이썬스러운 API를 제공합니다.
- 머신러닝을 위한 매우 다양한 알고리즘과 개발을 위한 편리한 프레임워크와 API를 제공합니다.
- 마지막으로 오랜 기간 실전 환경에서 검증됐으며, 매우 많은 환경에서 사용되는 성숙한 라이브러리입니다.
In [1]:
# 사이킷런 불러오기 및 버전 확인
import sklearn
print(sklearn.__version__)
0.24.1
02. 첫 번째 머신러닝 만들어 보기 - 붓꽃 품종 예측하기¶
◎ 붓꽃 품종 예측¶
- 분류는 대표적인 지도학습 방법의 하나입니다.
- 지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블(Label) 데이터로 모델을 학습한 뒤, 별도의 테스트 데이터 세트에서 미지의 레이블을 예측합니다. 이때, 학습을 위해 주어진 데이터 세트를 학습 데이터 세트, 머신러닝 모델의 예측 성능을 평가하기 위해 별도로 주어진 데이터 세트를 테스트 데이터 세트로 지칭합니다.
- ※ 하이퍼 파라미터란 머신러닝 알고리즘별로 최적의 학습을 위해 직접 입력하는 파라미터들을 통칭하며, 하이퍼 파라미터를 통해 머신러닝 알고리즘의 성능을 튜닝할 수 있습니다.
In [2]:
# 붓꽃 데이터 사용하기
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
# 붓꽃 데이터 세트를 로딩합니다.
iris = load_iris()
# iris.data는 Iris 데이터 세트에서 피처만으로 된 데이터를 numpy로 가지고 있습니다.
iris_data = iris.data
# iris.target은 붓꽃 데이터 세트에서 레이블 데이터를 numpy로 가지고 있습니다.
iris_label = iris.target
print('iris target값 : ', iris_label)
print('iris target명 : ', iris.target_names)
iris target값 : [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
iris target명 : ['setosa' 'versicolor' 'virginica']
In [3]:
# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환합니다.
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head()
Out[3]:
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | label | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
In [4]:
# 학습용 데이터와 테스트용 데이터를 분리
X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2,random_state=11)
- train_test_split()의 첫 번째 파라미터인 iris_data는 피처데이터 세트입니다.
- 두 번째 파라미터인 iris_label은 레이블 데이터 세트입니다.
- test_size = 0.2는 전체 데이터 세트 중 테스트 데이터 세트의 비율입니다.
- random _state는 호출할 때마다 같은 학습/테스트 용 데이터 세트를 생성하기 위해 주어지는 난수 발생 값입니다. (random_sate는 raandom값을 만드는 seed와 같은 의미로 숫자 자체는 어떤 값을 지정해도 상관없습니다.)
In [5]:
# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state=11)
# 학습 수행
dt_clf.fit(X_train,y_train)
Out[5]:
DecisionTreeClassifier(random_state=11)
In [6]:
# 학습이 완료된 객체에서 테스트 데이터 세트로 예측 수행.
pred = dt_clf.predict(X_test)
# 정확도 측정
from sklearn.metrics import accuracy_score
print('예측 정확도 : {0:.4f}'.format(accuracy_score(y_test,pred)))
예측 정확도 : 0.9333
03. 사이킷런의 기반 프레임워크 익히기¶
◎ Estimator 이해 및 fit(), predict() 메서드¶
- 사이킷런은 API 일관성과 개발 편의성을 제공하기 위한 노력이 엿보이는 패키지입니다.
- 사이킷런은 ML 모델 학습을 위해서 fit()을, 학습된 모델의 예측을 위해 predict() 메서드를 제공합니다.
- 사이킷런에서는 분류 알고리즘을 구현한 클래스를 Classifier로, 그리고 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭하며 둘을 합쳐서 Estimator라고 부릅니다.
- cross_val_score()와 같은 evaluation 함수, GridSearchCV와 같은 하이퍼 파라미터 튜닝을 지원하는 클래스의 경우 이 Estimator를 인자로 받습니다.
- 비지도학습과 피처 추출에서 fit()은 지도학습의 fit()과 가이 학습을 의미하는 것이 아니라 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업입니다. fit()으로 변환을 위한 사전 구조를 맞추면 이후 입력 데이터의 차원 변환, 클러스터링, 피처 추출 등의 실제 작업은 trasform()으로 수행합니다.
◎ 사이킷런의 주요 모듈¶
- sklearn.preprocessing : 데이터 전처리에 필요한 다양한 가공 기능 제공
- sklearn.feature_selection : 알고리즘에 큰 영향을 미치는 피처를 우선순위대로 셀렉션 작업을 수행하는 다양한 기능 제공
- sklearn.decomposition : 차원 축소와 관련한 알고리즘을 지원하는 모듈로 PCA, NMF, Truncated SVD 등을 통해 차원 축소 기능을 수행할 수 있음
- sklearn.model_selection : 교차 검증을 위한 학습용/테스트용 분리, 그리드 서치로 최적 파라미터 추출 등의 API 제공
- sklearn.metrics : 분류, 회귀, 클러스터링, 페어와이즈에 대한 다양한 성능 측정 방법 제공 / Accuracy, Precision, Recall, ROC-AUC, RMSE 등 제공
- sklearn.ensemble : 앙상블 알고리즘 제공/ 랜덤 포레스트, 에이다 부스트, 그래디언트 부스팅 등을 제공
- sklearn.linear_model : 주로 선형 회귀, 릿지, 라쏘 및 로지스틱 회귀 등 회귀 관련 알고리즘을 지원
- sklearn.neighbors : 최근접 이웃 알고리즘 제공, K-NN 등
- sklearn.svm : 서포트 벡터 머신 알고리즘 제공
- sklearn.tree : 의사 결정 트리 알고리즘 제공
- sklearn.cluster : 비지도 클러스터링 알고리즘 제공(K-평균, 계층형, DBSCAN 등)
- sklearn.pipeline : 피처 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 함께 묶어서 실행할 수 있는 유틸리티 제공
04. Model Selection 모듈 소개¶
- 사이킷런의 model_selection 모듈은 다양한 함수와 클래스를 제공합니다.
◎ 학습/테스트 데이터 세트 분리 - train_test_split()¶
- 테스트 데이터 세트를 이용하지 않고 학습 데이터 세트로만 학습하고 예측한다면 정확도가 100%가 됩니다. 즉, 모의고사를 이미 한 번 보고 답을 알고 잇는 상태에서 모의고사 문제와 똑같은 본고사 문제가 출제됐기 때문입니다.
- 따라서 예측을 수행하는 데이터 세트는 학습을 수행한 학습용 데이터 세트가 아닌 전용의 테스트 데이터 세트여야 합니다.
□ train_test_split()의 파라미터
- test_size : 전체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정합니다. 디폴트는 0.25입니다.
- shuffle : 데이터를 분리하기 전에 데이터를 미리 섞을지를 결정합니다. 디폴트는 True입니다. 데이터를 분산시켜서 좀 더 효율적인 학습 및 테스트 데이터 세트를 만드는 데 사용됩니다.
- random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값입니다. random_state를 지정하지 않으면 수행할 때마다 다른 학습/테스트 용 데이터를 생성합니다. 수행할 때마다 동일한 데이터 세트로 분리하기 위해 random_state를 일정한 숫자 값으로 부여하겠습니다.
- ※학습을 위한 데이터의 양을 일정 수준 이상으로 보장하는 것도 중요하지만, 학습된 모델에 대해 다양한 데이터를 기반으로 예측 성능을 평가해 보는 것도 매우 중요합니다.
◎ 교차 검증¶
- 과적합 : 학습 데이터에만 과도하게 최적화되어, 실제 예측을 다른 데이터로 수행할 경우에는 예측 성능이 과도하게 떨어지는 것을 말한다.
- 고정된 학습 데이터와 테스트 데이터로 평가를 하다 보면 테스트 데이터에만 최적의 성능을 발휘할 수 있도록 편향되게 모델을 유도하는 경향이 생기므로 이런한 문제점을 개선하기 위해 교차 검증을 이용해 더 다양한 학습과 평가를 수행합니다.
- 교차 검증은 이러한 데이터 편중을 막기 위해서 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행합니다.
◎ K 폴드 교차 검증¶
- K 폴드 교차 검증은 가장 보편적으로 사용되는 교차 검증 기법입니다.
- K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴트 세트에 학습과 검증 평가를 반복적으로 수행하는 방법입니다.
◎ Stratified K 폴드¶
- Stratified K 폴드는 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식입니다. 불균형한 분포도를 가진 레이블 데이터 집합은 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것을 말합니다.
- Stratified K 폴드는 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분배합니다. 즉 KFold로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못하는 문제를 해결해 줍니다.
- StratifiedKFold는 레이블 데이터 분포도에 따라 학습/검증 데이터를 나누기 때문에 split() 메서드에 인자로 피처 데이터 세트뿐만 아니라 레이블 데이터 세트도 반드시 필요합니다.
In [7]:
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
import numpy as np
# K 폴드 교차 검증의 단점
kfold = KFold(n_splits=3)
# kfold.split(X)는 폴드 세트를 3번 반복할 때마다 달라지는 학습/테스트 용 데이터 로우 인덱스 번호 반환.
n_iter =0
for train_index, test_index in kfold.split(iris_df):
n_iter += 1
label_train= iris_df['label'].iloc[train_index]
label_test= iris_df['label'].iloc[test_index]
print('## 교차 검증: {0}'.format(n_iter))
print('학습 레이블 데이터 분포:\n', label_train.value_counts())
print('검증 레이블 데이터 분포:\n', label_test.value_counts())
## 교차 검증: 1
학습 레이블 데이터 분포:
1 50
2 50
Name: label, dtype: int64
검증 레이블 데이터 분포:
0 50
Name: label, dtype: int64
## 교차 검증: 2
학습 레이블 데이터 분포:
0 50
2 50
Name: label, dtype: int64
검증 레이블 데이터 분포:
1 50
Name: label, dtype: int64
## 교차 검증: 3
학습 레이블 데이터 분포:
0 50
1 50
Name: label, dtype: int64
검증 레이블 데이터 분포:
2 50
Name: label, dtype: int64
In [8]:
# StratifiedKFold는 K 폴드의 단점을 보완해주는 것을 확인할 수 있다.
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=3)
n_iter=0
for train_index, test_index in skf.split(iris_df, iris_df['label']):
n_iter += 1
label_train= iris_df['label'].iloc[train_index]
label_test= iris_df['label'].iloc[test_index]
print('## 교차 검증: {0}'.format(n_iter))
print('학습 레이블 데이터 분포:\n', label_train.value_counts())
print('검증 레이블 데이터 분포:\n', label_test.value_counts())
## 교차 검증: 1
학습 레이블 데이터 분포:
2 34
0 33
1 33
Name: label, dtype: int64
검증 레이블 데이터 분포:
0 17
1 17
2 16
Name: label, dtype: int64
## 교차 검증: 2
학습 레이블 데이터 분포:
1 34
0 33
2 33
Name: label, dtype: int64
검증 레이블 데이터 분포:
0 17
2 17
1 16
Name: label, dtype: int64
## 교차 검증: 3
학습 레이블 데이터 분포:
0 34
1 33
2 33
Name: label, dtype: int64
검증 레이블 데이터 분포:
1 17
2 17
0 16
Name: label, dtype: int64
※ Stratified K 폴드의 경우 원본 데이터의 레이블 분포도 특성을 반영한 학습 및 검증 데이터 세트를 만들 수 있으므로 왜곡된 레이블 데이터 세트에서는 반드시 Stratified K 폴드를 이용해 교차 검증해야 합니다.
※ 회귀에서는 Stratified K 폴드가 지원되지 않습니다. 그 이유는 회귀의 결정값은 이산값 형태의 레이블이 아니라 연속된 숫자값이기 때문에 결정값별로 분포를 정하는 의미가 없기 때문입니다.
◎ 교차 검증을 보다 간편하게 - cross_val_score()¶
- cross_val_score()는 ① 폴드 세트 설정 ② for 루프에서 반복으로 학습 및 테스트 데이터의 인덱스 추출 ③ 반복적으로 학습과 예측을 숭행하고 예측 성능 반환 이런 일련의 과정을 한꺼번에 수행해주는 API입니다.
□ cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_parms=None, pre_dispatch='2*n_jobs')
- estimator는 분류 알고리즘 크래스 또는 회귀 알고리즘 클래스를 의미
- X는 피처 데이터 세트, y는 레이블 데이터 세트
- scoring은 예측 성능 평가 지표를 기술, cv는 교차 검증 폴드 수를 의미
- 분류인 경우 내부적으로 StratifiedKFold를 이용
- cross_val_score()는 단 하나의 평가 지표만 가능하지만 cross_validate()는 여러 개의 평가 지표를 반환할 수 있습니다.
◎ GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에¶
- 하이퍼 파라미터는 머신러닝 알고리즘을 구성하는 주요 구성 요소이며, 이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있습니다.
- 사이킷런은 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공합니다.
- 즉, 데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 해줍니다.
□ GridSearchCV()의 파라미터
- estimator : classifier, regressor, pipeline이 사용될 수 있습니다.
- param_grid : key + 리스트 값을 가지는 딕셔너리가 주어집니다.
- scoring : 예측 성능을 측정할 평가 방법을 지정합니다.
- cv : 교차 검증을 위해 분할되는 학습/테스트 세트의 개수를 지정합니다
- refit : 디폴트가 True이며 True로 생성 시 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 하이퍼파라이터로 재학습시킵니다.
In [9]:
# GridSearchCV 사용해보기
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
iris_data = load_iris()
data = iris_data.data
label = iris_data.target
# 데이터를 로딩하고 학습데이타와 테스트 데이터 분리
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target,
test_size=0.2, random_state=121)
dtree = DecisionTreeClassifier()
### parameter 들을 dictionary 형태로 설정
parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}
import pandas as pd
# param_grid의 하이퍼 파라미터들을 3개의 train, test set fold 로 나누어서 테스트 수행 설정.
### refit=True 가 default 임. True이면 가장 좋은 파라미터 설정으로 재 학습 시킴.
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)
# 붓꽃 Train 데이터로 param_grid의 하이퍼 파라미터들을 순차적으로 학습/평가 .
grid_dtree.fit(X_train, y_train)
# GridSearchCV 결과 추출하여 DataFrame으로 변환
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', \
'split0_test_score', 'split1_test_score', 'split2_test_score']]
Out[9]:
params | mean_test_score | rank_test_score | split0_test_score | split1_test_score | split2_test_score | |
---|---|---|---|---|---|---|
0 | {'max_depth': 1, 'min_samples_split': 2} | 0.700000 | 5 | 0.700 | 0.7 | 0.70 |
1 | {'max_depth': 1, 'min_samples_split': 3} | 0.700000 | 5 | 0.700 | 0.7 | 0.70 |
2 | {'max_depth': 2, 'min_samples_split': 2} | 0.958333 | 3 | 0.925 | 1.0 | 0.95 |
3 | {'max_depth': 2, 'min_samples_split': 3} | 0.958333 | 3 | 0.925 | 1.0 | 0.95 |
4 | {'max_depth': 3, 'min_samples_split': 2} | 0.975000 | 1 | 0.975 | 1.0 | 0.95 |
5 | {'max_depth': 3, 'min_samples_split': 3} | 0.975000 | 1 | 0.975 | 1.0 | 0.95 |
□ 위 결과의 의미
- max_depth와 min_samples_split을 순차적으로 6번 변경하면서 학습 및 평가 수행
- rank_test_score의 칼럼 값이 1이면 해당 하이퍼 파라미터 조합이 결과 예측 성능 1위라는 의미
- CV가 3인 경우, 즉 3개의 폴딩 세트에서 각각 테스트한 성능 수치
In [10]:
print('GridSearchCV 최적 파라미터:', grid_dtree.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dtree.best_score_))
GridSearchCV 최적 파라미터: {'max_depth': 3, 'min_samples_split': 2}
GridSearchCV 최고 정확도: 0.9750
In [11]:
# GridSearchCV의 refit으로 이미 학습이 된 estimator 반환
estimator = grid_dtree.best_estimator_
# GridSearchCV의 best_estimator_는 이미 최적 하이퍼 파라미터로 학습이 됨
pred = estimator.predict(X_test)
print('테스트 데이터 세트 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))
테스트 데이터 세트 정확도: 0.9667
05. 데이터 전처리¶
- 데이터 전처리(Data Preprocessing)는 ML 알고리즘만큼 중요합니다.
□ ML 알고리즘 적용하기 전 데이터에 대해 미리 처리해야 할 기본 사항
- 결손값, 즉 NaN, Null 값은 허용되지 않습니다. 따라서 Null 값은 고정된 다른 값으로 변환해야 합니다. 대부분 Null 값을 평균값으로 대체하지만 해당 피처의 중요도가 높은 피처이고 Null을 단순히 피처의 평균값으로 대체할 경우 예측 왜곡이 심할 수 있다면 업무 로직 등을 상세히 검토해 더 정밀한 대체 값을 선정해야 합니다.
- 모든 문자열 값은 인코딩돼서 숫자 형으로 변환해야 합니다. 식별자 피처(주민번호)같은 경우 단순히 데이터 로우를 식별하는 용도로 사용되기 때문에 예측에 중요한 요소가 될 수 없으므로 삭제하는 게 더 좋습니다.
◎ 데이터 인코딩¶
- 머신러닝을 위한 대표적인 인코딩 방식은 레이블 인코딩(Label encoding)과 원-핫 인코딩(One Hot encoding)이 있습니다.
- 레이블 인코딩은 카테고리 피처를 코드형 숫자 값으로 변환하는 것입니다.
- 레이블 인코딩을 ML 알고리즘에 적용할 시 예측 성능이 떨어지는 경우가 발생할 수 있습니다. 그 이유는 숫자 값이 크고 작음에 대한 특성이 작용하기 때문입니다. 따라서 이러한 특성 때문에 레이블 인코딩은 선형회귀와 같은 ML 알고리즘에는 적용하지 말고 트리 계열의 ML 알고리즘에 적용하여야 합니다.
In [13]:
# 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
items = ['TV','냉장고','컴퓨터','선풍기','선풍기','TV']
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
print('인코딩 변환값 :', labels)
인코딩 변환값 : [0 1 3 2 2 0]
In [14]:
# 반대도 적용 가능
print('인코딩 클래스 :',encoder.classes_)
# inverse_transform()을 통해 인코딩된 값을 다시 디코딩할 수 있습니다.
print('디코딩 원본값 :',encoder.inverse_transform([1,2,2,3,0]))
인코딩 클래스 : ['TV' '냉장고' '선풍기' '컴퓨터']
디코딩 원본값 : ['냉장고' '선풍기' '선풍기' '컴퓨터' 'TV']
○ 원-핫 인코딩(One-Hot encoding)
- 원-핫 인코딩은 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에ㅔ 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식입니다.
- OneHotencoder로 변환하기 전에 모든 문자열 값이 숫자형으로 변환돼야 합니다. 또한, 입력 값으로 2차원 데이터가 필요합니다.
In [15]:
# 원-핫 인코딩 실습
from sklearn.preprocessing import OneHotEncoder
import numpy as np
items = ['TV','냉장고','컴퓨터','선풍기','선풍기','TV']
# 숫자로 변환
encoder = LabelEncoder()
encoder.fit(items)
labels = encoder.transform(items)
# 2차원 데이터로 변환
labels = labels.reshape(-1,1)
# 원-핫 인코딩 적용
oh_encoder = OneHotEncoder()
oh_encoder.fit(labels)
oh_labels = oh_encoder.transform(labels)
print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
원-핫 인코딩 데이터
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 1. 0.]
[0. 0. 1. 0.]
[1. 0. 0. 0.]]
In [16]:
# 원-핫 인코딩을 더 쉽게 지원하는 get_dummies() API가 존재
import pandas as pd
df = pd.DataFrame({'item': ['TV','냉장고','컴퓨터','선풍기','선풍기','TV']})
pd.get_dummies(df)
Out[16]:
item_TV | item_냉장고 | item_선풍기 | item_컴퓨터 | |
---|---|---|---|---|
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
2 | 0 | 0 | 0 | 1 |
3 | 0 | 0 | 1 | 0 |
4 | 0 | 0 | 1 | 0 |
5 | 1 | 0 | 0 | 0 |
◎ 피처 스케일링과 정규화¶
- 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업을 피처 스케일링(feature scaling)이라고 합니다. 대표적인 방법으로 표준화와 정규화가 있습니다.
- 표준화는 데이터의 피처 각각이 평균 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미합니다.
- 정규화는 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념입니다.
◎ StandardScaler¶
- StandardScaler는 표준화를 쉽게 지원하기 위한 클래스입니다.
- 사이킷런에서 구현한 RBF 커널을 이용하는 서포트 벡터 머신이나 선형 회귀, 로지스틱 회귀는 데이터가 가우시안 분포를 가지고 있다고 가정하고 구현됐기에 사전에 표준화를 적용하는 것은 예측 성능 향상에 중요한 요소가 될 수 있습니다.
◎ MinMaxScaler¶
- MinMaxScaler는 데이터값을 0과 1사이의 범위 값으로 변환합니다.(음수 값이 있으면 -1에서 1값으로 변환)
- 데이터 분포가 가우시안 분포가 아닐 경우에 MinMaxScaler를 적용해 볼 수 있습니다.
◎ 학습 데이터와 테스트 데이터의 스케일링 변환시 유의점¶
- Scaler 객체를 이용해 데이터의 스케일링 변환시 fit(), transform(), fit_transform() 메소드를 이용합니다.
- fit()은 데이터 변환을 위한 기준 정보 설정을 적용
- transform()은 설정된 정보를 이용해 데이터 변환
- fit_transform()은 fit()과 transform()을 한번에 적용하는 기능을 수행합니다.
- 여기서 주의해야할 점은 학습 데이터 세트로 fit()과 transform()을 적용하면 테스트 데이터 세트에서는 다시 fit()을 수행하지 않고 학습 데이터 세트로 fit()을 수행한 결과를 이용해 transform() 변환을 적용해야 한다는 것입니다.
- 즉 학습 데이터로 fit()이 적용된 스케일링 기준 정보를 그대로 테스트 데이터에 적용해야 합니다.
◎ 사이킷런으로 수행하는 타이타닉 생존자 예측¶
- 생략
◎ 정리¶
- 머신러닝 애플리케이션은 데이터 가공 및 변환 과정의 전처리 작업, 데이터를 학습 데이터와 테스트 데이터로 분리하는 데이터 세트 분리 작업을 거친 후에 학습 데이터를 기반으로 머신러닝 알고리즘을 적용해 모델을 학습시킵니다. 그리고 학습된 모델을 기반으로 테스트 데이터에 대한 예측을 수행하고, 이렇게 예측된 결과값을 실제 결과값과 비교해 머신러닝 모델에 대한 평가를 수행하는 방식으로 구성됩니다.
- 이때, 머신러닝 모델은 학습 데이터 세트로 학습한 뒤 반드시 별도의 테스트 데이터 세트로 평가되어야 합니다. 또한 테스트 데이터의 건수 부족이나 고정된 테스트 데이터 세트를 이용한 반복적인 모델의 학습과 평가는 해당 테스트 데이터 세트에만 치우친 빈약한 머신러닝 모델을 만들 가능성이 높습니다.
- 이를 해결하기 위해 사이킷런은 다양한 클래스와 함수를 제공합니다. 또한 머신러닝 모델의 최적의 하이퍼 파라미터를 교차 검증을 통해 추출하기 위한 함수도 제공합니다.
728x90
'Book report > 파이썬 머신러닝 완벽가이드' 카테고리의 다른 글
[파이썬 머신러닝 완벽가이드] 06. 차원 축소 (0) | 2022.09.12 |
---|---|
[파이썬 머신러닝 완벽가이드] 05. 회귀 (0) | 2022.09.11 |
[파이썬 머신러닝 완벽가이드] 04. 분류 (0) | 2022.04.24 |
[파이썬 머신러닝 완벽가이드] 03. 평가 (0) | 2022.04.10 |
[파이썬 머신러닝 완벽가이드] 01. 파이썬 기반의 머신러닝과 생태계 이해 (0) | 2022.03.26 |