機械学習
この演習では、ロジスティック回帰を実装し、それを2つの異なるデータセットに適用します。 プログラミング演習を始める前に、ビデオ講義を見て、関連トピックのレビュー質問を完了することを強くお勧めします。
演習を開始するには、スターター・コードをダウンロードし、演習を行うディレクトリーにその内容を解凍する必要があります。
必要に応じて、この演習を開始する前にOctave/MATLABのcd
コマンドを使用して、このディレクトリーに移動してください。
また、コースウェブサイトの「環境設定手順」にOctave/MATLABをインストールするための手順も記載されています。
ex2.m
- 演習を実行するOctave/MATLABスクリプトex2_reg.m
- 演習の後半パートのOctave/MATLABスクリプトex2data1.txt
- 演習の前半のトレーニング・セットex2data2.txt
- 演習の後半のトレーニング・セットsubmit.m
- 解答をサーバーに送信するスクリプトmapFeature.m
- 多項式フィーチャーを生成する関数plotDecisionBoundary.m
- 分類器の決定境界をプロットする関数plotData.m
- 2D分類データをプロットする関数sigmoid.m
- シグモイド関数- [*]
costFunction.m
- ロジスティック回帰のコスト関数 - [*]
predict.m
- ロジスティック回帰の予測関数 - [*]
costFunctionReg.m
- 正則化されたロジスティック回帰のコスト
* はあなたが完了する必要があるものを示しています。
演習では、スクリプトex2.m
とex2_reg.m
を使用します。
これらのスクリプトは、問題に対するデータセットをセットアップし、あなたが実装する関数を呼び出します。
こららのスクリプトを変更する必要はありません。
この課題の指示に従って、他のファイルの関数を変更することだけが求められています。
このコースの演習では、数値計算に適した高度なプログラミング言語であるOctave(※1)またはMATLABを使用します。 OctaveまたはMATLABがインストールされていない場合は、コースWebサイトのEnvironment Setup Instructionsのインストール手順を参照してください。
Octave/MATLABコマンドラインでは、help
の後に関数名を入力すると、組み込み関数のドキュメントが表示されます。
たとえば、help plot
はプロットのヘルプ情報を表示します。
Octave関数の詳細なドキュメントは、Octaveのドキュメントページにあります。
MATLABのドキュメントは、MATLABのドキュメントページにあります。
また、オンライン・ディスカッションを使用して、他の学生との演習について話し合うことを強く推奨します。 しかし、他人が書いたソースコードを見たり、他の人とソースコードを共有したりしないでください。
※1:Octaveは、MATLABの無料の代替ソフトウェアです。 プログラミング演習は、OctaveとMATLABのどちらでも使用できます。
この演習では、学生が大学に入学するかどうかを予測するロジスティック回帰モデルを作成します。
あなたは大学の部局の管理者であり、2つの試験の結果に基づいて各申請者の入学の可能性を判断したいとします。 以前の応募者の履歴データがあり、ロジスティック回帰のトレーニング・セットとして使用できます。 トレーニング・サンプルごとに、2つの試験の受験者の得点と入学の決定があります。
あなたがすべきことは、これらの2つの試験の得点に基づいて、申請者の入学確率を見積もる分類モデルを構築することです。
この概要とex2.m
のフレームワーク・コードが、演習をガイドします。
学習アルゴリズムの実装を開始する前に、可能であればデータを可視化することは常に有益です。
ex2.m
の最初のパートのコードは、データをロードし、関数plotData
を呼び出すことにより2次元プロット上にそれを表示します。
plotData
のコードを完成させると、図1のような図が表示されます。
ここで、軸は2つの試験のスコアで、正と負のサンプルは異なるマーカーで示されています。
図1:トレーニング・データの散布図
作図にもっと慣れ親しむため、plotData.m
を空のままにしているので、それを実装してみましょう。
ただし、これはオプション(非評価)の演習です。
我々は、あなたがそれをコピーしたり参照したりできるように、以下の実装も提供します。
サンプルをコピーする場合は、Octave/MATLABのドキュメントを参照して、それぞれのコマンドが何をしているのかを確認してください。
% 正と負のサンプルのインデックスを見つける
pos = find(y==1); neg = find(y == 0);
% サンプルをプロットする
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, ...
'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', ...
'MarkerSize', 7);
実際のコスト関数から始める前に、ロジスティック回帰の仮説が、以下のように定義されていることを思い出してください。
ここで関数はシグモイド関数です。 シグモイド関数は次のように定義されます。
あなたがすべき最初のステップは、この関数をsigmoid.m
に実装して残りのプログラムから呼び出せるようにすることです。
終了したら、Octave/MATLABのコマンドラインでsigmoid(x)
を呼び出して、いくつかの値をテストしてみてください。
x
が大きな正値の場合、シグモイドは1
に近く、(絶対値が)大きな負値の場合、シグモイドは0
に近くなければなりません。
sigmoid(0)
を評価すると正確に0.5
になります。
コードはベクトルでも行列でも動作するはずです。
行列の場合、関数はすべての要素に対してシグモイド関数を実行する必要があります。
Octave/MATLABコマンドラインでsubmit
と入力すると、評価のために解答を提出できます。
送信スクリプトは、ログイン用の電子メールと送信トークンを要求し、送信するファイルを尋ねます。
Webページから課題のための提出トークンを取得することができます。
ここで解答を提出する必要があります。
ロジスティック回帰のコスト関数と勾配を実装します。
costFunction.m
のコードを完成させて、コストと勾配を返します。
ロジスティック回帰におけるコスト関数は
です。コストの勾配はと同じ長さのベクトルであり、番目の要素(について)は以下のように定義されます。
この勾配は線形回帰の勾配と同じに見えますが、線形回帰とロジスティック回帰ではの定義が異なるため、実際には数式が異なることに注意してください。
終了すると、ex2.m
はの初期パラメーターを使用してcostFunction
を呼び出します。
コストは約0.693
です。
ここで解答を提出する必要があります。
前の課題では、最急降下法を実装することによって、線形回帰モデルの最適なパラメーターを見つけました。
あなたはコスト関数を書いてその勾配を計算し、それに応じて最急降下法の手順を実施しました。
今回は、最急降下法の手順を実施する代わりに、fminunc
というOctave/MATLABのビルトイン関数を使用します。
Octave/MATLABのfminunc
は、制約のない関数の(※2)の最小値を求める最適化ソルバーです。
ロジスティック回帰の場合、コスト関数をパラメーターで最適化する必要があります。
具体的には、(X
の値とy
の値の)固定データセットが与えられた場合、fminunc
を使用してロジスティック回帰のコスト関数の最適なパラメーターを求めます。
次の入力をfminunc
に渡します:
ex2.m
には、正しい引数を指定してfminunc
を呼び出すコードがすでに作成されています。
※2:最適化における制約には、パラメーターの制約が多いです。 たとえば、が取ることができる値(たとえば、)を限定する制約などです。 ロジスティック回帰では、が任意の実数値をとることが許されているため、このような制約がありません。
% fminuncのオプションを設定する
options = optimset('GradObj', 'on', 'MaxIter', 400);
% fminuncを実行して最適なthetaを取得する
% この関数はthetaとcostを返します
[theta, cost] = ...
fminunc(@(t)(costFunction(t, X, y)), initial theta, options);
このコードスニペットでは、最初にfminunc
で使用するオプションを定義しました。
具体的には、GradObj
オプションをon
に設定します。
これは、関数がコストと勾配の両方を返すことをfminunc
に通知します。
これにより、関数を最小化するときにfminunc
が勾配を使用できるようになります。
さらに、MaxIter
オプションを400
に設定すると、fminunc
は終了すまでに最大で400ステップを実行します。
最小化する実際の関数を指定するために、@(t) ( costFunction(t, X, y) )
で関数を指定する「short-hand」を使用します。
これは、引数t
でcostFunction
を呼び出す関数を作成します。
これにより、fminunc
で使用するcostFunction
をラップすることができます。
costFunction
を正しく完成させると、fminunc
は正しい最適化パラメーターに収束し、コストとの最終値を返します。
fminunc
を使用することで、ループを自分で書く必要はなく、最急降下法のように学習率を設定することもできます。
これはすべてfminunc
によって行われるので、あなたがすべきことはコストと勾配を計算する関数を用意するだけです。
fminunc
が完了すると、ex2.m
はの最適パラメーターを使用して、関数costFunction
を呼び出します。
コストは約0.203
です。
この最終的なの値は、トレーニング・データの決定境界をプロットするために使用され、図2と同様の図になります。
plotDecisionBoundary.m
のコードを見て、値を使って境界線をプロットする方法を調べることもお勧めします。
パラメーターを学習した後、モデルを使用して、特定の生徒が入学するかどうかを予測できます。 試験1の得点が45点、試験2の得点が85点の学生は、入学確率が0.776になると予想されます。 見つけたパラメーターの品質を評価する別の方法は、学習モデルがトレーニング・セットでどのくらいうまく予測されるかを確認することです。
図2:決定境界を持つトレーニング・データ
このパートでは、predict.m
のコードを完成させます。
予測関数は、データセットおよび学習されたパラメーター・ベクトルが与えられると、予測値1
または0
を生成します。
predict.m
でコードを完成させたら、ex2.m
スクリプトは、正しいサンプルのパーセンテージを計算することによって、分類器のトレーニング精度を報告します。
ここで解答を提出する必要があります。
この演習では、製造工場のマイクロチップが品質保証(QA)に合格しているかどうかを予測するために、正則化されたロジスティック回帰を実装します。 QA中は、各マイクロチップが正しく機能していることを確認するために、さまざまなテストを行います。
あなたは工場の製品マネージャーであり、2つの異なるテストによるいくつかのマイクロチップのテスト結果を持っているとします。 この2つのテストから、マイクロチップを受け入れるか拒否するかを決定したいと考えています。 決定を手助けするために、過去のマイクロチップに関するテスト結果のデータセットがあり、ロジスティック回帰モデルを構築することができます。
演習のこのパートを完了するには、別のスクリプトex2_reg.m
を使用します。
この演習の前半と同様に、plotData
は図3のような図を生成するために使用されます。
ここで、軸は2つのテストスコアであり、正(、受け入れ)と負(、拒否)のサンプルは 異なるマーカーで示されています。
図3:トレーニング・データのプロット
図3は、プロットを通る直線で、データセットを正負のサンプルに分けることができないことを示しています。 したがって、ロジスティック回帰が線形の決定境界を見つけることしかできないため、ロジスティック回帰の直接的な応用はこのデータセットではうまく機能しません。
データをよりよくフィットさせる方法の1つは、各データ点からより多くのフィーチャーを作成することです。
提供された関数mapFeature.m
で、フィーチャーをとの6乗までのすべての多項式項にマップします。
このマッピングの結果、2つのフィーチャーのベクトル(2つのQAテストのスコア)が28次元のベクトルに変換されました。 このより高次元のフィーチャー・ベクトルでトレーニングされたロジスティック回帰分類器は、より複雑な決定境界を持ち、2次元プロットで描画されるときに非線形に見えます。 フィーチャー・マッピングを使用すると、より表現力豊かな分類器を作成できますが、オーバーフィットの影響を受けやすくなります。 演習の次の段階では、データに合わせて正則化されたロジスティック回帰を実装します。 また、正則化がどのようにオーバーフィットの問題に対処するのかを自分で確認します。
今度は、正則化したロジスティック回帰のコスト関数と勾配を計算するコードを実装します。
costFunctionReg.m
のコードを完成させて、コストと勾配を返します。
ロジスティック回帰における正則化されたコスト関数は、
です。パラメーターを正則化しないでください。
Octave/MATLABでは、索引付けが1から始まることを思い出してください。
したがって、コード内のtheta(1)
パラメーター(に対応)を正則化すべきではありません。
コスト関数の勾配は、番目の要素が以下のように定義されるベクトルです。
完了したら、ex2_reg.m
はの初期値(すべてゼロに初期化されている)を使ってcostFunctionReg
関数を呼び出します。
コストは約0.693
です。
ここで解答を提出する必要があります。
前半と同様に、最適なパラメーターを知るためにfminunc
を使用します。
正則化されたロジスティック回帰(costFunctionReg.m
)のコストと勾配を正しく完成していれば、ex2_reg.m
の次の部分を実行して、fminunc
を使いパラメーターを知ることができます。
この分類器によって学習されたモデルを可視化するのを助けるために、正のサンプルと負のサンプルを分ける(非線形)決定境界をプロットする関数plotDecisionBoundary.m
を提供しました。
plotDecisionBoundary.m
では、分類器の予測を均等な間隔のグリッドに配置して非線形決定境界をプロットし、次に予測がからに変化する等高線プロットを描きます。
パラメーターを学習した後、ex2_reg.m
の次のステップは、図4と同様の決定境界をプロットします。
演習のこのパートでは、正則化がオーバーフィッティングを防止する方法を理解するために、データセットのさまざまな正則化パラメーターを試すことになります。
を変えると、決定境界の変化に注目してください。 小さなでは、分類器がほぼすべてのトレーニング・サンプルを正しいものにしますが、非常に複雑な境界を描き、データにオーバーフィットすることが分かります(図5)。 これは良い決定境界ではありません。たとえば、の点が受け入れられる()と予測します。 これは、トレーニング・セットに対して誤った決定と思われます。
が大きいほど、より単純な決定境界を示すプロットが表示され、正と負がかなり良好に分離されます。 しかし、に大きぎる値を設定すると、決定境界がデータにあまり追随しないため、適切なフィットを得ることができません。したがって、データにアンダーフィッティングします(図6)。
これらのオプション(非評価)の演習問題の解答を提出する必要はありません。
この課題が完了したら、送信機能を使用して解答を我々のサーバーに送信してください。 以下は、この演習の各パートの得点の内訳です。
パート | 提出するファイル | 点数 |
---|---|---|
シグモイド関数 | sigmoid.m |
5 点 |
ロジスティック回帰のコストの計算 | costFunction.m |
30 点 |
ロジスティック回帰の勾配 | costFunction.m |
30 点 |
予測機能 | predict.m |
5 点 |
正則化されたロジスティック回帰のコストの計算 | costFunctionReg.m |
15 点 |
正則化されたロジスティック回帰の勾配 | costFunctionReg.m |
15 点 |
合計点 | 100 点 |
解答を複数回提出することは許可されており、最高のスコアのみを考慮に入れます。