◎ Perceptron
- 하나의 뉴런
- 입력 데이터 혹은 다른 레이어의 출력물을 받아 결과값을 내는 구조
- Input, weights, activation function (활성함수)로 구성
※ Activation function(활성함수) 특징 : 연속, 비선형, 단조증가, bounded, 점근성의 특성
※ Activation function(활성함수)의 필요성 : 은닉 layer를 의미 있게 쌓아주는 역할, 선형의 layer만 쌓인다면, 결국 하나의 선형식이 된다. 출력값의 range를 결정
※ Input layer(입력층) : 입력 데이터를 의미
※ Hidden layer : 입력 데이터 혹은 또는 다른 Hidden layer의 출력 값, 위의 입력값을 받는 perceptron들의 집합
※ Output layer : 마지막 hidden layer의 출력 값, 최종 출력물을 만들어내는 perceptron들의 집합
◎ 수학적 개념 이해
⑴ 바이너리 논리 연산 : AND, OR, XOR 연산이 존재
⑵ 단층 Perceptron : 속성이 2개인 경우, 평면상의 직선으로 표현 가능, 직선으로 분리되는 영역을 통하여, 2-class problem을 해결
⑶ AND 연산을 하는 Perceptron :
⑷ OR 연산을 하는 Perceptron :
⑸ XOR 연산을 하는 Perceptron :
◎ 인조 뉴련 OR 연산 구축
※ Weight 업데이트 알고리즘 :
- Gradient descent (경사하강법)
§ LR : weight를 변화시키는 정도 ( 값이 너무 크면 정확도가 떨어지며 값이 너무 작아도 수렴하기까지 시간이 오래 걸림)
§ E : 정의된 error 값
§ Activation function : step function
§ 알고리즘의 진행과정 : 1 임의의 LR값, 초기 w값 설정 -> 2 출력값을 계산 -> 3 E의 계산 -> 4 w의 업데이트 -> 2-4 반복
◎ Backpropagation (역전파 알고리즘)
- Multi layer perceptron을 학습시키기 위한 방법
- Output layer에서의 error의 변화량을 앞선 layer들로 전파한다는 개념
◎ 신경망 모형의 한계점
1. Gradient vanishing
- Sigmoid 함수의 한계점 : 미분함수값 최대값 1/4, 미분했을때 X 값이 0에서 멀어질 수록 0에 가까워 진다. + Backpropagation시 미분값이 소실되는 현상 발생 + 함수값 중심이 0이 아님
☆ 해결방법 : ReLU 함수 사용 => 0 보다 큰 경우 기울기 유지, 0보다 작은 경우 기울기가 없는 문제점은 다른 ReLU 계열 함수 사용 (ELU {Exponential Linear Unit})
2. 중간해 멈춤 현상
- 최적해에 이르기 전에 중간해에서 멈추는 현상
☆ 해결방법 : Pre-training : Boltzmann Machine = Unsupervised 방식으로 미리 training 시켜 local minima 문제를 해소, 올바른 초기값 선정에 도움
3. 과적합 문제 : Alpha 값을 통하여 weight의 크기를 제한하는 방법이 사용되었으나, 부족
☆ 해결방법 : Drop out을 총한 과적합 문제 완화
Artificial Neural Network 실습¶
1. 데이터 불러오기, 및 Neural Network 적합¶
X = [[0., 0.], [1., 1.]]
y = [[0, 1], [1, 1]]
- 함수 불러오기
from sklearn.neural_network import MLPClassifier
- 모델 적합
clf = MLPClassifier(solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(5,2),random_state=1)
clf.fit(X,y)
MLPClassifier(alpha=1e-05, hidden_layer_sizes=(5, 2), random_state=1, solver='lbfgs')
clf.predict([[2.,2.],[-1.,-2.]])
array([[1, 1], [0, 1]])
clf.coefs_
[array([[-0.15011367, -0.62860541, -0.90433213, -3.45938109, -0.63904618], [-0.73749132, -1.5947694 , -0.2793927 , -3.28854097, 0.0702225 ]]), array([[ 0.30838904, -0.14960207], [ 3.14928608, -0.65056811], [-0.54615798, 0.54407041], [ 4.36386369, -0.33753023], [ 0.34792663, 0.68091737]]), array([[-3.58233912, 2.68515229], [ 0.9049651 , -0.96123048]])]
[coef.shape for coef in clf.coefs_]
[(2, 5), (5, 2), (2, 2)]
2. model의 복잡도에 따른 퍼포먼스 비교¶
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neural_network import MLPClassifier
- 설정할 parameter들을 입력. h는 시각화를 얼마나 자세하게 할 것인가에 대한 위한 임의의 값.
h = .02
alphas = np.logspace(-5, 3, 5)
names = ['alpha ' + str(i) for i in alphas]
alphas
array([1.e-05, 1.e-03, 1.e-01, 1.e+01, 1.e+03])
names
['alpha 1e-05', 'alpha 0.001', 'alpha 0.1', 'alpha 10.0', 'alpha 1000.0']
classifiers = []
for i in alphas:
classifiers.append(MLPClassifier(solver='lbfgs', alpha=i, random_state=1,
hidden_layer_sizes=[100, 100]))
- 데이터 생성
X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,
random_state=0, n_clusters_per_class=1)
pd.DataFrame(X).head()
0 | 1 | |
---|---|---|
0 | -0.605416 | 1.296708 |
1 | 1.354900 | -0.046877 |
2 | 1.780375 | 1.099858 |
3 | 1.436615 | 0.807641 |
4 | 0.721669 | 1.168160 |
pd.DataFrame(y).head()
0 | |
---|---|
0 | 1 |
1 | 0 |
2 | 1 |
3 | 1 |
4 | 1 |
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)
- 여러 모양의 추가 데이터셋 생성
datasets = [make_moons(noise=0.3, random_state=0),
make_circles(noise=0.2, factor=0.5, random_state=1),
linearly_separable]
figure = plt.figure(figsize=(17, 9))
i = 1
<Figure size 1224x648 with 0 Axes>
for X, y in datasets:
# preprocess dataset, split into training and test part
X = StandardScaler().fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4)
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
# just plot the dataset first
cm = plt.cm.RdBu
cm_bright = ListedColormap(['#FF0000', '#0000FF'])
ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
# Plot the training points
ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
# and testing points
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6)
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
ax.set_xticks(())
ax.set_yticks(())
i += 1
# iterate over classifiers
for name, clf in zip(names, classifiers):
ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
clf.fit(X_train, y_train)
score = clf.score(X_test, y_test)
# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].
if hasattr(clf, "decision_function"):
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
else:
Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
# Put the result into a color plot
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, cmap=cm, alpha=.8)
# Plot also the training points
ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
edgecolors='black', s=25)
# and testing points
ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
alpha=0.6, edgecolors='black', s=25)
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(name)
ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
size=15, horizontalalignment='right')
i += 1
figure.subplots_adjust(left=.02, right=.98)
plt.show()
C:\work\envs\datascience\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter) C:\work\envs\datascience\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter) C:\work\envs\datascience\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter) C:\work\envs\datascience\lib\site-packages\sklearn\neural_network\_multilayer_perceptron.py:500: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html self.n_iter_ = _check_optimize_result("lbfgs", opt_res, self.max_iter)
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:80% !important;}</style>"))
'Data scientist > Machine Learning' 카테고리의 다른 글
의사결정나무 + Python_Code (0) | 2021.08.26 |
---|---|
SVM + Python_Code (0) | 2021.08.26 |
LDA + Python_Code (0) | 2021.08.25 |
K-NN + Python_Code (0) | 2021.08.25 |
Naive Bayes + Python_Code (0) | 2021.08.25 |