無料の Python 機械学習コース 7: アルゴリズムのパフォーマンスが低い場合の対処方法

無料の Python 機械学習コース 7: アルゴリズムのパフォーマンスが低い場合の対処方法

私たちは機械学習アルゴリズムの開発に多くの時間を費やしました。しかし、導入後にアルゴリズムのパフォーマンスが悪ければイライラするでしょう。問題は、アルゴリズムが期待どおりに機能しない場合に次に何をすべきかということです。何が悪かったのでしょうか? トレーニング データの量は十分でしたか? 適切な機能を使用しましたか? さらにデータを収集し続ける必要がありますか? 可能ですが、非常に時間と費用がかかります。さらに機能を追加すべきでしょうか? それも高価になる可能性があります。

[[360276]]

どの方向へ行けばいいでしょうか?

機械学習アルゴリズムが適切に動作しない場合は、次に何をすべきでしょうか? いくつかの選択肢があります。

  • より多くのトレーニングデータを取得するには時間がかかります。さらなる研究データが利用可能になるまでには数か月かかる可能性もあります。
  • より多くのトレーニング機能を利用できます。かなり時間がかかる可能性もあります。しかし、いくつかの多項式機能を追加すれば機能するようになると思います。
  • より小さなトレーニング機能セットを選択します。
  • 正規化項を追加
  • 正規化項を減らします。

では、次に試すべきものはどれでしょうか? 何でもすぐに試し始めるのは得策ではありません。無駄なことに時間をかけすぎてしまう可能性があるからです。まず問題を特定し、適切な措置を講じる必要があります。学習曲線により問題を簡単に検出できるようになり、多くの時間を節約できます。

学習曲線は、アルゴリズムのパフォーマンスを向上させる方法を決定するのに非常に役立ちます。これは、アルゴリズムがバイアスやアンダーフィッティング、分散やオーバーフィッティング、あるいはその両方に悩まされているかどうかを判断するのに役立ちます。

学習曲線の仕組み

学習曲線はコスト関数のグラフです。同じ図では、トレーニング データのコスト関数とクロス検証データのコスト関数が、アルゴリズムに関する重要な洞察を提供します。念のため、コスト関数の式は次のとおりです。

つまり、予測出力から元の出力の二乗を引いた値を、トレーニング データの量の 2 倍で割った値になります。学習曲線をプロットするには、これらのコスト関数をトレーニング データ数 (m) の関数としてプロットする必要があります。すべてのトレーニング データを使用するのではなく、トレーニング データの小さなサブセットのみを使用してデータをトレーニングします。

次の画像を見てください。


トレーニング データに使用するデータが少なすぎると、アルゴリズムはトレーニング データにぴったり適合し、コスト関数は 0 を返します。

上の図では、データをトレーニングするために 1 つ、2 つ、または 3 つのデータ アルゴリズムのみを使用すると、非常に少ないデータで非常によく学習でき、トレーニング コストがゼロまたはゼロに近いことが明確に示されています。ただし、このタイプのアルゴリズムは他のデータではうまく機能しません。

このアルゴリズムにクロス検証データを適合させようとすると、クロス検証データのパフォーマンスが低下する可能性が高くなります。したがって、クロス検証データのコスト関数は非常に高い値を返します。

一方、アルゴリズムをトレーニングするためにさらに多くのデータが必要になると、トレーニング データに完全には適合しなくなります。そのため、研修コストが高くなります。

同時に、アルゴリズムは大量のデータでトレーニングされるため、クロス検証データのパフォーマンスが向上し、クロス検証データのコスト関数はより低い値を返します。これが学習曲線を構築する方法です。

学習アルゴリズムの開発

学習曲線をプロットする方法を段階的に説明します。学習曲線をプロットするには、まず機械学習アルゴリズムが必要です。簡単にするために、線形回帰アルゴリズムを使用します。まず、線形回帰アルゴリズムを開発します。

まず、パッケージとデータセットをインポートします。ここで使用するデータセットは、Andrew Ng の Coursera 機械学習コースから取得したものです。このデータセットでは、X 値と y 値が Excel ファイル内の別々のワークシートに整理されています。

繰り返しになりますが、X は機械学習アルゴリズムの開発とトレーニングに使用する機能です。 y は予測する必要がある出力特徴です。

クロス検証データの X 値と y 値も、同じ Excel ファイル内の他の 2 つのワークシートに整理されています。この記事の最後にデータセットへのリンクを記載します。データセットを自由にダウンロードして練習してください。

  1. %matplotlib インライン
  2. pandasをpdとしてインポートする
  3. numpyをnpとしてインポートする
  4. matplotlib.pyplot を plt としてインポートします。
  5. ファイル= pd .ExcelFile('dataset.xlsx')
  6. df = pd .read_excel(ファイル、'Xval'、ヘッダー=なし)
  7. df.head()

同様に、トレーニング セットの y 値をインポートします。

  1. y = pd .read_excel(ファイル、'yval'、ヘッダー=なし)
  2. y.head()

線形回帰アルゴリズムを簡単に開発してみましょう。

(1)定義仮説

線形回帰では、学校で学んだ非常に基本的な線形方程式を使用して予測を行います。式は次のとおりです。

Y = C + BX

機械学習では、異なる用語を使用します。


ここで、「h」は仮説または予測値、theta0 と theta1 は係数、X は入力特徴です。

ここでは、X がすでにあります。 「h」を計算し、それが y の値と一致することを期待する必要があります。なぜなら、私たちの目標は y の値を予測できるようにすることです。

最初は Theta0 と theta1 がランダムに初期化されます。反復を通じて theta0 と theta1 の値を改良し続けます。

各反復では、コスト関数と勾配式を使用してコストを計算し、シータ値を更新します。

(2)コスト関数と勾配降下法

コスト関数は、予測値が元の出力機能とどの程度異なるかを示します。ここで、出力特徴は y であり、予測出力は「h」です。したがって、コスト関数は「h」が「y」からどれだけ逸脱しているかを示します。コスト関数の値をできるだけ低くしたいのです。

コスト関数の式は次のとおりです。


コスト関数が最小化されるまでアルゴリズムを排除し続けます。各反復において、勾配降下法を使用してシータ値を更新します。

シータ値を更新するには、前のシータ値から勾配降下法を減算します。コード化するとより明確になります。


ここで、m はトレーニング データの数、alpha は学習率です。

(3)線形回帰アルゴリズムの開発

上記の式を使用して仮説とコスト関数を開発します。

  1. m =長さ(自由度)
  2. def hypothesis(theta, X):
  3. theta[0] + theta[1]*Xを返す
  4. def cost_calc(theta, X, y):
  5. (1/2*m) * np.sum((hypothesis(theta, X) - y)**2) を返します。

ここで、パラメーター theta0 と theta1 を最適化するために勾配降下法を定義します。各反復で、シータ値を更新し、コスト関数とシータ値を追跡します。

最後に、各反復のシータ値のコストのリストを返します。コードは非常にシンプルです。こちらをご確認ください。

  1. 定義gradient_descent(theta, X, y, エポック, アルファ):
  2. コスト= []
  3. シータヒスト= []
  4. = 0  
  5. 私は<  エポック:  
  6. hx =仮説(theta, X)
  7. シータ[0] - =アルファ*(合計(hx-y)/m)
  8. シータ[1] - = (アルファ * np.sum((hx - y) * X))/m
  9. コスト.append(cost_calc(theta, X, y))
  10. 私 += 1
  11. リターンシータ、コスト

線形回帰アルゴリズムを完了しました。出力を予測する方法が必要です。予測メソッドでは、勾配降下関数と仮説関数からの最終的なシータを使用して予測を行います。

  1. def predict(theta, X, y, エポック, アルファ):
  2. シータ、コスト=勾配降下法(シータ、X、y、エポック、アルファ)
  3. 仮説(theta, X)、コスト、thetaを返す

ここで、パラメータをゼロに初期化し、predict 関数を使用して出力変数を予測します。

  1. シータ= [0,0]
  2. y_predict、コスト、 theta = predict (theta、df[0]、y[0]、1400、0.001)

ここで、df または X の予測出力 (h) と元の出力 (y) を同じグラフにプロットします。

  1. plt.figure()
  2. plt.scatter(df, y)
  3. plt.scatter(df, y_predict)

アルゴリズムはうまく機能しているようです。予測出力ラインは中央の位置から始まります。

学習曲線を構築する時が来ました!!!

学習曲線を描く

これで、学習曲線を描くことができます。まず、クロス検証データセットの X 値と y 値をインポートしましょう。前述したように、これらは別々の Excel ワークシートに整理されます。

  1. ファイル= pd .ExcelFile('dataset.xlsx')
  2. cross_val = pd .read_excel(ファイル、'X'、ヘッダー=なし)
  3. クロス_val.head()

  1. cross_y = pd .read_excel(ファイル、'y'、ヘッダー=なし)
  2. クロス_y.head()

これを実現するには、gradient_descent 関数を少し変更します。

前の gradient_descent 関数では、各反復のコストを計算しました。これは、従来の機械学習アルゴリズム開発における良い方法であるため行います。

しかし、学習曲線の場合、各反復のコストは必要ありません。したがって、実行時間を節約するために、各エポックでのコスト関数の計算を除外します。更新されたパラメータのみを返します。

  1. 定義grad_descent(theta, X, y, エポック, アルファ):
  2. = 0  
  3. 私は<  エポック:  
  4. hx =仮説(theta, X)
  5. シータ[0] - =アルファ*(合計(hx-y)/m)
  6. シータ[1] - = (アルファ * np.sum((hx - y) * X))/m
  7. 私 += 1
  8. シータを返す

前述したように、学習曲線を開発するには、トレーニング データのさまざまなサブセットを使用して学習アルゴリズムをトレーニングする必要があります。

トレーニング データセットには 21 個のデータ ポイントがあります。最初は 1 つのデータのみを使用してアルゴリズムをトレーニングし、次に 2 つのデータ、さらに 3 つのデータと、合計 21 のデータを使用してアルゴリズムをトレーニングします。

したがって、トレーニング データの 21 個のサブセットでアルゴリズムを 21 回トレーニングします。また、トレーニング データの各サブセットのコスト関数も追跡します。コードを詳しく見てみると、より明確になります。

  1. j_tr = []
  2. シータリスト= []
  3. iが範囲(0, len(df))内にある場合:
  4. シータ= [0,0]
  5. theta_list.append(grad_descent(theta, df[0][:i], y[0][:i], 1400, 0.001))
  6. j_tr.append(cost_calc(theta, df[0][:i], y[0][:i]))
  7. シータリスト

トレーニング データの各サブセットのトレーニング パラメーターは次のとおりです。


トレーニング サブセットあたりのコストは次のとおりです。


各サブセットのコストを確認します。トレーニング データが 1 または 2 のみの場合、コストはゼロまたはほぼゼロになります。トレーニング データを追加し続けると、コストは上昇しますが、これは予想どおりです。

ここで、上記のパラメータをトレーニング データのすべてのサブセットに使用して、クロス検証データのコストを計算します。

  1. j_val = []
  2. theta_list 内の i について:
  3. j_val.append(cost_calc(i, cross_val[0], cross_y[0]))
  4. j_val

最初は、トレーニング パラメータが少なすぎるトレーニング データから取得されるため、コストが非常に高くなります。しかし、パラメータが増加し、トレーニング データが改善されるにつれて、クロス検証エラーは減少し続けます。

トレーニング エラーとクロス バリデーション エラーを同じ図にプロットしてみましょう。

  1. %matplotlib インライン
  2. matplotlib.pyplot を plt としてインポートします。
  3. plt.figure()
  4. plt.scatter(範囲(0, 21), j_tr)
  5. plt.scatter(範囲(0, 21), j_val)

これが私たちの学習曲線です。

学習曲線から意思決定を行う

上記の学習曲線は良好に見えます。予想通りの流れになります。最初は、トレーニング エラーが小さすぎ、検証エラーが大きすぎます。

ゆっくりと、それらは完全に重なり合います。それは完璧です!しかし、現実の世界では、これはあまり起こりません。

ほとんどの機械学習アルゴリズムは、最初は完璧に機能しません。ほとんどの場合、解決する必要がある何らかの問題に悩まされています。ここで、いくつかの問題について議論します。

学習曲線は次のようになると考えられます。


トレーニング エラーと検証エラーの間に大きな差がある場合は、分散が大きい問題があることを示します。これは過剰適合問題とも呼ばれます。

より多くのトレーニング データを取得するか、より小さな機能セットを選択するか、またはその両方を行うことで、この問題を解決できる可能性があります。


歪んだ曲線がこのように見える場合、最初はトレーニング エラーが小さすぎ、検証エラーが大きすぎることを意味します。徐々に、トレーニング エラーは大きくなり、検証エラーは小さくなります。しかし、ある意味では、それらは平行になります。図からわかるように、トレーニング データを増やしても、クロス検証エラーは減少しなくなります。

この場合、より多くのトレーニング データを取得しても、機械学習アルゴリズムは改善されません。

これは、学習アルゴリズムが高バイアス問題を抱えていることを示しています。この場合、トレーニング機能を増やすと役立つ可能性があります。

学習アルゴリズムの修正

線形回帰を実行しているとします。しかし、アルゴリズムは正しく機能しません。

何をするか?

まず、ここで示すように、学習曲線を描きます。

  • 大きな差異が検出された場合は、重要度に基づいてより小さな特徴セットを選択します。これが役に立つなら、時間を節約できるかもしれません。そうでない場合は、さらにトレーニング データを取得してみてください。
  • 学習曲線から大きく逸脱した問題を特定した場合、追加の能力を獲得することが解決策となることはすでにわかっています。多項式機能をいくつか追加してみることもできます。多くの時間があれば、多くの時間を節約できます。
  • 正規化項ラムダを使用してアルゴリズムを実装している場合、アルゴリズムに高いバイアスが発生している場合はラムダを下げてみて、アルゴリズムに高い分散の問題が発生している場合はラムダを上げてみてください。

ニューラル ネットワークの場合も、このバイアスまたは分散の問題に直面する可能性があります。

バイアスが高い問題やアンダーフィッティングの問題の場合は、ニューロンの数または隠れ層の数を増やす必要があります。高い分散や過剰適合の問題を解決するには、ニューロンの数または隠れ層の数を減らす必要があります。異なる数のニューロンを使用して学習曲線をプロットすることもできます。

この記事を読んでいただき誠にありがとうございます。これがお役に立てば幸いです。

<<:  無料の Python 機械学習コース 8: 精度と再現率

>>:  2021 年の優れた 5 つの人工知能フレームワーク

ブログ    
ブログ    

推薦する

エッジにおける AI について知っておくべきことすべて

近年、人工知能の応用は世界中で大きな進歩を遂げています。職場でのビジネス活動の拡大に伴い、クラウド ...

WeChatグループに広告を投稿する人が常にいるのでしょうか? Pythonを使って自動ロボットを作成し、彼を排除する

[[341536]] WeChatグループ乾癬とは、WeChatグループ内の他のユーザーに恥ずかしげ...

放射線科学における LLM の潜在的な応用は何ですか?数十の研究機関が共同で31の大型モデルをテスト

近年、大規模言語モデル (LLM) は自然言語処理 (NLP) の分野で革新の波を起こしています。大...

顔認識の国家基準に関する意見募集:顔のスキャンや嗜好予測の義務化はなし

近年、顔認証が話題になっていますが、現実には、通知なく顔認証データを取得したり、強制的に顔認証させら...

Natureサブジャーナル:ニューロモルフィックコンピューティングがさらに進歩し、科学者はニューロンとシナプスの人工シミュレーションを実現した

ニューロモルフィック コンピューティングは、人間の脳を構成するニューロンとシナプスのメカニズムを模倣...

...

Googleの創設者が個人的にGeminiのコードを書いたが、これは非常に核心的なものだ

純資産が1,050 億ドルあるにもかかわらず、彼は今でも毎日自分でコードを書いています。 ?彼の名前...

GPTモデルが人間のように聞こえるのはそのためです

翻訳者 | 劉涛レビュー | Chonglou AIがなぜ機能するのか誰も知らないですよね?はい、そ...

...

落とし穴を避けよう!ニューラルネットワークの欠点と短所を数え上げよう

最近、ディープラーニングが大々的に宣伝されており、人々はニューラル ネットワークをあらゆる場所で使用...

...

GPT-4 には意識がありません!しかし、チューリング賞受賞者のベンジオ氏らの88ページの論文は、「スカイネット」が遅かれ早かれやってくることを示唆している。

今日まで人工知能は発展してきましたが、人工知能は意識を持っているのでしょうか?チューリング賞受賞者の...

すべての携帯電話にAIが搭載されているのに、なぜそれを軽蔑するのですか?

携帯電話の発表会を見れば、AI機能の追加が目に入ります。しかし、多くのユーザーはこれをやや否定的に捉...

スマート農業は収穫アシスタントとなる新しいアップグレードロボットを歓迎する

「農業」は国家の基盤です。基盤がしっかりしていれば国家は平和になります。農業は国民経済の建設と発展を...

IoTセキュリティ戦略における機械学習の重要性

機械学習は、自動化と異常な動作の検出を通じて、よりスケーラブルかつ効率的に IoT デバイスを保護す...