일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 |
- 가브리엘마르케스
- 비전공자 코딩교육
- til
- 민음사
- 홍명희 임꺽정
- 인생책짧은글
- 멋쟁이사자처럼 전액국비지원
- 영화추천시스템
- 이렇게 그녀를 잃었다
- 멋쟁이사자처럼 k-digital
- 비전공자 멋쟁이사자처럼
- AI 국비지원
- 영화AI추천
- 멋쟁이사자처럼
- 인터뷰
- 멋사 전액국비지원교육
- 멋쟁이사자처럼 k 디지털
- k 디지털 후기
- 문학동네
- k 디지털
- 비전공자 코딩
- 유니오르
- AI 코딩
- 멋사 AI 교육
- 멋사 k 디지털
- 멋사 국비지원과정
- 멋사 AI
- 인생책
- 추천프로젝트
- 리뷰
- Today
- Total
글쟁이, 코딩한다
0106 / k_digital 21일차 / ML이론기초(지도학습) 본문
0.
머신러닝은 놀랍다.
간단히만 이해하자면 내가 이해할 수 있다는 점도 놀랍다.
1.
전통적인 머신러닝의 대장들. 이해가 온전하지 않았던 수학공식들은 추가 공부를 한 후에 기록한다.
SVM
(Support Vector Machine, 서포트 벡터 머신)
패턴 인식을 위한 지도 학습 모델
(x가 여럿인 data에서) 두 종류의 데이터를 가르는 더 나은 결정 경계(Decision boundary, 모델선)를 찾는다.
서포트 벡터(Support vector) : 결정 경계에 가장 가까운 클래스 데이터
결정 경계와 평행하며 위쪽 서포트 벡터와 맞닿은 선 : plus-plane
결정 경계와 평행하며 아래쪽 서포트 벡터와 맞닿은 선 : minus-plane
plus-plane과 minus-plane 사이 거리 : Margin : 서로 다른 두 클래스 사이 최단거리
SVM은 Margin이 가장 큰 결정 경계를 찾는 방법이다.
Soft Margin SVM
문제1 : plus, minus-plane과 동떨어져 자기 클래스 영역을 벗어난 noise들이 있다
=> noise들이 plane과 떨어진 거리의 합 * C의 값을 minimize // hyper-parameter인 C가 클수록 에러를 적게 허용
=> 결정 경계가 먼 오류(minimize해 작아진 값)를 무시하도록 해줌으로써 결정 경계를 과감하게 그리도록 해준다
KSVMs (커널 서포트 벡터 머신, Kernel Support Vector Machines)
문제2 : 데이터가 직선으로 나뉘지 않는다 = 선형분리 불가능 = Linearly Unseparable
=> 어떤 x데이터를 제곱한 임시 x데이터를 만들어 데이터를 고차원 공간으로 잠시 올려보내 가른다.
=> 구분선을 구한 후 임시 공간을 날리면, 원 모양 선만 남는다.
=> 이렇게 차원을 올려주는 방법 : Kernel Function(여러 개가 있다. 어떤 것을 쓰느냐도 선택(hyper-parameter))
<코드 실습> Feature scailing, HPO를 기억해두자
#data 처리
@feature scailing
#data 자릿값 맞추기 = Normalization
1) Min-Max Algorithm
#min(열) = 0, max(열) = 1
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
sc.fit(X_train) #밀어넣은 data의 min, max를 구한다
sc.transform(X_train) #정규화로 변환
2) Standardization (보통은 minmax보다 성능 우수)
#mean(열) = 0, std(열) = 1
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train) #밀어넣은 data의 mean, std를 구한다
sc.transform(X_train) #정규화로 변환
#train data와 test data의 정규화는 train data의 값을 기준으로 한다.(new data와도 min값, max값, mean값 등은 새로 구하지 않는다)
#SVM은 자릿수가 다를 때면 모델이 무너진다. 성능을 올리기 위해서는 맞춰주자.
#SVM 함수를 가지고 나갈 때는, scaler도 같이 들고 나가야 한다.
#열이 어떤 분류로 나눠졌을 때(ex. 0, 1, 2로 구분된 값) -이 때 정수들은 일종의 심볼. 이들의 scale을 맞추려면
from sklearn.preprocessing import OneHotEncoder
@모델 생성
from sklearn.svm import SVC
svc = SVC(kernel='rbf', C=10, gamma=0.1).fit(X, y)
#SVC : SVM Classifier(분류 문제) #SVR : SVM Regressor(회귀 문제)
@모델 성능과 이어지는 hyper-para :
kernel= 'rbf' : RBF(방사기저함수) : 가우시안 커널 : 가장 기본적인 커널 함수
C= 큰 값 : 에러를 적게 허용, 작은 값 : 에러를 곧잘 허용 / 어떤 값이 나은지는 아직 미지수(작다고 무조건 좋지는 않다)
gamma= 커널 함수 단면 반지름의 역수 => gamma가 커지면 구분 원(커널 적용 후 남은 구분선)이 작아짐 / gamma가 작아지면 구분 원이 커짐
!쉽게 생각하기 : C와 gamma값이 커지면 overfitting이 날 확률이 높아진다. 적당히 올려주면 모델 성능이 올라갈 수도 있다.
@Hyper-parameter Optimization (HPO, 하이퍼파라미터 튜닝)
1-Grid Search
from sklearn.model_selection import GridSearchCV
param_grid = {'C' : [0.1, 1, 10],
'gamma' : [0.1, 0.01, 0.001],
'kernel' : ['rbf']}
#hyper-para 값들의 후보군(dict)
grid = GridSearchCV(svm.SVC( ), param_grid, refit=True, verbose=1)
#refit= 나온 grid 값을 model에 덮어씌움(grid 자체가 예측 가능한 model이 됨) #verbose= 수다쟁이, 함수가 길어지면 설명을 써줌
#그 외
2-Random Search
3-Bayesian Search
@분류정확도
svc.score(X_train, Y_train)
#분류 model.score( ) => accuracy score를 구해주는 함수
#accuracy score는 굉장히 나이브한 평가법
@classification_report( )
precision, recall, f1-scroe 등을 알려준다
Decision Tree
의사결정나무, 일정 기준을 두고, 세부로 파고들며 판단 내린다
이해하기 쉽고 해석이 용이. but 입력 데이터의 작은 변동(이례적인 데이터)에 구성이 요동, overfitting이 쉽게 생김, leaf node(Tree 구조의 최하위 갈래) = 1개인 경우가 자주 생긴다(판단 근거가 취약해짐)
해결책 => Boosting (model ensemble 중 하나)
@model emsemble :
1-여러 예측 모형을 만든다 2-값들을 취합해 결정 : 분류는 투표로, 회귀는 평균값으로
#다른 하나 : Bagging -> Random Forest
: X data 일부를 선택해 모델 설계(병렬 연결, 각자 독립적) : 취합 방식은 같다
#일반적으로는 Boosting 기법의 성능이 좋다고 본다 #속도는 위
Boosting
중요 의사결정을 내리기는 힘든 weak learner들을 모아 strong learner를 만든다. (모델들은 상호보완적)
AdaBoost :
- 여러 weak learner를 반복해 생성
- 앞선 learner의 error에 가중치를 부여(중요도를 높여줌)
- 수없이 반복
- 마지막 단계 strong learner(분류: 클래스 투표, 회귀: 선을 겹쳐 평균)를 만들어 예측
==약점
1-가중치 오류로 덩치가 너무 크게 불려질 수도 -> 정확도 down
=해결방안=> 가중치를 θ로 두고 옳은 값을 찾는다. Gradient descent : ①Gradient Boosting(2012)
2-시간이 너무 오래 걸림(의사결정나무 시뮬레이션)
=해결방안=> 시뮬레이션들을 병렬처리(모델은 연결됐으므로 병렬처리 불가능)
②XG Boost(Extreme Gradient Boosting, 2016, 하이퍼파라미터 겁나 많음) ③Light GBM(2018, 콜랩으로 써야함)
④NGBoost(2020)?
<코드 실습>
@모델 만들기
from sklearn import ensemble
clf = ensemble.GradientBoostingRegressor(n_estimators=500,
max_depth=4,
min_samples_split=2,
learning_rate=0.01,
loss='ls')
#n_estimators = 의사결정나무의 숫자
#gbm python hyperparameter list = https://c11.kr/l4ku
@Tree 기반 모델의 특징 : 열의 중요도를 파악하기 쉽다 : model 해석에 용이
clf.feature_importances_
#열의 중요도를 가리는 함수 #열 중요도를 시각화로 표현해보자
오늘의 TML
1) 샘플 데이터셋
from sklearn import datasets
datasets.load_sample()
#샘플데이터 불러오기(boston, iris 등)
pd.DataFrame(data.data)
#dict형태로 나온 데이터를 dataframe으로 변환
오늘의 나중 볼 것
수학공식 유튜브 3 blue 1 brown
'나는 코딩도 한다 > TIL' 카테고리의 다른 글
0108 / k_digital 23일차 / 세미프로젝트2 (2) | 2021.01.08 |
---|---|
0107 / k_digital 22일차 / ML이론기초(비지도학습) (0) | 2021.01.07 |
0105 / K_digital 20일차 / ML이론기초(지도학습) (0) | 2021.01.05 |
0104/ K_digital 19일차 / SQL, AI 입문 (0) | 2021.01.04 |
1231 / K_digital 18일차 / DB, SQL (3) | 2020.12.31 |