ML방법에는 두 가지가 있다.
- 지도학습(Supervised Learning): 정답값(결정값, target value, label value)을 가지고 있는 ML training 방법
- 비지도학습(Unsupervised Learning): 정답값이 없는 ML training 방법
- 사이킷런에서는 datasets 라는 연습용 예제데이터를 제공한다.
89pg. 지도학습 datasets 연습
결과값
iris.data와 iris.target을 호출하면 데이터는 다음과 같다. (하나의 줄 (row)가 하나의 붓꽃데이터를 말한다.)
iris_label은 iris.data의 정답값(결정값)을 말한다. (붓꽃의 품종을 말함)
column name을 한번 test해보자
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df를 판다스 데이터프래임 형식으로 파꾼다. column명은 iris.feature_name으로 하고, 각각의 인덱스에 따라 iris_data를 넣는다.
iris_df['label']=iris.target
'label' Column을 추가하고 iris.target을 적용해서 값을 집어넣는다.
89pg
train_test_split( )함수: 데이터 세트를 학습데이터와 테스트데이터로 분리함
붓꽃데이터는 총 150개가 있고 4개의 feature를 갖는다. 이를 feature데이터는 0.8로, test데이터는 0.2로 나눈다.(Split)
데이터를 나누는 이유는 기계학습 머신러닝 알고리즘 input값으로 넣으려 함이다. 위의 예시에서는 train(기계학습을 위한 데이터)을 위해서는 120개를 사용하고, test(기계학습 후 정답확률을 알려주는 검증을 위한 데이터)에는 30개를 사용한다.
참고) ML 알고리즘에는 tree알고리즘/ tree외 알고리즘이 있는데, tree외 알고리즘은 가중치를 부여한다. 특히, 딥러닝에서는 각 개별요소가 각 layer (층)을 넘어갈 때 가중치가 부여된 총 합이 넘어가게 된다. (기계학습=최적의 가중치를 찾아내는 학습. Ex) x1*w1+x2*w2+x3*w3=다음 layer의 값
- x값은 붓꽃의 feature값이며, y값은 정답값이다.
- random_state=11
150개의 데이터 중 train/test값 나눌 때 무작위로 추출하는 방법으로, 11번째 규칙으로 무작위로 추출하라는 뜻이다. seed와 마찬가지로 매 실행에도 동일한 추출이 된다.
참고) random 함수는 실행시킬 때마다 다른 값이 생성된다. 하지만 어떠한 random값이 생성되는 규칙인 seed값을 넣는다면 으로 동일한 random값이 나온다.
DecisionTreeClassfier 수행 (트리기반의 알고리즘 학습수행을 시켜보자)
- class Add ( )를 생성할 때는 객체를 A=Add라고 생성한다. 이와 같이 Tree기반 알고리즘 기반의 dt_clf객체를 생성한다
.- __init__: class 객체 생성시점에 자동적으로 수행(호출)되는 매서드
dt_clf라는 변수안에 fit라는 매서드는 input값으로 train(feature와 target값)을 받아서 기계학습을 시켜준다.
이 기계학습 후 트리기반의 모델이 형성되면 (시각화가능) predict라는 매서드에 x_test데이터를 넣어 검증한다.
모델링검증
우리는 x_test데이터에 대한 실제 정답값을 y_test에서 알고 있다. 이 모델링의 정확도는 다음 함수를 통해 볼 수 있다.
(맞은개수/총개수)
93pg. 사이킷런의 기반 프레임워크 익히기
Estimator 이해 및 fit( ), predict( ) 매서드
- fit( ): ML모델학습 (지도학습에서)
- predict( ): 학습된 모델 예측
- Estimator 클래스: 분류알고리즘 클래스 Classfier 과 회귀알고리즘 클래스 Regressor를 지칭. fit과 predict 내부구현.
참고) Regressor는 가중치를 두는 딥러닝에서 사용된다. (오차가 가장 적은 그래프/알고리즘을 구하는 것)
참고) 비지도학습과 피처추출에서 fit( )은 입력데이터의 형태에 맞춰 데이터를 변환하기 위한 사전구조를 맞추는 작업이며, transform( )으로 데이터의 차원변환, 클러스터링, 피처추출 등의 실제 작업을 수행한다.
102pg. 교차검증
- 데이어편중에 의한 과적합의 문제점을 개선하고자 교차검증을 이용한다. (여러세트로 구성된 학습데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행함)
Ex) 학습 데이터 세트(학습데이터세트/검증데이터세트)+테스트 데이터 세트
- 과적합 (Overfitting): 모델이 학습데이터에만 과도하게 최적화되어, 실제 예측을 다른 데이터로 수행할 경우 예측 성능이 과도하게 떨어지는 것
-K 폴드 교차검증: K개의 데이터 폴드 세트를 만들어 K번만큼 각 폴드 세트에 학습과 검증평가를 반복수행함.
참고) 교차검증을 하는 의미
테스트데이터를 검증하기 전에 트레인(학습)데이터가 더 좋은 Performance를 할 수 있도록 데이터 전처리를 하기 위함이다.
- features에 iris.data를 담아놓는다.
- kfold에 KFold교차 데이터 검증함수를 넣는다.
- train의 index를 이용해 데이터를 split한다. (KFold에 의거한 개수에 따라서)
결과값
cv_accuracy는 교차검증 5번을 한 결과값을 말한다. 이를 np.mean (넘파이 평균내장함수)를 사용해서 평균 교차검증 정확도를 알아본다.
참고) 5KFold로 데이터를 쪼개고 쪼갠 뒤 쪼개진 kfold.split(features)안에 train과 test의 인덱스 값에 뭐가 들어있는지 시험사아 본다. 처음 쪼개진 데이터는 30-149, 두번째로 쪼개진 데이터는 0-29, 60-149, 세번째로 쪼개진 데이터는 0-59, 90-149, 네번째로 쪼개진 데이터는 0-89, 120-149, 다섯번째로 쪼개진 데이터는 0-129까지 값이 들어간다.
참고2) test2, test3을 만들어서 X_train데이터와 X_test에 뭐가 들어가있는지 본다.
X_train 에는 전체 데이터중에서 train의 index를 뽑아낸다.
X_test 에는 전체 데이터중에서 test의 index를 뽑아낸다.
참고3) X_train.shape[0], X_test.shape[0] 에는 X_train.shape와 X_test.shape의 첫 번째 인덱스 값 (즉 데이터 크기가 들어간다)
- Shape는 행x열의 데이터 크기를 말하는데 train데이터는 120x4, test데이터는 30x4 의 데이터 크기(모양)을 가지고 있으므로, 첫 번째 열인 120과 30이 각각 출력된다.
- 108pg. Stratified K폴드 (KFold의 단점을 보완하여 실무에 더 많이 사용됨)
레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 테스트 세트에 제대로 분배하지 못하는 문제를 해결해줌.
- for train_index, test_index in kfold.split(iris_df): 를 통해 kfold로 train데이터, test데이터를 나눈다.
- iloc (train_index과 test_index라는 위치기반인덱스)를 통해 label_train과 label_test에 traget값(결정값)을 1-3번째 교차검증동안 호출한다.
- value_counts( )를 통해 label_test와 label_train에 고유값(0, 1, 2)이 몇개가 있는지 알아본다.
교차검증 1의 경우 train 레이블에는 1, 2만 가지고 test 레이블에는 0만 가진다.
교차검증 2의 경우 train 레이블에는 0, 2만 가지고 test 레이블에는 1만 가진다.
교차검증 3-5도 마찬가지로 데이터값이 편중되어 있는 문제가 발생한다.
- 그래서 KFold 말고, skfold.split을 사용한다. SkFold에서는 KFold와 달리 label값도 필요하다.
label정보가 들어가야지 몇개의 정보중에서 해당 레이블이 몇개가 있는지 알기 위함.
그러면 다음과 같이 교차검증 1-5회에서 0, 1, 2 레이블 데이터 분포가 거의 균등하게 나온다.
그 결과값은 다음과 같다.
112pg. cross_val_score( )
KFold의 for 루프의 반복실행 (학습 fit, 예측 predict, 평가 evaluation)을 한꺼번에 수행해주는 API로 좀 더 편리해서 실무에 자주 사용된다.
cross_val_score( estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
- estimator가 classfier 알고리즘일 경우 Stratified KFold 형식으로 레이블의 학습/테스트 세트를 분할
- estimator가 regressor 알고리즘일 경우 KFold 형식으로 레이블의 학습/테스트 세트를 분할
- cv: 교차검증 횟수 (KFold의 K값)
- scoring: 성능평가지표 (정확도: accuracy)
- X는 feature값, y는 label값
- n_jobs는 CPU를 몇개 사용할 것인가?
참고) cross_validate( ): cross_val_score( )과 달리 여러개의 평가 지표 반환 가능 + 수행시간
113pg. GridSearchCV
- 교차검증 Classfier/Regressor 알고리즘에 사용되는 하이퍼 파라미터를 튜닝할 수 있다.
- cross-validation을 위한 학습/테스트 세트로 자동으로 분할 한 뒤 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 조합해 최적의 파라미터 조합을 찾아준다.
- estimator(classfier, regressor, pipeline)
- param_grid: key(사용될 파라미터 명)+리스트(사용될 파라미터 값)값의 딕셔너리가 주어짐
- scoring 및 cv
- refit: True가 디폴트값이며, 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 하이퍼 파라미터로 재학습시킨다.
Ex) cv 3회, 6개 파라미터 조합 >> 18회의 학습/평가가 이루어짐
참고) DescisionTree가 너무 세분화되어 깊어지면 overfitting되는 문제가 발생한다. 이 때, GridSearchCV에서 DescisionTree의 deapth를 조절할 수 있다.
참고 1) scores_df는 grid_dtree에 cv_results함수를 호출한 값을 DataFrame 으로 만든 것이다. (즉, 학습결과의 DataFrame)
index가 0-5까지 있는 이유는 parameter의 조합이 6개이기 때문이다.
split0_test_score, split1_test_score, split2_test_score, mean_test_score은 cv값이 3회이므로 3회 테스트 값을 수행하고 그것에 대한 평균값을 구한 값이다.
참고2)
estimator=grid_dtree.best__estimator__ 는 GridSearchCv를 이용해 최적의 파라미터로 학습한 estimator를 return한다.
'살콤아내 자기계발 > 파이썬' 카테고리의 다른 글
파이썬 머신러닝 완벽가이드 2주차 정리 (사이킷런 131pg, 타이타닉 생존자 예측) (0) | 2021.04.29 |
---|---|
파이썬 머신러닝 완벽가이드 2주차 정리 (데이터 전처리 118pg~, ) (0) | 2021.04.28 |
파이썬 머신러닝 완벽가이드 2주차 정리 (타이타닉실습 2_isnan, groupby) (0) | 2021.04.23 |
파이썬 머신러닝 완벽가이드 1주차 정리 (판다스 60pg~, 타이타닉 실습) (0) | 2021.04.23 |
파이썬 머신러닝 완벽가이드 1주차 정리 (판다스 39pg~), 타이타닉 실습 (0) | 2021.04.22 |