심층 학습/정칙화의 효과를 보이게 한다
1. 소개
심층 학습 공부를 시작했습니다. 이번에는 정규화에 대해 간단히 정리해 보겠습니다.
2. 데이터 생성
방정식 $y=-x^3+x^2+x$ 를 기준으로 x는 -10~10을 50분할한 값, y는 방정식에 그 x를 대입한 결과에 0~0.05의 난수를 더했다. 값으로 데이터를 만듭니다.
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
# データの生成
np.random.seed(0)
X = np.linspace(-10, 10, 50)
Y_truth = 0.001 * (-X **3 + X**2 + X)
Y = Y_truth + np.random.normal(0, 0.05, len(X))
plt.figure(figsize=(5, 5))
plt.plot(X, Y_truth, color='gray')
plt.plot(X, Y, '.', color='k')
plt.show()
작성한 데이터입니다. 실선이 참값(방정식의 값), 점이 실제로 관측하는 값(y에 노이즈를 더한 값)이라고 하는 가정입니다.
3. 다항식 회귀 도입
과학은 자유도가 높을수록 일어나기 쉽기 때문에 굳이 30차원의 다항식 회귀를 도입합니다.
# グラフ表示
def graph(Y_lr, name):
plt.figure(figsize=(6, 6))
plt.plot(X, Y_truth, color='gray', label='truth')
plt.plot(xs, Y_lr, color='r', markersize=2, label=name)
plt.plot(X, Y, '.', color='k')
plt.legend()
plt.ylim(-1, 1)
plt.show()
# 表示設定
xs = np.linspace(-10, 10, 200)
# 多項式回帰の導入
poly = PolynomialFeatures(degree=30, include_bias=False)
X_poly = poly.fit_transform(X[:, np.newaxis])
그래프 표시나 표시의 설정을 한 후, PolynomialFeatures를 인스턴스화해, 피트하고 있습니다. 차원은 30차원(degree=30)입니다.
4. 정규화 없음
우선, 정규화 없이 다항식 회귀를 실시합니다.
# 正則化なし
lr0 = linear_model.LinearRegression(normalize=True)
lr0.fit(X_poly, Y)
Y_lr0 = lr0.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr0, 'No Regularization')
30차원의 다항식과 자유도가 높기 때문에, 수많은 점을 기용으로 통과할 수 있어 버려, 전형적인 과학습에 빠지고 있습니다. 진정한 값과는 멀어져 버려, 이것으로는 일반화 성능은 바랄 수 없습니다.
5.L2 정규화
L2 정칙화란, Ridge(리지) 회귀로 알려진 수법으로, 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L2 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|^2$
# L2正則化
lr2 = linear_model.Ridge(normalize=True, alpha=0.5)
lr2.fit(X_poly, Y)
Y_lr2 = lr2.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr2, 'L2')
글쎄, 잘 회귀 할 수있는 느낌입니다.
6.L1 정규화
L1 정규화란, Lasso(라소) 회귀로 알려진 수법으로, 마찬가지로 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L1 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|$
# L1正則化
lr1 = linear_model.LassoLars(normalize=True, alpha=0.001)
lr1.fit(X_poly, Y)
Y_lr1 = lr1.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr1, 'L1')
저스트 피트에 꽤 가까운 형태입니다. L1 정칙화와 비교하면 L2 정칙화가 더 잘 회귀 할 수있는 것 같습니다.
7. 차원 계수 비교
정규화 없음, L2 정칙화, L1 정칙화 각각 30개의 차원 계수를 비교합니다(차원이 낮은 쪽에서 나란히 있습니다).
import pandas as pd
result = []
for i in range(len(lr0.coef_)):
tmp = lr0.coef_[i], lr2.coef_[i], lr1.coef_[i]
result.append(tmp)
df = pd.DataFrame(result)
df.columns = ['No Regularization', 'L2', 'L1']
print(df)
L2는 No Regularization에 비해 계수가 작아지고 있는 것을 알 수 있다고 생각합니다. L1은 한층 더, 완전하게 0의 곳이 많은 표현(스퍼스인 표현)이 되어 있습니다.
L1 정칙화는, 과학습 억제+차원 삭감도 할 수 있는 것은, 기쁘네요.
Reference
이 문제에 관하여(심층 학습/정칙화의 효과를 보이게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jun40vn/items/82d2bd36543a0e8cd1ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
방정식 $y=-x^3+x^2+x$ 를 기준으로 x는 -10~10을 50분할한 값, y는 방정식에 그 x를 대입한 결과에 0~0.05의 난수를 더했다. 값으로 데이터를 만듭니다.
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
# データの生成
np.random.seed(0)
X = np.linspace(-10, 10, 50)
Y_truth = 0.001 * (-X **3 + X**2 + X)
Y = Y_truth + np.random.normal(0, 0.05, len(X))
plt.figure(figsize=(5, 5))
plt.plot(X, Y_truth, color='gray')
plt.plot(X, Y, '.', color='k')
plt.show()
작성한 데이터입니다. 실선이 참값(방정식의 값), 점이 실제로 관측하는 값(y에 노이즈를 더한 값)이라고 하는 가정입니다.
3. 다항식 회귀 도입
과학은 자유도가 높을수록 일어나기 쉽기 때문에 굳이 30차원의 다항식 회귀를 도입합니다.
# グラフ表示
def graph(Y_lr, name):
plt.figure(figsize=(6, 6))
plt.plot(X, Y_truth, color='gray', label='truth')
plt.plot(xs, Y_lr, color='r', markersize=2, label=name)
plt.plot(X, Y, '.', color='k')
plt.legend()
plt.ylim(-1, 1)
plt.show()
# 表示設定
xs = np.linspace(-10, 10, 200)
# 多項式回帰の導入
poly = PolynomialFeatures(degree=30, include_bias=False)
X_poly = poly.fit_transform(X[:, np.newaxis])
그래프 표시나 표시의 설정을 한 후, PolynomialFeatures를 인스턴스화해, 피트하고 있습니다. 차원은 30차원(degree=30)입니다.
4. 정규화 없음
우선, 정규화 없이 다항식 회귀를 실시합니다.
# 正則化なし
lr0 = linear_model.LinearRegression(normalize=True)
lr0.fit(X_poly, Y)
Y_lr0 = lr0.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr0, 'No Regularization')
30차원의 다항식과 자유도가 높기 때문에, 수많은 점을 기용으로 통과할 수 있어 버려, 전형적인 과학습에 빠지고 있습니다. 진정한 값과는 멀어져 버려, 이것으로는 일반화 성능은 바랄 수 없습니다.
5.L2 정규화
L2 정칙화란, Ridge(리지) 회귀로 알려진 수법으로, 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L2 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|^2$
# L2正則化
lr2 = linear_model.Ridge(normalize=True, alpha=0.5)
lr2.fit(X_poly, Y)
Y_lr2 = lr2.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr2, 'L2')
글쎄, 잘 회귀 할 수있는 느낌입니다.
6.L1 정규화
L1 정규화란, Lasso(라소) 회귀로 알려진 수법으로, 마찬가지로 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L1 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|$
# L1正則化
lr1 = linear_model.LassoLars(normalize=True, alpha=0.001)
lr1.fit(X_poly, Y)
Y_lr1 = lr1.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr1, 'L1')
저스트 피트에 꽤 가까운 형태입니다. L1 정칙화와 비교하면 L2 정칙화가 더 잘 회귀 할 수있는 것 같습니다.
7. 차원 계수 비교
정규화 없음, L2 정칙화, L1 정칙화 각각 30개의 차원 계수를 비교합니다(차원이 낮은 쪽에서 나란히 있습니다).
import pandas as pd
result = []
for i in range(len(lr0.coef_)):
tmp = lr0.coef_[i], lr2.coef_[i], lr1.coef_[i]
result.append(tmp)
df = pd.DataFrame(result)
df.columns = ['No Regularization', 'L2', 'L1']
print(df)
L2는 No Regularization에 비해 계수가 작아지고 있는 것을 알 수 있다고 생각합니다. L1은 한층 더, 완전하게 0의 곳이 많은 표현(스퍼스인 표현)이 되어 있습니다.
L1 정칙화는, 과학습 억제+차원 삭감도 할 수 있는 것은, 기쁘네요.
Reference
이 문제에 관하여(심층 학습/정칙화의 효과를 보이게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jun40vn/items/82d2bd36543a0e8cd1ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# グラフ表示
def graph(Y_lr, name):
plt.figure(figsize=(6, 6))
plt.plot(X, Y_truth, color='gray', label='truth')
plt.plot(xs, Y_lr, color='r', markersize=2, label=name)
plt.plot(X, Y, '.', color='k')
plt.legend()
plt.ylim(-1, 1)
plt.show()
# 表示設定
xs = np.linspace(-10, 10, 200)
# 多項式回帰の導入
poly = PolynomialFeatures(degree=30, include_bias=False)
X_poly = poly.fit_transform(X[:, np.newaxis])
우선, 정규화 없이 다항식 회귀를 실시합니다.
# 正則化なし
lr0 = linear_model.LinearRegression(normalize=True)
lr0.fit(X_poly, Y)
Y_lr0 = lr0.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr0, 'No Regularization')
30차원의 다항식과 자유도가 높기 때문에, 수많은 점을 기용으로 통과할 수 있어 버려, 전형적인 과학습에 빠지고 있습니다. 진정한 값과는 멀어져 버려, 이것으로는 일반화 성능은 바랄 수 없습니다.
5.L2 정규화
L2 정칙화란, Ridge(리지) 회귀로 알려진 수법으로, 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L2 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|^2$
# L2正則化
lr2 = linear_model.Ridge(normalize=True, alpha=0.5)
lr2.fit(X_poly, Y)
Y_lr2 = lr2.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr2, 'L2')
글쎄, 잘 회귀 할 수있는 느낌입니다.
6.L1 정규화
L1 정규화란, Lasso(라소) 회귀로 알려진 수법으로, 마찬가지로 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L1 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|$
# L1正則化
lr1 = linear_model.LassoLars(normalize=True, alpha=0.001)
lr1.fit(X_poly, Y)
Y_lr1 = lr1.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr1, 'L1')
저스트 피트에 꽤 가까운 형태입니다. L1 정칙화와 비교하면 L2 정칙화가 더 잘 회귀 할 수있는 것 같습니다.
7. 차원 계수 비교
정규화 없음, L2 정칙화, L1 정칙화 각각 30개의 차원 계수를 비교합니다(차원이 낮은 쪽에서 나란히 있습니다).
import pandas as pd
result = []
for i in range(len(lr0.coef_)):
tmp = lr0.coef_[i], lr2.coef_[i], lr1.coef_[i]
result.append(tmp)
df = pd.DataFrame(result)
df.columns = ['No Regularization', 'L2', 'L1']
print(df)
L2는 No Regularization에 비해 계수가 작아지고 있는 것을 알 수 있다고 생각합니다. L1은 한층 더, 완전하게 0의 곳이 많은 표현(스퍼스인 표현)이 되어 있습니다.
L1 정칙화는, 과학습 억제+차원 삭감도 할 수 있는 것은, 기쁘네요.
Reference
이 문제에 관하여(심층 학습/정칙화의 효과를 보이게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jun40vn/items/82d2bd36543a0e8cd1ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# L2正則化
lr2 = linear_model.Ridge(normalize=True, alpha=0.5)
lr2.fit(X_poly, Y)
Y_lr2 = lr2.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr2, 'L2')
L1 정규화란, Lasso(라소) 회귀로 알려진 수법으로, 마찬가지로 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L1 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|$
# L1正則化
lr1 = linear_model.LassoLars(normalize=True, alpha=0.001)
lr1.fit(X_poly, Y)
Y_lr1 = lr1.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr1, 'L1')
저스트 피트에 꽤 가까운 형태입니다. L1 정칙화와 비교하면 L2 정칙화가 더 잘 회귀 할 수있는 것 같습니다.
7. 차원 계수 비교
정규화 없음, L2 정칙화, L1 정칙화 각각 30개의 차원 계수를 비교합니다(차원이 낮은 쪽에서 나란히 있습니다).
import pandas as pd
result = []
for i in range(len(lr0.coef_)):
tmp = lr0.coef_[i], lr2.coef_[i], lr1.coef_[i]
result.append(tmp)
df = pd.DataFrame(result)
df.columns = ['No Regularization', 'L2', 'L1']
print(df)
L2는 No Regularization에 비해 계수가 작아지고 있는 것을 알 수 있다고 생각합니다. L1은 한층 더, 완전하게 0의 곳이 많은 표현(스퍼스인 표현)이 되어 있습니다.
L1 정칙화는, 과학습 억제+차원 삭감도 할 수 있는 것은, 기쁘네요.
Reference
이 문제에 관하여(심층 학습/정칙화의 효과를 보이게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jun40vn/items/82d2bd36543a0e8cd1ff
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import pandas as pd
result = []
for i in range(len(lr0.coef_)):
tmp = lr0.coef_[i], lr2.coef_[i], lr1.coef_[i]
result.append(tmp)
df = pd.DataFrame(result)
df.columns = ['No Regularization', 'L2', 'L1']
print(df)
Reference
이 문제에 관하여(심층 학습/정칙화의 효과를 보이게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jun40vn/items/82d2bd36543a0e8cd1ff텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)