Kerasの単純な線形回帰


11

この質問を見た後:Kerasを使用して線形回帰をエミュレートすることを試みて、私は勉強の目的で、そして私の直感を発展させるために、自分の例を転がそうとしました。

単純なデータセットをダウンロードし、1つの列を使用して別の列を予測しました。データは次のようになります。

テレビデータ

これで、単一の1ノードの線形レイヤーを持つ単純なケラスモデルを作成し、その上で勾配降下法を実行しました。

from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(1,))
preds = Dense(1,activation='linear')(inputs)

model = Model(inputs=inputs,outputs=preds)
sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd ,loss='mse',metrics=['mse'])
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

そのようなモデルを実行すると、nanすべてのエポックで損失が出ます。

jupyterノートブックへのリンク

だから私はものを試してみることに決めました、そして私が途方もなく小さい学習率を使用する場合に のみまともなモデルを得るsgd=keras.optimizers.SGD(lr=0.0000001)

テレビデータに適合

なぜこれが起こっているのですか?私が直面するすべての問題に対して、このように手動で学習率を調整する必要がありますか?ここで何か悪いことをしていますか?これは可能な限り簡単な問題だと思いますよね?

ありがとう!

回答:


11

これは、正規化が行われなかったためと考えられます。ニューラルネットワークは、正規化されていないデータに非常に敏感です。

いくつかの直観:(確率的勾配降下モデルのように)多次元のグローバル最小値を見つけようとしているとき、各反復で、各フィーチャは何らかの力(ベクトルの長さ)でその次元(ベクトル方向)に「引き込み」ます)。データが正規化されていない場合、列Aの値の小さなステップにより、列Bに大きな変化が生じる可能性があります。

コードは、非常に低い学習率を使用してこれに対処しました。これは、すべての列への影響を「正規化」しましたが、学習プロセスが遅延し、終了するまでにはるかに多くのエポックを必要としました。

次の正規化コードを追加します。

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
x = sc.fit_transform(x)
y = sc.fit_transform(y)

そして、単純に学習率パラメーター(lr)を削除します-自動的に自動値を選択させます。私は今あなたと同じ望ましいチャートを手に入れました:)


すっきりしているように見えますが、私が嫌いな唯一のことは、この標準化を入力をテストするために同様に適用する必要があることです。
フェリペアルメイダ2017年

2
そうです、@ Felipe Almeida、出力結果は「反転」されるべきですが、これは通常ライブラリに組み込まれています。見てみましょうinverse_transform scikit-learn.org/stable/modules/generated/...をし、他のいくつかの前処理方法はscikit-learn.org/stable/modules/preprocessing.html
モルク

2

複数の従属変数がある場合、正規化はより重要です。散布図を見ると、外れ値が見られます。隠れ層のないニューラルネットは、線形回帰モデルと同じです。したがって、それは残差の距離を最小化するために最適な線に適合します。外れ値を削除すると、より適切になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.