확률적 경사 하강법
훈련세트에서 샘플을 하나씩 꺼내 손실 함수의 경사를 따라 최적의 모델을 찾는 알고리즘이다.
샘플을 여러개씩 사용하면 미니배치 경사하강법, 샘플을 한번에 다 사용하면 배치 경사 하강법이다.
손실 함수
확률적 경사 하강법이 최적화할 대상이다.
1)이진분류일경우, 로지스틱회귀 또는 이진 크로스엔트로피 손실함수를 사용한다.
2)다중분류일경우, 크로스엔트로피 손실함수를 사용한다.
3)회귀일경우, 평균제곱근오차 손실함수를 사용한다.
에포크
확률적 경사 하강법에서 전체 샘플을 모두 사용하는 한 번 반복을 의미한다. 대체로 수십에서 수백번의 에포크를 반복한다.
SGDClassifier
확률적 경사 하강법을 사용한 분류 모델이다.
loss 매개변수에는 hinge가 기본값이며, 로지스틱 회귀를 위해서는 log로 지정한다.
SGDRegressor
확률적 경사 하강법을 사용한 회귀문제이다.
loss 매개변수에서 squared_error가 기본값이다.
import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv')
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
fish_target = fish['Species'].to_numpy()
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)
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
ss.fit(train_input,train_target)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
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))
sc.partial_fit(train_scaled,train_target)
print(sc.score(train_scaled,train_target))
print(sc.score(test_scaled,test_target))
과대적합이 되기 전 중간지점에서 조기종료를 시켜주면 된다.
import numpy as np
sc=SGDClassifier(loss='log',random_state=42)
train_score=[]
test_score=[]
classes=np.unique(train_target)
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))
import matplotlib.pyplot as plt
plt.plot(train_score)
plt.plot(test_score)
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.show()
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))
출처: 혼공머신