728x90
In [1]:
# Jupyter Notebook 환경 설정
from IPython.core.display import display, HTML
display(HTML(
"""<style>
div.container { width:100% !implotant; }
div.CodeMirror { font-family: Consolas; font-size: 16pt;}
div.output {font-size: 16pt; font-weight: bold; }
div.input {font-family: Consolas; font-size: 16pt; }
div.prompt { min-width: 100px;}
</style>
"""))
확률적 경사하강법¶
In [ ]:
# 확률적 경사하강법(Stochastic Gradient Descent)
# 손실 함수(Loss function)
# 에포크(epochs)
In [3]:
# 점진적 학습
#조금씩 전달되는 훈련 데이터
#1.기존의 훈련 데이터에 새로운 데이터를 추가하여 분석 모델을 매일매일 다시 훈련
#2.새로운 데이터 추가시 이전 데이터를 버려서 훈련 데이터 크기를 일정하게 유지: 중요한 데이터는?
#3.이전에 훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 더 훈련하는 방법
In [4]:
# 도미, 빙어
도미 : 양성(1)
빙어: 음성(0)
예측 정답(target)
1 1
0 1
0 0
1 0
정확도: 0.5
4 개
0
0.25
0.5
0.75
1
확률
0.9
0.3
0.2
0.8
예측 양성클래스 타겟
0.9 1 0.9 * 1 ==> -0.9
0.3 1 0.3 * 1 ==> -0.3
0.2 0 1 - 0.2 = -0.8
0.8 0 -0.2
손실함수
# target = 1 일 때 -log(예측 확률)
# target = 0 일 때 -log(1-예측 확률)
양성 클래스(target=1)는 확률이 1에서 멀어질수록 손실은 아주 큰 양수가 됨
음성 클래스(target=0)는 확률이 0에서 멀어질수록 손실은 아주 큰 양수가 됨
File "C:\Users\BIT\AppData\Local\Temp/ipykernel_10824/3130632799.py", line 5 예측 정답(target) ^ IndentationError: unexpected indent
In [6]:
import pandas as pd
In [7]:
fish = pd.read_csv('fish.csv')
In [9]:
fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()
fish_target = fish['Species'].to_numpy()
In [11]:
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_input, fish_target, random_state=42)
In [12]:
from sklearn.preprocessing import StandardScaler
In [13]:
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
In [15]:
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=10, random_state=42)
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
0.773109243697479 0.775
C:\Users\BIT\anaconda3\lib\site-packages\sklearn\linear_model\_stochastic_gradient.py:574: ConvergenceWarning: Maximum number of iteration reached before convergence. Consider increasing max_iter to improve the fit. warnings.warn("Maximum number of iteration reached before "
In [17]:
sc.partial_fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
0.7815126050420168 0.8
In [18]:
# epoch와 과대/과소 적합
적은 epoch: 과소적합 모델
많은 epoch: 과대적합 모델
조기 종료(early stopping)
File "C:\Users\BIT\AppData\Local\Temp/ipykernel_10824/998874834.py", line 2 적은 epoch: 과소적합 모델 ^ SyntaxError: invalid syntax
In [19]:
import numpy as np
In [20]:
sc = SGDClassifier(loss='log', random_state=42)
train_score = []
test_score = []
classes = np.unique(train_target)
In [21]:
for _ in range(0, 300):
sc.partial_fit(train_scaled, train_target, classes=classes)
train_score.append(sc.score(train_scaled, train_target))
test_score.append(sc.score(test_scaled, test_target))
In [22]:
import matplotlib.pyplot as plt
In [23]:
plt.plot(train_score)
plt.plot(test_score)
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()
In [24]:
sc = SGDClassifier(loss='log', max_iter=100, tol=None, random_state=42)
sc.fit(train_scaled, train_target)
print(sc.score(train_scaled, train_target))
print(sc.score(test_scaled, test_target))
0.957983193277311 0.925
In [ ]:
728x90
'머신러닝' 카테고리의 다른 글
cross-validation (0) | 2022.03.22 |
---|---|
logistic-regression (0) | 2022.03.22 |
Multiple regression (0) | 2022.03.22 |
댓글