본 포스트팅은 인하대학교 컴퓨터공학과 오픈소스 SW 개론 수업자료에 기반하고 있습니다. 개인적인 학습을 위한 정리여서 설명이 다소 미흡할 수 있으니, 간단히 참고하실 분들만 포스팅을 참고해주세요 😎
ML (머신러닝) 모델들은 Feature 라는 값들로 이루어진 데이터를 입력받는다. Feature 란, 데이터를 설명하는 각 속성을 의미하며, 사람이 아닌 기계가 충분히 이해할 수 있는 형식의 데이터 들을 의미한다.
=> ML들은 Feature로 표현된 데이터들을 통해 목적을 달성하도록 학습을 스스로 진행하는 방식이다.
예를들어 아래처럼 인풋 데이터들을 넣어줘야지 ML 이 이해 가능하다. 각 컬럼(속성) 들 (Name, Age, Ticket 컬럼 등등) 이 바로 Featue 다.
ML 은 크게 2가지 과정으로 나뉜다.
Training(학습 과정) : ML 모델에서 계속 파라미터 데이터를 주입해주면서, 답을 정확히 도출해내도록 훈련을 시키는 방식.
Interface(추론 과정) : 앞서 훈련된 모델을 기반으로 ML 이 알아서 보이지 않는 데이터 결과값을 예측 및 도출해내는 것 (Ex. 결과값으로 강아지임을 판별해내는 것)
=> Training 과정을 통해 ML에게 충분히 학습을 시켰다면, 이후 서비스로 출시하는 과정이 바로 Interface 과정이다. 즉 ML 이 충분히 학습한 이후 사람들이 원하는 데이터를 충분히 추론해서 결과값으로 리턴해주는 과정이다.
ML 의 Task는 크게 3가지로 분류된다.
Label : 각 데이터를 인풋으로 넣었을 때 도출되는 각 예측값( = 정답 = 결과값)
1) 위의 예시의 경우, 기계에다 데이터를 넣어서 학습시킬 때 그냥 삼각형 이미지 데이터(Labled Data) 를 넣어주면서 동시에 이건 삼각형이라는 타입(Label) 이라는거야! 라고 하며 Label 정보도 동시에 기계에다 인풋을 넣어준다.
2) 그러면서 ML model 은 이것이 삼각형인지, 동그라미인지, 사각형인지등의 결과값을 예측해서 도출해내는 것을 계속 학습한다.
3) 해당 ML model 이 도출해낸 결과값을 보고, 사람은 이것이 틀린것인지 맞은것인지 ML model 에게 알려준다. 그러면 ML model 은 계속 올바른 정답을 찾아내도록 계속 인간으로 부터 학습하게 된다.
4) 그래서, ML 은 주어진 인풋에 대해서 올바른 결과값(정답)을 도출해낼때까지 학습을 마쳤다면 해당 ML model은 서비스에 활용이 될 수 있는 것이다.
지도학습과 차이점을 비교해보면,
- 지도학습의 인풋 : 데이터 + Label + 학습목표(training objectives)
- 비지도학습의 인풋 : 데이터 + 학습목표
=> 이때 주의할점은, 비지도학습은 training objectives, 즉 학습목표도 인풋으로 받는다.
다양한 행동과 시행착오를 걲으면서 환경에 대해 경험(experience)를 쌓아나가면서 학습해 나가는 방식
여러가지 dataset 중에서 Iris dataset 에 대해 Classification 을 진행해보자.
아래처럼 실제로 있는 꽃 하나에 대해 길이를 특정해서 feature 화 시킨것이다. feature화된 정보 4자지 종류를 가지고 어떤 해당 꽃이 어떤 상세 품종인지를 맞춰보는 것이다.
sklearn.datasets 에 정의되어 있고, load_iris 함수를 통해 datast 을 호출할 수 있다.
Iris dataset 을 포함해서 sklearn 에 있는 대부분의 ML 알고리즘들은 2차원 행렬의 형태를 지닌다. 이때 행렬의 행은 sample 데이터의 개수이고, 열은 feature 의 개수이다. 즉 "(sample 데이터 개수) x (feature 개수)" 의 행렬 형태를 보유하고 있다.
150개의 sample 꽃 데이터와 4가지 종류의 feature 를 보유하고 있다.
shape 함수 : 해당 dataset 의 행렬의 사이즈를 출력한다. (150, 4) 와 같이 출력한다. 즉, Iris dataset은 150행 4열짜리 크기를 가진 행렬이다.
해당 dataset 의 Lable 값을 조회하고 싶다면 target 함수를 사용하면 된다.
target : 해당 dataset 의 모든 각 데이터들이 속해있는 label 값을 숫자로 치환해서 싹다 출력하는 함수
=> 0이 출력되는 경우, 해당 데이터는 0번째 label 클래스에 대한 데이터임을 의미
target_names : 해당 dataset 의 label 종류를 모두 출력
dataset 을 가지고 ML model 을 만드는 방법 => fit 메소드를 호출하면 끝!
fit 함수 : 입력받은 파라미터 데이터를 적절히 변환시켜서 ML model 을 학습(training) 시켜주는 함수
=> 지도학습이든 비지도학습이든, 행렬의 형태로써 데이터가 저장할때 shape 함수로 출력을 해봤을 때 (150, 4) 와 같은 형태로써 저장이 됐을것이다.
즉, 앞서 말한 내용이지만 행렬의 행부분에는 sample 의 개수가, 행렬의 열 부분에는 feature 의 개수가 적절한 형태로 구현되어야 한다.
fit 함수를 호출해서 ML 모델을 학습을 다 시키고 종료되고나서 ML 모델을 서비스에서 활용할때 predict 함수를 사용하면 입력한 데이터에 대한 아웃풋을 생성해준다. (ex. 인풋으로 고양이 사진주면, 이거 고양이 사진임~ 이라고 ML 모델이 리턴해줌 )
ex) output = classifer.predict(X_test)
Get Data : 인간으로부터 데이터를 입력받는다.
Clean, Prepare, Manipulate Data : 학습할 데이터(Training Data) 와 성능 평가시 사용할 데이터(Test Data) 를 분류시킨다.
Train Model : 훈련시킴
Test Data : 학습이 완료된 ML 모델을 가지고 테스트를 해본다.
Improve : 더 향상된 ML 모델이 나오기전까지 1~3 사이의 과정들을 계속해서 반복한다.
Final Model : 향상 과정까지 마쳤다면 최종적인 ML model 이 생성된다.
dataset 에 존재하는 데이터들에 대해 학습할 데이터(Training Data) 와 성능 평가시 사용할 데이터(Test Data) 를 분류시키는 과정을 Split the dataset 이라한다.
이떄 test dataset 은 외부에 유촐되서는 안된다. 만일 유출된 데이터는 dara leakage 라고 부른다.
두 dataset 은 비율 조정이 가능하며, 보통 training dataset 의 사이즈가 test dataset 의 사이즈보다 더 크다.
- train_test_split 함수 : Training Data 와 Test Data 로 데이터를 분류시켜주는 함수
- test_size : 전체 dataset 에서 Test Dataset 의 비율을 할당시켜주는 함수
그리고 train_test_split 함수는 아래와 같은 형태를 지닌다.
각 feature 들의 스케일 값이 많이 차이가 날수있다. 예를들어 어떤 dataset 의 feature1 의 data 들의 값들은 0.1, 0.3, 0.6 과 같은 값들인데, feature2 의 data 값들은 10000, 500백만 과 같이 차이가 심하면 ML 이 학습하기가 곤란해진다.
StandardScaler : 각 feature 들의 스케일을 맞춰줄 때 사용하는 함수
- 즉 dataset 을 split 하고 ML 에 값을 넣어주기전에 데이터를 변형시키는(스케일을 바꿔주는) 위와 같은 과정을 Transformation 이라고한다.
아래와 같은 식을 통해 스케일을 재조정한다.
z = (x - u) / s
StandardScaler 함수안의 fit 함수를 사용하고, 또 그 안의 transform 함수를 연달아서 사용해주면 된다.
아래처럼 4가지의 feature 들의 스케일이 얼추 비슷하게 맞추어진 모습을 확인할 수 있다.
그런데 make_pipeline 함수를 사용해서 Pipeline 객체를 생성후, 이 객체로 Transformation 변형과정과 test 과정까지 모든 일련을 과정을 한번에 처리가 가능하다.
make_pipeline 의 파라미터로 원하는 순서대로 객체를 넣어주면 된다.
StandardScaler() 객체는 직전에 살펴봤듯이 Transformation 를 해주는 함수이고, RandomForsetClassifier() 객체는 분류 ML 모델중에 하나다.
굉장히 다양한 유형에서의 성능을 평가할 지표가 나올 수 있는데(ex. 속도 빠르기, 꽃의 길이 등), 이번에는 대표적인 지표중 하나인 "정확도"로 성능을 평가해보겠다.
성능에 영향을 주는 값이면서 ML이 스스로 학습할 수 없는 값으로써, 사람이 직접 값을 지정해줘야하는 값들을 hyperparameters 라고한다.
분명 파라미터인데 스스로 학습이 안되고 우리가 직접 데이터를 넣어줘야함
이러한 hyperparameters 는 실험을 반복해서 지정값을 직접 찾을 수 밖에 없다. 그리고 이 과정을 조금 더 편하게 찾을 수 있도록 도와주는 기능이 sckit-learn 에 있다.
-> hyperparameters 를 찾는 방식은 여러가지가 있는데, 그 중 가장 쉬운 방법은 바로 randomized search 방법이다.
옵션2가지
RandomizedSearchCV 함수 : 주어진 범위 내에서 Random 하게 값을 하나 뽑아서 지정된 횟수만큼만 시도해보는 함수
RandomizedSearchCV 함수를 호출하면 max_depth 에 지정된 구간안에서 RandomForestClassifier 에게 학습을 시킨다.
n_iter 는 총 반복횟수이다.
아래 예제는 target 컬럼(label)의 사이즈를 계산한것이다.
앞서 배웠던 train_test_split 방식과 동일하게 진행하면된다.
두 클래스(feature) 를 재일 뚜렷하기 잘 구분할 구분선을 어떻게 그을 수 있을지에대해 학습하는 ML 모델
SVM 은 스케일의 영향을 많이받는다. 각 feature 들의 스케일 차이에 따라서 성능이 많이 차이난다. 따라서 SVM 을 사용할때는 스케일을 꼭 맞춰주자!
support vector : 구분선에 가장 가까이에 있는 데이터의 포인트 위치
은 아래와 같았다.
그리고 앞서 배웠듯이 지도학습은 data 와 label 모두 필요했지만, 비지도학습은 data 만 있으면 된다.
비슷한 데이터끼리 모아서 ML 알고리즘이 알아서 특정 그룹으로 그룹화 시키는 것
이떄 그룹을 cluster 라고 부른다.
대량의 feature 를 새로운 소량의 feature 들로 재구성 하는것 (ex. feature 1000개가 있는경우 새로운 타입의 feature 5개로 만든다)
위처럼 데이터틀 생성했다면 아래처럼 모델 객체를 생성하고 fit 을 해준다.
이떄 모델 객체를 생성시 옵션 n_clusters 는 k 를 의미한다.
마지막 과정인 결과확인, 즉 predict 과정은 predict 함수를 활용하면 된다.
각각의 데이터들이 어떤 인덱스값을 가지는 cluster 에 해당하는지를 인덱스 번호들을 array 로써 출력한다.
( cluster 가 3개이므로 인덱스 값이 0,1,2 중에 하나일 것이다. )
결과