# 사이킷런 버전 확인 import sklearn print(sklearn.__version__)
0.23.1
02. 첫 번째 머신러닝 - 붓꽃 품종 예측
붓꽃 데이터 세트로 붓꽃의 품종을 분류(classification)
붓꽃 데이터 세트: 꽃잎 길이, 너비, 꽃받침 길이, 너비 피차(feature)를 기반으로 꽃 품종을 예측하기 위한 데이터 세트
분류는 대표적인 지도학습(Supervised Learning) 방법의 하나
지도학습
학습을 위한 다양한 피처와 분류 결정값인 레이블 데이터로 모델을 학습한 뒤, 별도의 테스트 데이터 세트에서 미지의 레이블을 예측 → 지도학습은 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식
학습 데이터 세트: 학습을 위해 주어진 데이터 세트
테스트 데이터 세트: 머신러닝 모델의 예측 성능 평가를 위해 주어진 데이터 세트
1 2 3 4 5 6 7 8
# 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임 from sklearn.datasets import load_iris
# sklearn.tree 내 모듈은 트리 기반 ML 알고리즘을 구현한 클래스 모임 from sklearn.tree import DecisionTreeClassifier
# 학습 데이터와 검증 데이터, 예측데이터로 데이터를 분리하거나 최적의 하이퍼 파라미터로 평가하기 위한 다양한 모듈의 모임 from sklearn.model_selection import train_test_split
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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)
# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환 iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names) iris_df['label'] = iris.target iris_df.head(3)
random_state: 호출 시마다 같은 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 발생 값 (여기서는 값 고정을 위해 임의 숫자를 넣음)
train_test_split(): 호출 시 무작위로 데이터를 분리 → random_state를 지정하지 않으면 수행할 때마다 다른 학습/테스트용 데이터가 생성됨
train_test_split() 구분
X_train
X_test
y_train
y_test
학습용 피처 데이터 세트
테스트용 피처 데이터 세트
학습용 레이블 데이터 세트
테스트용 레이블 데이터 세트
의사결정나무로 학습과 예측 수행
사이킷런 의사결정나무 클래스인 DecisionTreeClassifier를 객체로 생성
생성된 DecisionTreeClassifier 객체의 fit() 메서드에 학습용 피처 데이터 속성과 결정값 데이터 세트를 입력해 호출
1 2 3 4 5
# DecisionTreeClassifier 객체 생성 dt_clf = DecisionTreeClassifier(random_state=11) # 같은 학습/예측 결과를 위해 random 값 임의 지정
# 학습 수행 dt_clf.fit(X_train, y_train)
DecisionTreeClassifier(random_state=11)
위 코드 실행 결과, DecisionTreeClassifier 객체는 학습 데이터 기반으로 학습 완료
학습된 객체를 이용해 예측 수행
예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용해야 하며, 일반적으로 테스트 데이터 세트를 이용
DecisionTreeClassifier 객체의 predict() 메서드에 테스트용 피처 데이터 세트를 입력해 호출하면, 학습된 모델 기반에서 테스트 데이터 세트에 대한 예측값을 반환
1 2
# 학습 완료된 객체에서 테스트 데이터 세트로 예측 수행 pred = dt_clf.predict(X_test)
예측 결과 기반으로 DecisionTreeClassifier의 예측 성능 평가하기
해당 예제에서는 정확도(예측 결과가 실제 레이블값과 얼마나 일치하는지) 평가
사이킷런에서는 정확도 측정을 위해 accuracy_score() 함수 제공
accuracy_score: 첫 번째 파라미터로 실제 레이블 데이터 세트, 두 번째 파라미터로 예측 레이블 데이터 세트 입력
1 2
from sklearn.metrics import accuracy_score print('예측 정확도: {0: 4f}'.format(accuracy_score(y_test, pred)))
예측 정확도: 0.933333
학습한 의사결정나무 알고리즘 예측 정확도가 약 0.9333(93.33%)으로 측정됨
데이터 세트 분리: 데이터를 학습 데이터와 테스트 데이터로 분리
모델 학습: 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킴
예측 수행: 학습된 ML 모델로 테스트 데이터의 분류(즉, 붓꽃 종류) 예측
평가: 예측된 결괏값과 테스트 데이터의 실제 결괏값을 비교해 ML 모델 성능을 평가
03. 사이킷런의 기반 프레임워크 익히기
1. Estimator 이해 및 fit(), predict() 메서드
사이킷런은 API 일관성과 개발 편의성을 제공하기 위한 패키지
사이킷런을 ML 모델 학습을 위해 fit()을, 학습된 모델의 예측을 위해 predict() 메서드를 제공
지도학습의 주요 두 축인 분류(classification)와 회귀(regression)의 다양한 예측 결과를 반환
사이킷런에서는 분류 알고리즘을 구현한 클래스를 classifier로, 회귀 알고리즘을 구현한 클래스를 regressor로 지칭
사이킷런은 매우 많은 유형의 classifier와 regressor 클래스를 제공: 이를 합쳐 Estimator 클래스라고 부름
사이킷런에서 비지도학습인 차원 축소, 피처 추출 등을 구현한 클래스 역시 대부분 fit()과 transform()을 적용
비지도학습과 피처 추출에서 fit()은 지도학습의 fit() 같이 학습을 의미하는 것이 아니라, 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업
fit()으로 변환을 위한 사전 구조를 맞추면 이후 입력 데이터의 차원 변환, 클러스터링, 피처 추출 등의 실제 작업은 transform()으로 수행
사이킷런은 fit()과 transform()을 하나로 결합한 fit_transform()도 함께 제공
2. 사이킷런의 주요 모듈
교재 참고
3. 내장된 예제 데이터 세트
분류나 회귀 연습용 예제 데이터
API명
설명
datasets.load_boston()
회귀 용도이며, 미국 보스턴의 집 피처들과 가격에 대한 데이터 세트
datasets.load_breast_cancer
분류 용도이며, 위스콘신 유방암 피처들과 악성/음성 레이블 데이터 세트
datasets.load_diabetes
회귀 용도이며, 당뇨 데이터 세트
datasets.load_digits()
분류 용도이며, 0에서 9까지 숫자 이미지 픽셀 데이터 세트
datasets.load_iris()
분류 용도이며, 붓꽃에 대한 피처를 가진 데이터 세트
- fetch 계열 명령은 데이터 용량이 커서 인터넷에서 내려받는 방식으로 사용
- fetch_covtype(): 회귀분석용 토지 조사 자료
- fetch_20newsgroups(): 뉴스 그룹 텍스트 자료
- fetch_lfw_people(): 얼굴 이미지 자료
- fetch_lfw_pairs(): 얼굴 이미지 자료
- fetch_rcv1(): 로이터 뉴스 말뭉치
- fetch_mldata(): ML 웹사이트에서 다운로드
- 분류와 클러스터링을 위한 표본 데이터 생성시
API명
설명
datasets.make_classifications()
분류를 위한 데이터 세트를 만듦, 높은 상관도, 불필요한 속성 등의 노이즈 효과를 위한 데이터를 무작위로 생성
datasets.make_blobs()
클러스터링을 위한 데이터 세트를 무작위로 생성, 군집 지정 개수에 따라 여러 클러스터링을 위한 데이터 세트를 쉽게 만듦
사이킷런에 내장된 데이터 딕셔너리 엿보기
data: 피처 데이터 세트를 가리킴
target: 분류- 레이블값 데이터 세트, 회귀- 숫자 결괏값 데이터 세트
target_names: 개별 레이블 이름
feature_names: 피처 이름
DESCR: 데이터 세트에 관한 설명과 각 피처의 설명
설명
data, target: 넘파이 배열(ndarray) 타입
target_names, feature_names: 넘파이 배열 또는 파이썬 리스트(list) 타입
DESCR: 스트링타입
피처 데이터값을 반환받기 위해서는 내장 데이터 세트 API를 호출한 뒤, key 값을 지정하면 됨
1 2 3 4 5
# 붓꽃 데이터 세트 생성 from sklearn.datasets import load_iris
iris_data = load_iris() print(type(iris_data))
<class 'sklearn.utils.Bunch'>
load_iris() API 반환 결과는 sklearn.utils.Bunch 클래스 (딕셔너리 자료형과 유사)
1 2
keys = iris_data.keys() print('붓꽃 데이터 세트의 키들:', keys)
# 학습 데이터 세트로 예측 수행 pred = dt_clf.predict(train_data) print('예측 정확도:', accuracy_score(train_label, pred))
예측 정확도: 1.0
정확도가 100%인 이유: 이미 학습한 학습 데이터 세트를 기반으로 예측했기 때문
예측을 수행한 데이터 세트는 학습한 학습용 데이터 세트가 아닌, 테스트 데이터 세트여야 함
train_test_split() 함수로 학습 데이터/테스트 데이터 세트 분리하기
파라미터 설명
test_size
전체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할지 결정 (디폴트는 0.25, 즉 25%)
train_size
전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링할 것인가 결정(통상적으로 test_size를 사용하고, 해당 파라미터는 잘 사용하지 않음)
shuffle
데이터 분리 전, 데이터를 미리 섞을지 결정, 디폴트는 True, 데이터를 분산해서 좀 더 효율적인 학습 및 테스트 데이터 세트를 만드는 데 사용
random_state
random_state는 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값, train_test_split()는 호출 시 무작위로 데이터를 분리하므로 random_state를 지정하지 않으면 수행할 때마다 다른 학습/테스트용 데이터를 생성 → 연습 시에는 random_state에 일정 숫자값을 주어 변하지 않도록 함
train_test_split()의 반환값은 튜플 형태 → 학습용 데이터의 피처 데이터 세트, 테스트용 데이터의 피처 데이터 세트, 학습용 데이터의 레이블 데이터 세트, 테스트용 데이터의 레이블 데이터 세트가 순차적으로 반환
붓꽃 데이터 세트를 train_test_split()으로 테스트 데이터 세트를 전체의 30%, 학습 데이터 세트를 70%로 분리
1 2 3 4 5 6 7 8 9
from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split
dt_clf.fit(X_train, y_train) pred = dt_clf.predict(X_test) print('예측 정확도: {0:4f}'.format(accuracy_score(y_test, pred)))
예측 정확도: 0.955556
테스트 데이터로 예측을 수행한 결과 정확도가 약 95.56%
붓꽃 데이터는 데이터 양(150개)이 크지 않아 전체 30%인 텟트 데이터로 알고리즘 예측 성능을 판단하기 적절하지 않음
3. 교차 검증
과적합(Overfitting): 모델이 학습 데이터에만 과도하게 최적화되어, 실제 예측을 다른 데이터로 수행할 경우 예측 성능이 과도하게 떨어지는 것
과적합을 방지하기 위해 교차 검증을 이용해 다양한 학습과 평가를 수행
K 폴드 교차 검증
K 폴드 교차 검증: 가장 보편적으로 사용되는 교차 검증 기법
K개의 데이터 폴드 세트를 만들어서 K번마늠 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
사이킷런에서는 K 폴드 교차 검증 프로세스를 구현하기 위해 KFold와 StratifiedKFold 클래스를 제공
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score from sklearn.model_selection import KFold import numpy as np
# 반복문을 통해 교차 검증 수행 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)
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
1 33
0 33
Name: label, dtype: int64
검증 레이블 데이터 분포:
1 17
0 17
2 16
Name: label, dtype: int64
## 교차 검증: 2
학습 레이블 데이터 분포:
1 34
2 33
0 33
Name: label, dtype: int64
검증 레이블 데이터 분포:
2 17
0 17
1 16
Name: label, dtype: int64
## 교차 검증: 3
학습 레이블 데이터 분포:
0 34
2 33
1 33
Name: label, dtype: int64
검증 레이블 데이터 분포:
2 17
1 17
0 16
Name: label, dtype: int64
출력 결과
학습 레이블과 검증 레이블 데이터값 분포도가 동일하게 할당
첫 번째 교차 검증: 학습 레이블은 0, 1, 2 값이 각각 33개 → 레이블별로 동일하게 할당
# StratifiedKFold의 split() 호출 시, 반드시 레이블 데이터 세트도 추가 입력 필요 for train_index, test_index in skfold.split(features, label): # split()으로 반환된 인덱스를 이용해 학습용, 검증용 테스트 데이터 추출 X_train, X_test = features[train_index], features[test_index] y_train, y_test = label[train_index], label[test_index] # 학습 및 예측 dt_clf.fit(X_train, y_train) pred = dt_clf.predict(X_test) # 반복 시마다 정확도 측정 n_iter += 1 accuracy = np.round(accuracy_score(y_test, pred), 4) train_size = X_train.shape[0] test_size = X_test.shape[0] print('\n#{0} 교차 검증 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}' .format(n_iter, accuracy, train_size, test_size)) print('#{0} 검증 세트 인덱스: {1}'.format(n_iter, test_index)) cv_accuracy.append(accuracy)
# 교차 검증별 정확도 및 평균 정확도 계산 print('\n## 교차 검증별 정확도:', np.round(cv_accuracy, 4)) print('## 평균 검증 정확도:', np.mean(cv_accuracy))
esmitator : 사이킷런의 분류 알고리즘 클래스인 Classifier 또는 회귀 알고리즘 클래스인 Regressor를 의미
X : 피처 데이터 세트
y : 레이블 데이터 세트
scoring : 예측 성능 평가 지표를 기술
cv : 교차 검증 폴드 수
cross_val_score( ) 수행 후 반환 값은 scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환
cross_val_score( )는 classifier가 입력되면 Stratified K 폴드 방식으로 레이블값의 분포에 따라 학습/테스트 세트를 분할
cf) 회귀인 경우에는 Stratified K 폴드 방식으로 분할할 수 없으므로 K 폴드 방식으로 분할
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score , cross_validate from sklearn.datasets import load_iris
# 성능 지표는 정확도(accuracy) , 교차 검증 세트 는 3개 scores = cross_val_score(dt_clf , data , label , scoring='accuracy',cv=3) print('교차 검증별 정확도:',np.round(scores, 4)) print('평균 검증 정확도:', np.round(np.mean(scores), 4))
교차 검증별 정확도: [0.98 0.94 0.98]
평균 검증 정확도: 0.9667
cross_val_score( )는 cv로 지정된 횟수만큼 scoring 파라미터로 지정된 평가 지표로 평가 결괏값을 배열로 반환, 일반적으로 이를 평균해 평가 수치로 사용
cross_val_score( ) API는 내부에서 Estimator를 학습(fit), 예측(predict), 평가(evaluation)시켜주므로 간단하게 교차 검증을 수행할 수 있음
cross_val_score( )와 앞 예제의 StratifiedKFold의 수행 결과를 비교해 보면 각 교차 검증별 정확도와 평균 검증 정확도가 모두 동일 → cross_val_score( )가 내부적으로 StratifiedKFold를 이용하기 때문
4. GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에
사이킷런은 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공(Grid는 격자라는 뜻으로, 촘촘하게 파라미터를 입력하면서 테스트를 하는 방식)
e.g) 결정 트리 알고리즘의 여러 하이퍼 파라미터를 순차적으로 변경하면서 최고 성능을 가지는 파라미터 조합을 찾고자 한다면 다음과 같이 파라미터의 집합을 만들고 이를 순차적으로 적용하면서 최적화를 수행하면 됨
GridSearchCV: 사용자가 튜닝하고자 하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하면서 최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸림
이 경우, 순차적으로 6회에 걸쳐 하이퍼 파라미터를 변경하면서 교차 검증 데이터 세트에 수행 성능을 측정
CV가 3회라면 개별 파라미터 조합마다 3개의 폴딩 세트를 3회에 걸쳐 학습/평가해 평균값으로 성능을 측정
6개의 파라미터 조합이라면 총 CV 3회 * 6개 파라미터 조합 = 18회의 학습/평가가 이뤄짐
GridSearchCV 클래스의 생성자로 들어가는 주요 파라미터
estimator : classifier, regressor, pipeline이 사용될 수 있다.
param_grid : key + 리스트 값을 가지는 딕셔너리가 주어짐, estimator의 튜닝을 위해 파라미터명과 사용될 여러 파라미터 값을 지정
scoring : 예측 성능을 측정할 평가 방법을 지정, 보통은 사이킷런의 성능 평가 지표를 지정하는 문자열(예 : 정확도의 경우 ‘accuracy’)로 지정하나 별도의 성능 평가 지표 함수도 지정 가능
cv : 교차 검증을 위해 분할되는 학습 / 테스트 세트의 갯수를 지정
refit : 디폴트가 True이며 True로 생성 시 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 esitmator 객체를 해당 하이퍼 파라미터로 재학습시킴
1 2 3 4 5 6 7 8 9 10 11 12
from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearchCV
# 데이터를 로딩하고 학습 데이터와 테스트 데이터 분리 iris_data = 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()
## 파라미터를 딕셔너리 형태로 설정 parameters = {'max_depth': [1,2,3], 'min_samples_split': [2,3]}
학습 데이터 세트를 GridSearchCV 객체의 fit(학습 데이터 세트) 메서드에 인자로 입력
GridSearchCV 객체의 fit 메서드를 수행하면 학습 데이터를 cv에 기술된 폴딩 세트로 분할해 param_grid에 기술된 하이퍼 파라미터를 순차적으로 변경하면서 학습/평가를 수행하고 결과를 cv_results_(gridsearchcv의 결과 세트, 딕셔너리 형태로 key값과 리스트 형태의 value값을 가짐) 속성에 기록
1 2 3 4 5 6 7 8 9 10 11 12 13
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, return_train_score=True)
from sklearn.preprocessing import MinMaxScaler import numpy as np
# 학습 데이터는 0부터 10까지, 테스트 데이터는 0부터 5까지 값을 가지는 데이터 세트로 생성 # Scaler 클래스의 fit(), transform()은 2차원 이상 데이터만 가능하므로 reshape(-1, 1)로 차원 변경 train_array = np.arange(0,11).reshape(-1,1) test_array = np.arange(0,6).reshape(-1,1)
# 학습 데이터인 train_array부터 MinMaxScaler를 이용해 변환 ## MinMaxScaler 객체에 별도 feature_range 파라미터 값을 지정하지 않으면 0~1 값으로 변환 scaler = MinMaxScaler()
## fit()하면 train_array 데이터의 최솟값이 0, 최댓값이 10으로 설정됨 scaler.fit(train_array)
## 1/10 scale로 train_arrau 데이터 변환, 원본 10 → 1로 변환 train_scaled = scaler.transform(train_array)
# 테스트 데이터 세트를 변환: fit()을 호출해 스케일링 기준 정보를 적용한 뒤, transform()을 수행한 결과 확인 ## MinMaxScaler에 test_array를 fit()하게 되면 원본 데이터 최솟값이 0, 최댓값이 5로 설정 scaler.fit(test_array)
## 1/5 scale로 test_array 데이터 변환. 원본 5 → 1로 변환 test_scaled = scaler.transform(test_array)
## test_array의 scale 변환 출력 print('\n원본 test_array 데이터:', np.round(test_array.reshape(-1),2)) print('Scale된 test_array 데이터:', np.round(test_scaled.reshape(-1),2))
# 입력 age에 따라 구분값을 반환하는 함수 설정 # DataFrame의 apply lambda 식에 사용 defget_category(age): cat = '' if age <= -1: cat = 'Unknown' elif age <= 5: cat = 'Baby' elif age <= 12: cat = 'Child' elif age <= 18: cat = 'Teenager' elif age <= 25: cat = 'Student' elif age <= 35: cat = 'Young Adult' elif age <= 60: cat = 'Adult' else: cat = 'Elderly' return cat
# 막대그래프 크기 figure를 더 크게 설정 plt.figure(figsize=(10,6))
# X축의 값을 순차적으로 표시하기 위한 설정 group_names= ['Unknown', 'Baby', 'Child', 'Teenager', 'Student', 'Young Adult', 'Adult', 'Elderly']
# lambda 식에 위에서 생성한 get_category() 함수를 반환값으로 지정 titanic_df['Age_cat'] =titanic_df['Age'].apply(lambda x : get_category(x)) sns.barplot(x='Age_cat', y='Survived',hue ='Sex', data=titanic_df,order=group_names) titanic_df.drop('Age_cat',axis=1,inplace=True)
결과 해석
여자 baby의 경우 비교적 생존 확률 높음
여자 child는 다른 연령대에 비해 생존 확률 낮음
여자 elderly의 경우 생존 확률이 매우 높음
남은 문자열 카테고리 피처를 숫자형 카테고리 피처로 변환
인코딩: 사이킷런의 LabelEncoder 클래스를 이용하여 레이블 인코딩 적용
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 여러 칼럼을 encode_features() 함수를 생성해 한 번에 변환하기 from sklearn import preprocessing
defencode_features(dataDF): features = ['Cabin', 'Sex', 'Embarked'] for feature in features: le = preprocessing.LabelEncoder() le = le.fit(dataDF[feature]) dataDF[feature] = le.transform(dataDF[feature]) return dataDF
#레이블 인코딩 수행 defformat_features(df): df['Cabin'] = df['Cabin'].str[:1] features = ['Cabin','Sex','Embarked'] for feature in features: le = LabelEncoder() le = le.fit(df[feature]) df[feature] = le.transform(df[feature]) return df
# 앞에서 설정한 데이터 전처리 함수 호출 deftransform_features(df): df = fillna(df) df = drop_features(df) df= format_features(df) return df
원본 데이터 가공 위해 원본 csv 파일 재로딩
Survived 속성만 별로도 분리해 클래스 결정값 데이터 세트로 만들기
Survived 속성을 드롭해 피처 데이터 세트 만들기
생성된 데이터 세트에 transform_features()를 적용해 데이터 가공
1 2 3 4 5 6
#원본 데이터 재로딩하고, 피처 데이터 세트와 레이블 데이터 세트 추출. titanic_df = pd.read_csv("./titanic_train.csv") y_titanic_df=titanic_df['Survived'] X_titanic_df=titanic_df.drop('Survived',axis=1)
X_titanic_df = transform_features(X_titanic_df)
1 2 3 4
# train_test_split() API를 이용해 별도의 테스트 데이터 세트 추출, 세트 크기는 전체의 20% 설정 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test=train_test_split(X_titanic_df, y_titanic_df, test_size=0.2, random_state=11)
ML 알고리즘 결정 트리, 랜덤 포레스트, 로지스틱 회귀로 타이타닉 생존자 예측하기
결정 트리: DecisionTreeClassifier 클래스
랜덤 포레스트: RandomForestClassifier 클래스
로지스틱 회귀: LogisticRegression 클래스 제공
사이킷런 클래스를 이용해 train_test_split()으로 분리한 학습 데이터와 테스트 데이터를 기반으로 머신러닝 모델을 학습하고(fit) 예측할 것(predict)
from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score
#결정트리, Random Forest, 로지스틱 회귀를 위한 사이킷런 Classifier 클래스 생성 dt_clf = DecisionTreeClassifier(random_state=11) rf_clf = RandomForestClassifier(random_state=11) lr_clf = LogisticRegression()
하이퍼 파라미터인 max_depth=3, min_samples_leaf=1, min_samples_split=2로 DecisionTreeClassifier를 학습시킨 뒤 예측 정확도가 약 87.15%로 향상 → 테스트용 데이터 세트가 작기 때문에 수치상으로 예측 성능이 많이 증가한 것으로 보임
07. 정리
사이킷런
많은 머신러닝 알고리즘 제공
쉽고 직관적인 API 프레임워크
편리하고 다양한 모듈 지원
머신러닝 애플리케이션
데이터의 가공 및 변환 과정의 처리
데이터를 학습 대이타와 테스트 데이터로 분리하는 데이터 시트 분리 작업
학습 데이터를 기반으로 머신러닝 알고리즘을 적용해 모델 학습
학습된 모델을 기반으로 테스트 데이터에 대한 예측 수행
예측된 결과값을 실제 결과값과 비교해 머신러닝 모델에 대한 평가 수행
데이터 전처리 작업
오류 데이터의 보정이나 결손(Null) 처리 등의 다양한 데이터 클렌징 작업
레이블 인코딩이나 원-핫 인코딩 같은 인코딩 작업
데이터의 스케일링/정규화 작업 등으로 머신러닝 알고리즘이 최적으로 수행되도록 사전에 데이터 처리
추가
머신러닝 모델은 학습 데이터 세트로 학습한 뒤 반드시 별도의 테스트 데이터 세트로 평가해야 함
테스트 데이터의 건수 부족이나 고정된 테스트 데이터 세트를 이용한 반복적인 모델의 학습과 평가는 해당 테스트 데이터 세트에만 치우치는 빈약한 머신러닝 모델을 만들 가능성이 높음
해결 방안
학습 데이터 세트를 학습 데이터와 검증 데이터로 구성된 여러 개의 폴드 세트로 분리해 교차검증 수행 (교차검증은 데이터셋이 적을 때, 많으면 시간이 너무 오래 걸림)
사이킷런은 교차 검증을 지원하기 위해 KFord, StratifiedKFold, cross_val_score 등의 다양한 클레스 함수를 제공
머신러닝 모델의 최적의 하이퍼 파라미터를 교차 검증을 통해 추출하기 위해 GridSearchCV를 제공