https://www.coursera.org/specializations/machine-learning-introduction

추천강의 

 

 

1) 지도학습

1. 회귀  : 숫자 예측

  • 선형 and 비선형
  • Gradient Descent(경사하강법)
  • Bias and variance trade-off (편향-분산)

2. 분류 : 분류 예측

  • 로지스틱 회귀 and 소프트맥스 회귀
  • SVM
  • DT
  • Linear Discriminant Analysis (LDA 선형판별분석)

3. 앙상블 학습

  • Bagging
  • Boosting

1-2) 비지도 학습

 

1. 차원축소(전처리)

  • PCA
  • SVD

2. 군집화 (분류/클러스터링)

  • K-means
  • Mean shift
  • Gaussian Mixture Model
  • DBSCAN

'AI > [ML]' 카테고리의 다른 글

[ML] 2. Cross Validation 교차 검증  (0) 2023.02.09
[ML] Scikit-learn 을 활용한 붓꽃 품종 예측하기  (0) 2023.02.08

교차 검증이 무엇인가요?

교차검증이란 모델 학습 시 데이터를 훈련용과 검증용으로 교차로 선택하는 방법

 

이전에 150개 중 120개만 데이터 훈련용, 30개를 검증용으로 사용했다면 단 1번만 훈련이 된다.

 

 

이를 보안하기 위하여 학습용 데이터 셋을 분할시켜 정확도를 올림.

 

00

예시로 150개의 자료가 있다면 대략 5등분 하여(유효한 수의 데이터셋을 유지한 채) 4 x Train(초록색)을 이용해서 학습을 시킨다음 1 x 검증용(파란색) 데이터로 정확도를 측정을 총 5번 반복해서 진행하는 과정이다.

 

 

교차 검증 왜 하나요?

 

장점 

  • 특정 데이터셋에 대한 과적합 방지
  • 더욱 일반화된 모델 생성 가능
  • 데이터셋 규모가 적을 시 과소적합 방지

 

단점

  • 학습 및 검증에 필요한 시간이 증가

 

코드를 통하여서 알아보자.

 

1. 주요 라이브러리 임포트

# 필수 라이브러리 호출


from sklearn.datasets import load_iris   # 품종 데이터셋
from sklearn.tree import DecisionTreeClassifier   # 의사결정나무 알고리즘
from sklearn.model_selection import KFold    # 교차검증 자료 나누기
from sklearn.metrics import accuracy_score as acc_sc   # 평가지표
from sklearn.model_selection import train_test_split   # 훈련, 검증용 자료 나누기

import numpy as np
import pandas as pd

2. 데이터 불러오기

# 데이터 재정의
iris = load_iris()
features = iris.data # X값
label = iris.target # y값
dt_clf = DecisionTreeClassifier(random_state=156)

# kfold에서 k= 5로 놓자. (5등분한다)
kfold = KFold(n_splits=5)


print('데이터 셋의 크기:', features.shape[0])

# 데이터 셋의 크기: 150

 

 

 

3. 학습 수행 

n_iter = 0
cv_accuracy = []  # CV : cross validation
for train_index, val_index in kfold.split(label):
    # Kfold.split()으로 반환된 인덱스를 통해 학습용, 검증용 데이터 정의
    X_val, X_train = features[val_index], features[train_index]
    y_val, y_train = label[val_index], label[train_index]
    # 각 CV별 학습 및 예측
    dt_clf.fit(X_train,y_train) # 학습
    pred = dt_clf.predict(X_val) # 예측
    # 정확도 지표 계산
    accuracy = np.round(acc_sc(y_val, pred),3)
    train_size = X_train.shape[0]
    val_size = X_val.shape[0]
    n_iter += 1
    print(f'\n #{n_iter} CV 정확도:{accuracy}, 학습데이터 크기:{train_size}, 검증데이터 크기 : {val_size}')
    print(f'#{n_iter} 검증 데이터셋 인덱스 :{val_index}')
    cv_accuracy.append(accuracy)
    
# 개별 iteration 별 정확도 평균내기
print(f'\n ## 평균 CV정확도 :{np.mean(cv_accuracy)}')

<정확표 값>

 

 #1 CV 정확도:1.0, 학습데이터 크기:120, 검증데이터 크기 : 30
#1 검증 데이터셋 인덱스 :[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29]

 #2 CV 정확도:0.967, 학습데이터 크기:120, 검증데이터 크기 : 30
#2 검증 데이터셋 인덱스 :[30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
 54 55 56 57 58 59]

 #3 CV 정확도:0.867, 학습데이터 크기:120, 검증데이터 크기 : 30
#3 검증 데이터셋 인덱스 :[60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
 84 85 86 87 88 89]

 #4 CV 정확도:0.933, 학습데이터 크기:120, 검증데이터 크기 : 30
#4 검증 데이터셋 인덱스 :[ 90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107
 108 109 110 111 112 113 114 115 116 117 118 119]

 #5 CV 정확도:0.733, 학습데이터 크기:120, 검증데이터 크기 : 30
#5 검증 데이터셋 인덱스 :[120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
 138 139 140 141 142 143 144 145 146 147 148 149]

 ## 평균 CV정확도 :0.9

 

 

cv_accuracy

# [1.0, 0.967, 0.867, 0.933, 0.733]

 

 

'AI > [ML]' 카테고리의 다른 글

[ML] 머신러닝 분류  (0) 2023.03.30
[ML] Scikit-learn 을 활용한 붓꽃 품종 예측하기  (0) 2023.02.08

Scikit-learn 을 활용한 붓꽃 품종 예측하기

 

 

sepal length, sepal , petal length, petal width를 통해서 label (품종)을 예측해보자

쉽게 말해서:  4개의 꽃의 특성을 구분한 150개의 자료가 있다.

특징1, 특징2....특징4(독립변수)와 거기에 맞는 품종이 표시된 120개의 데이터(특징 + 품종)를 이용하여 학습을 시킨 다음에 

나머지 30개의 특징만으로 그 특징에 맞는 품종을 예측을 하려고 한다.

 

 

 

 

 

어렵게 말하면 4개의 독립변수(특징)와 1개의 종속변수(품종)를 가지는 150개의 데이터를 가지고

120개는 훈련용 (4개의 독립변수 + 1개 종속변수) 

30개는 (4개의 독립변수) 검증용으로  1개의 종속변수 예측하기 :

 

 

어렵게 말하면 4개의 독립변수와 1개의 종속변수를 가지는 150개의 데이터를 가지고 1개의 종속변수 예측하기 :

 

scikit-learn 

# conda 가상환경시
#!conda install scikit-learn

!pip install scikit-learn

 

import sklearn 
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

print(sklearn.__version__) # 사이킷런 버전확인

 

#붓꽃 데이터 세트를 로딩
iris=load_iris()

#iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있음.
iris_data=iris.data # x값 들

#iris.target은 붓꽃 데이터 세트에서 레이블(결정 값)데이터를 numpy로 가지고 있다.
iris_label=iris.target #y값 들
print('iris target값:', iris_label)
print('iris target명:', iris.target_names) # ['setosa' 'versicolor' 'virginica'] 문자타입을 0, 1, 2숫자로 변환!

#붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환한다.
iris_df = pd.DataFrame(iris_data,columns=iris.feature_names)
iris_df['label']=iris.target
iris_df.tail()
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']

# 0 : sentosa
# 1 : versicolor
# 2 : virginica

다음으로 학습용 데이터와 테스트용 데이터를 분리해보자. 학습용 데이터와 테스트용 데이터는 반드시 분리해야 한다.

학습데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트가 필요하기 때문이다.

이를 위해 사이킷런은 train_test_split()API를 제공한다. train_test_split()을 이용하면 학습 데이터와 테스트 데이터를 test_size 파라미터 입 값의 비율로 쉽게 분할이 가능하다. 예를 들어 test_size =0.2로 입력 파라미터를 설정하면 전체 데이터 중 테스트 데이터가 20%, 학습데이터가 80%로 데이터를 분할한다. 먼저 train_test_split()을 호출한 후 좀 더 자세히 입력 파라미터와 변환값을 살펴보자.

 

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, test_size=0.2) 
# test_size=0.2 = 20프로는 테스트용이로 따로 빼두겠다

 

X_train.shape # (sepal length, sepal width, petal length, petal width)
# (120, 4)   120가지의 4개의 컬럼을 가지고 있고 이것을 학습용 x (독립 변수로 두겠다)

y_train.shape # (label => 품종이 어떤건지)
(120,)	     120가지의 품종이 있다 (종속 변수) 


# X_train의 4가지 독립변수들을 결합하여 y_train 종속 변수를 찾아내는 알고리즘을 학습시킴


# 그 알고리즘에 

X_test.shape # (sepal length, sepal width, petal length, petal width)
# (30, 4)   30가지의 4개의 컬럼을 직접 넣어서 

y_test.shape 
# (30,)      30개의 품종을 얼마나 잘 맞추는지 테스트하는것!

 

의사결정나무를 통해서 학습시키기

# 의사결정 트리에  120개의 학습용 데이터 넣기

DecisionTreeClassifier.fit(X_train,y_train)
#학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행.

pred=dt_clf.predict(X_test) # X_test는 test_size=0.2에서 빼둔 (30, 4)개의 데이터

 

 

# 예측값
pred

# array([2, 2, 1, 1, 2, 0, 1, 0, 0, 1, 1, 1, 1, 2, 2, 0, 2, 1, 2, 2, 1, 0,
#       0, 1, 0, 0, 2, 1, 0, 1])

 

# 실제값
y_test

# array([2, 2, 2, 1, 2, 0, 1, 0, 0, 1, 2, 1, 1, 2, 2, 0, 2, 1, 2, 2, 1, 0,
#       0, 1, 0, 0, 2, 1, 0, 1])

예측값(학습된 데이터로 만들어진 알고리즘) 30개중 2개가 실제값과 다름

정확도 : 0.93333

from sklearn.metrics import accuracy_score as acc_sc
print('예측 정확도: {0}'.format(acc_sc(y_test,pred)))


학습한 의사 결정 트리의 알고리즘 예측 정확도가 약 0.9333(93.33%)으로 측정되었다. 앞의 붓꽃 데이터 세트로 분류를 예측한 프로세스를 정리하면 다음과 같다.

  1. 데이터 세트 분리: 데이터를 학습 데이터와 테스트 데이터로 분리한다.
  2. 모델 학습: 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킨다.
  3. 예측 수행: 학습된 ML 모델을 이용해 테스트 데이터의 분류 (즉, 붓꽃 종류)를 예측한다.
  4. 평가: 이렇게 예측된 결과 값과 테스트 데이터의 실제 결과를 비교해 ML 모델 성능을 평가한다.

'AI > [ML]' 카테고리의 다른 글

[ML] 머신러닝 분류  (0) 2023.03.30
[ML] 2. Cross Validation 교차 검증  (0) 2023.02.09

+ Recent posts