バイアス、分散、消滅不能誤差

バイアスについて説明している以下の文の空欄に入る適切な単語を選択肢から選んでください.

バイアスと分散(バリアンス)は(Q1 ___ )の関係にある.
よって過学習ぎみののモデルは(Q2 ___ ) が大きく、(Q3 ____ ) が小さい.

[Q1 選択肢]
1. 比例
2. 線形従属
3. 一次独立
4. トレードオフ

[Q2 選択肢]
1. バイアス
2. 分散

正則化とは

正則化について説明している以下の文の空欄に入る最も適切なものを選択肢からそれぞれ選んでください.

線形回帰モデルを正則化するためには、( Q1 ___ ) などの手法がある.

[選択肢]
1. より自由度の高いモデルを選択する
2. よりバイアスの低いモデルを選択する
3. 説明変数の数を増やす
4. コスト関数に正則化項を追加する

正則化とは

正則化について説明している以下の文の空欄に入る適切な単語を選択肢 1 ~ 3 からそれぞれ選んでください.

正則化とはモデルの (Q1____ ) を緩和するために、モデルの(Q2 ____ ) を下げることである.
例えば、多項式回帰モデルは (Q3 ____ ) ことで正則化できる.

[Q1の選択肢]
1. 過学習
2. 汎化
3. 過小適合

[Q2の選択肢]
1. 自由度
2. 精度
3. F 値

[Q3の選択肢]
1. 特徴量を増やす
2. 次元を減らす
3. 確率的勾配降下法を使う

ミニバッチ勾配降下法 – ミニバッチ

ミニバッチ勾配効果法の説明として正しくないものを選択肢 1 ~ 4 から選んでください.

1. 大きな訓練セットに対しても比較的早く計算が完了する.
2. scikit-learn にはミニバッチ勾配降下法のクラスがある.
3. 確率的勾配効果法よりも、最適な解に近づける.
4. アウトオブコアアルゴリズムとして実装できない.

ミニバッチ勾配降下法

バッチ勾配効果法の説明として正しいものを選択肢 1 ~ 4 から選んでください.

[選択肢]
1. イテレーションごとにランダムにサンプリングされたサンプルを用いて、偏微分によって勾配を計算するため解への収束スピードが早いが、
 解が 1 つに定まらない不規則性をもつ.しかし、モデルが局所的な最小値に収束してしまうのを避けることができる.
2. 無策にいくつかのインスタンスをサンプリングすることでミニバッチを用意し、そのミニバッチを用いて勾配を計算していく.
 収束スピードは早く、また、十分最適な解へ収束することができる.また、 GPU との相性も良い.
3. 全ての訓練インスタンスを用いて勾配を計算するため、安定して最適解に収束することができる.
 しかし、訓練セットが大きくなると収束までに非常に時間がかかる.
4. 最適な解に近くことはできるが、1 つに定まらない.しかし、訓練が進むにつれて徐々に学習率を小さくしていくことで、
 最適解にたどり着くことができる.

ミニバッチ勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、
ミニバッチ勾配降下法で X、y を学習し傾きと切片を求めてください.

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

X_b = np.c_[np.ones((100, 1)), X]

epochs = 50
minibatch_size = 20
m = len(X_b)

np.random.seed(0)
theta = np.random.randn(2,1)

t0, t1 = 200, 1000
def learning_schedule(t):
return t0 / (t + t1)

t = 0
for epoch in range(epochs):
shuffle = np.random.permutation(m)

# Q1:X_b、y の配列をランダムに並び替え、をそれぞれX_b_shuffled、y_shuffled に代入してください.
X_b_shuffled = X_b[##########]
y_shuffled = y[##########]
for i in range(0, m, minibatch_size):
t += 1
xi = X_b_shuffled[i:i+minibatch_size]
yi = y_shuffled[i:i+minibatch_size]

[Q1の選択肢]
1. epoch
2. shuffle
3. m

# Q2:勾配を求めてください.
gradients = ##########
eta = learning_schedule(t)
theta = theta – eta * gradients

print(theta)

[Q2の選択肢]
1. 2/shuffle * xi.T.dot(xi.dot(theta) – yi)
2. 2/minibatch_size * xi.T.dot(xi.dot(theta) – yi)
3. 2/epoch * xi.T.dot(xi.dot(theta) – yi)

ミニバッチ勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、
ミニバッチ勾配降下法で X、y を学習し傾きと切片を予測してください.

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

X_b = np.c_[np.ones((100, 1)), X]

epochs = 50
minibatch_size = 20
m = len(X_b)

np.random.seed(0)
theta = np.random.randn(2,1)

t0, t1 = 200, 1000
def learning_schedule(t):
return t0 / (t + t1)

t = 0
for epoch in range(epochs):
shuffle = np.random.permutation(m)

# Q1:X_b、y の配列をランダムに並び替え、をそれぞれX_b_shuffled、y_shuffled に代入してください.
X_b_shuffled = X_b[##########]
y_shuffled = y[##########]
for i in range(0, m, minibatch_size):
t += 1
xi = X_b_shuffled[i:i+minibatch_size]
yi = y_shuffled[i:i+minibatch_size]

[Q1の選択肢]
1. m
2. epoch
3. shuffle

# Q2:勾配を求めてください.
gradients = ##########
eta = learning_schedule(t)
theta = theta – eta * gradients

print(theta)

[Q2の選択肢]
1. 2/epoch * xi.T.dot(xi.dot(theta) – yi)
2. 2/shuffle * xi.T.dot(xi.dot(theta) – yi)
3. 2/minibatch_size * xi.T.dot(xi.dot(theta) – yi)

scikit-learn を用いた確率的勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、
scikit-learn を用いて、線形回帰モデルに確率的勾配降下法を適用して X、y を学習させ、傾きと切片を予測してください.
試行回数は 50 回とする.

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

# Q1:scikit-learn から確率的勾配降下法用のクラスをインポートしてください.
##########

[Q1の選択肢]
1. from sklearn.decomposition import SGDRegressor
2. from sklearn.linear_model import SGDRegressor
3. from sklearn.metrics import SGDRegressor

# Q2:Q1 でインポートしたクラスを用いて線形回帰モデルを定義してください.
sgd = ##########
sgd.fit(X, y.ravel())
print(sgd.intercept_, sgd.coef_)

[Q2の選択肢]
1. SGDRegressor(iterations =50, penalty=False, eta0=0.1)
2. SGDRegressor(iterations=50, penalty=None, l_rate=0.1)
3. SGDRegressor(max_iter=50, penalty=None, eta0=0.1)