최근 얼굴의 생동감(liveness)를 감지하는 프로젝트를 진행하고 있습니다. 앞서 살펴본 texture and frequency analysis 방법 외에도 인간의 미묘한 생체 활동 역시 생동감을 감지하기에 좋은 단서입니다. 그 중 눈 깜빡임은 모든 인간이 공통적으로, 무의식적으로 행하는 생체 활동입니다. 눈 깜빡임 여부를 알 수 있다면 생동감 역시 판단할 수 있다고 생각했습니다. 그래서 이번 포스팅에서는 눈 깜빡임 감지 알고리즘을 제시한 Real-Time Eye Blink Detection using Facial Landmarks 논문을 살펴보도록 하겠습니다.
Continue reading
최근 들어 FIDO(Fast IDentity Online) 방식을 통해 기존 ID, 패스워드가 아닌 홍채, 얼굴, 지문과 같은 생체 정보를 통해 인증하는 방식이 유행하고 있습니다. 특히 얼굴 인식 방식이 편리하다는 이유로 각광받고 있습니다. 모든 보안 문제가 그러하듯, 얼굴 인증 방식을 통과하려는 악의적인 침입인 Spoofing 역시 등장하였습니다. 얼굴 인증을 통과하는 Spoofing은 가상의 얼굴을 대조함으로써 인증을 통과하는데 구체적인 방법은 아래와 같습니다.
Continue reading
최근 kaggle 대회 참가를 준비하면서 성능을 향상시키기 위한 다양한 머신러닝 학습 방법을 알게 되었습니다. 오늘 포스팅에서는 그 중에서도 가장 직관적이지만 좋은 결과를 보여주었던 Pseudo Labeling에 대해 살펴보고자 합니다.
Continue reading
20. Hierarchial Clustering
Continue reading
19. K-Means Clustering
Continue reading
18. PCA(Principal Component Analysis)
Continue reading
17. Stacking
what?
why?
why not?
- 연산량이 많아 속도가 느리고 computational cost가 높아 현업에서 사용하기 힘들다
how?
1) Data \(D = {(x_i, y_i)}_{i=1}^m\)
Step 1
for t = 1 to T(number of base-level classifiers) train \(h_t\) based on \(D\)
- base-level classifier(ex SVM, KNN, Random Forest…)를 학습시킨다
1) for i = 1 to m(number of samples) construct new data set
- base-level classifier의 예측값을 meta classifier를 학습시키기 위한 input data로 사용한다
2) train meta classifier
- learn \(H\) based on \(D_h\)
Step 3
output ensemble classifier \(H\)
Code usage
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from vecstack import stacking
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=0)
models = [ ExtraTreesClassifier(random_state = 0, n_jobs = -1, n_estimators = 100, max_depth = 3),
RandomForestClassifier(random_state = 0, n_jobs = -1, n_estimators = 100, max_depth = 3),
XGBClassifier(seed = 0, n_jobs = -1, learning_rate = 0.1, n_estimators = 100, max_depth = 3)]
S_train, S_test = stacking(models, X_train, y_train, X_test,
regression = False, metric = accuracy_score,
n_folds = 4, stratified = True, shuffle = True,
random_state = 0, verbose = 2)
model = XGBClassifier(seed = 0, n_jobs = -1, learning_rate = 0.1, n_estimators = 100, max_depth = 3)
# Fit 2-nd level model
model = model.fit(S_train, y_train)
# Predict
y_pred = model.predict(S_test)
# Final prediction score
print('Final prediction score: [%.8f]' % accuracy_score(y_test, y_pred))
Reference
핸즈온 머신러닝
stacking 코드
stacking 설명
Continue reading
16. Catboost(Categorical Boost)
Continue reading
14. LightGBM(Light Gradient Boosting Machine)
Continue reading
14. XGBoost
Continue reading
13.Gradient Boosting
Continue reading
12. Adaboost
Continue reading
11. Random Forest
Continue reading
10. Voting and Bagging
10.1 Voting
Continue reading
9. Decision Tree
Continue reading
8. K-Nearest Neighbors
Continue reading
7. Support Vector Machine
7.1 Support Vector Machine for Classification
what?
- 서로 다른 범주에 속하는 데이터를 구분짓는 hyper plane과 support vector(범주 최전방에 속해있는 데이터) 간의 거리를 최대화하는 분류 알고리즘. Large Margin Classifier라고도 불림.
1) Logistic Regression과의 차이점
- logistic regression Loss function
\[\frac 1 m [\sum_{i=1}^M(y_ilog(h_\theta(x_i))+ (1-y_i)log(1-h_\theta(x_i)))] + \frac {\lambda} {2m}\sum_{j=0}^N\theta_j^2\]if \(\theta^Tx \ge 0\), then \(y=1\), else \(y=0\)
- Support Vector Machine Loss function
\[C\sum_{i=1}^M(y_icost_1(h(x_i)) + (1-y_i)cost_0(1-h(x_i))) + \frac 1 2 \sum_{j=0}^N\theta_j^2\]if \(\theta^Tx \ge 1\), then \(y=1\), else \(y=0\)
logistic regression : A + \(\lambda\)B
support vecotr machine : CA + B(C=\(\frac 1 {\lambda}\))
2) Mathmetics behind Support Vector Machine
- 규제항을 제외한 \(\frac 1 2 \sum_{j=0}^N\theta_j^2\)을 minimize해야함
#####= \(\frac 1 2 (\theta_0^2 + \theta_1^2 + ... + \theta_n^2)\)
ex) n = 2, \(\frac 1 2 (\theta_0^2 + \theta_1^2)\)
\(\theta^Tx = p * ||\theta|| \ge 1\)이 성립하기 위해서 SVM 알고리즘은 p의 크기를 최대화함으로써 \(\theta\)를 minimize할 것이다.
3) Non-linear classification
3-1) polynominal features를 더해줌으로써 가능
ex) \(x_1$ ->\)x_1^2 + 2$$
3-2) similarity(유사도) 추가
각 데이터를 랜드마크로 지정해 랜드마크와 데이터 사이의 거리를 feature로 추가하는 방식
\(l\) = landmark, \(f_1\) = similarity(\(x, l\))
similarity를 정하는 방식에는 여러 가지가 있다. 그 중 Gaussian kernel
은 다음과 같다.
Gaussian kernel = $$exp(\frac {- | | x - l | | ^2} {2\sigma^2})$$ |
(if \(x \approx l\) : \(exp(\frac {-0} {2\sigma^2}) = 1\),
else \(exp(\frac {-large} {2\sigma^2})\)) \[\theta_0 + \theta_1x_1 + ... + \theta_nx_n$ -> $\theta_0 + \theta_1f_1 + ... + \theta_nf_n\]
why?
non-linear 한 데이터 분류가 가능하다.
feature의 수가 data의 수보다 많을 때 효과적이다.
고차원 데이터에 대해서 좋은 성능을 보인다.
decision boundary는 support vector의 영향만을 받기 때문에 이상치의 영향을 조금 받는다.
why not?
how?
1)Data{(\(x_i, y_i\))}, M rows(data) and 1 column(feature)
2) Model : \(h_\theta(x) =\theta_0 + \theta_1x + ... + \theta_nx_n\)
3) Loss function \(C\sum_{i=1}^M(y_icost_1(h(x_i)) + (1-y_i)cost_0(1-h(x_i))) + \frac 1 2 \sum_{j=0}^N\theta_j^2\)
4) parameters C, \(\gamma\)(if using gaussian kernel),
Step 1
initialize parameters \(\theta_0, \theta_1,..., \theta_n\) for Model
step 2.
find optimal paramters
\(temp0 : = \theta_0 - \alpha$ $\frac {\partial J(\theta)} {\partial \theta_0}\)
\(temp1 : = \theta_1 - \alpha$ $\frac {\partial J(\theta)} {\partial \theta_1}\)
\(tempn : = \theta_n - \alpha$ $\frac {\partial J(\theta)} {\partial \theta_n}\)
\(\theta_0 : = temp0\)
\(\theta_1 : = temp1\)
\(\theta_n : = tempn\)
step 3.
Ouput : optimal hyper plane $h_\theta(x)$
Code usage
1) Linear Classification
from sklearn.svm import SVC
from sklearn.datasets import load_iris
iris = load_iris()
X = iris['data'][:, (2,3)]
y = iris['target']
setosa_or_versicolor = (y==0) | (y==1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
svm_clf = SVC(kernel = 'linear', C=float('inf'))
svm_clf.fit(X, y)
2) Non-linear Classification by adding polynominal features
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
poly_kernel_svm_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='poly', degree=3, coef0=1, C=5))
])
poly_kernel_svm_clf.fit(X, y)
3) Non-linear Classification by adding Gaussian similarity features
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
rbf_kernel_svm_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='rbf', gamma=5, C=0.001))
])
rbf_kernel_svm_clf.fit(X, y)
7.2 Support Vector Machine for Regression
what?
why?
- Support Vector Machine for Classification과 동일
why not?
- Support Vector Machine for Classification과 동일
how?
- Support Vector Machine for Classification과 동일
Code usage
import numpy as np
import sklearn.svm import SVR
np.random.seed(42)
m = 100
X = 2 * np.random.rand(m, 1) - 1
y = (0.2 + 0.1 * X + 0.5 * X**2 + np.random.randn(m, 1)/10).ravel()
svm_poly_reg = SVR(kernel="poly", gamma='auto', degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)
Tips
Support Vector Machine Parameters
|:———:|:—:|:——-:|:——:|
C | 얼마나 많은 샘플이 다른 범주에 놓일지 결정 | 이상치 가능성을 높게 봄, 높으면 underfit, hard margin | 이상치 가능성을 낮게 봄, 낮으면 overfit, soft margin |
gamma | 하나의 데이터 샘플의 영향력을 결정 | 작은 표준편차, 영향력 거리가 작음, underfit | 큰 표준편차, 영향력 거리가 큼, overrfit |
epsilon | 마진 안에 얼마나 많은 샘플이 들어올지 결정 | 샘플이 마진 안에 들어올 수 있는 범위가 넓어짐, underfit | 샘플이 마진 안에 들어올 수 있는 범위가 좁아짐, overfit |
Reference
핸즈온 머신러닝
Coursera : Machine Learning by Andrew Ng
Support Vector Machine 장단점
Support Vector Machine for Regression 설명
Continue reading
6. Naive Bayes
Continue reading
5. Logistic Regression
5.1 Logistic Regression
Continue reading
4. 규제가 있는 Linear Regression
4.1 Lasso Regression
Continue reading
3. 복잡한 Linear Regression
3.1 Multivariate Linear Regression
Continue reading
2. Linear Regression
Continue reading
1. 머신러닝(Machine Learning)이란
Continue reading