機械学習とニューラルネットワーク - ページ 68

 

4.5 NumPy の高度なインデックス作成 -- メモリのビューとコピー (L04: Python での科学的コンピューティング)



4.5 NumPy の高度なインデックス作成 -- メモリのビューとコピー (L04: Python での科学的コンピューティング)

この 5 番目のビデオでは、インデックス作成のトピックをもう一度掘り下げます。ただし、基本的なインデックス作成について説明した最初のビデオとは異なり、ここでは高度なインデックス作成について説明します。このセグメントでは、メモリ ビューやメモリ コピーの作成などの概念を紹介します。これらは、配列値を誤って上書きするなど、意図しないミスを避けるために重要な実践方法です。これを理解することは、NumPy のバグや予期しない動作を防ぐのに役立つため、非常に重要です。

さあ、始めましょう。前のセクションでは、「ビュー」と呼ばれる NumPy 配列の 1 つの側面について説明しました。ビューは、通常のインデックス作成または基本的なスライス操作を使用するときに作成されます。これらのビューは暗黙の次元として機能し、線形代数の厳密な数学的枠組み内では実行不可能な演算を実行できるようにします。ただし、ビューの操作には、気付かないうちに元の配列を誤って変更してしまう可能性があるため、危険が伴います。

これを説明するために、簡単な例を考えてみましょう。 2 行 3 列の 2 次元配列があるとします。便宜上、最初の行を「first_row」という別の変数に割り当てます。ここで重要な点があります。最初の行を変数に割り当てると、新しいオブジェクトではなくビューが作成されます。これは、この変数がメモリ内の元の配列の位置を指すだけであることを意味します。したがって、この変数の値を変更すると、元の配列の対応する値も変更されます。

これを実証するために、「first_row」変数の各要素を 99 ずつ増やしてみましょう。この操作を実行すると、変数の値が変更されるだけでなく、元の配列の最初の行の値も上書きされます。この動作は、独立したオブジェクトではなくビューを操作していることを示すヒントとして機能します。ビューを操作しているときに、元の配列の値を意図せず上書きしてしまう可能性があるため、これを意識しないと危険です。

一方、ビューは不必要な配列のコピーを避けることができるため、メモリ効率の向上に非常に役立ちます。ただし、配列のコピーを明示的に作成したい場合もあります。この目的のために、元の配列と同じ値を持つ新しい配列を生成する「コピー」関数を使用できます。この例では、「copy」関数を使用して配列の 2 行目のコピーを作成します。こうすることで、「first_row」変数に加えられた変更は元の配列に影響を与えなくなります。

スライスと整数ベースのインデックス作成ではメモリ ビューが作成されますが、配列のコピーを作成する「ファンシー インデックス作成」と呼ばれる別の種類のインデックス作成があることに注意することが重要です。派手なインデックス付けとは、複数の整数インデックスを使用して配列から特定の要素を選択することを指します。この機能は通常の Python リストではサポートされていないため、「ファンシー」と呼ばれます。ただし、NumPy を使用すると、この種のインデックス作成を実行できるため、非常に強力になります。

たとえば、通常の Python リストでは、最初と 3 番目の要素を同時に取得することはできません。しかし、NumPy では、派手なインデックス作成を使用してこれを実現できます。同様に、派手なインデックスを使用して、2 次元配列から特定の列を選択できます。派手なインデックスを作成すると、常にビューではなく配列のコピーが作成されることに注意してください。

ビューとコピーの区別は、NumPy における効率の考慮事項に関連しています。スライスにより、特定の値をメモリにキャッシュし、パフォーマンスを最適化できます。ただし、連続したメモリ チャンクを抽出できないため、派手なインデックスを使用してこのキャッシュ メカニズムを実装するのは簡単ではありません。代わりに、個々の値を選択して、新しい配列を作成します。この動作は、派手なインデックス作成によってビューではなくコピーが生成される理由を説明しています。

派手なインデックス付けのもう 1 つの興味深い側面は、配列内の列の順序を並べ替えることができることです。派手なインデックスを使用して目的の列インデックスを指定すると、必要に応じて列をシャッフルできます。

NumPy のブール マスクは、特定の条件に基づいて配列をフィルター処理する効率的かつ強力な方法です。ブール マスクは、元の配列と同じ形状を持つブール値 (True または False) の単純な NumPy 配列です。元の配列にブール マスクを適用すると、指定された条件を満たす要素を選択し、残りを破棄できます。

ブール マスクを作成するには、まず配列内の各要素のブール値を返す条件を定義します。たとえば、arr という配列があるとします。

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
3 より大きい要素のみを選択するなど、条件に基づいてブール マスクを作成できます。
mask = arr > 3
結果のブール マスク、マスクは [False、False、False、True、True] になります。マスク内の各要素は元の配列内の同じ位置に対応し、その要素の条件が true か false かを示します。

ブール マスクを適用して条件を満たす要素を取得するには、マスクを配列のインデックスとして使用するだけです。

filtered_arr = arr[mask]
結果の filtered_arr は [4, 5] となり、元の配列の 3 より大きい要素のみが含まれます。

ブールマスクは、& (and)、| などの論理演算子を使用して組み合わせることができます。 (or) と ~ (not) を使用して、より複雑な条件を作成します。例えば:

mask = (arr > 2) & (arr < 5)
filtered_arr = arr[mask]
この条件では、2 より大きく 5 より小さい要素が選択され、filtered_arr は [3, 4] になります。

ブール マスクは、大規模なデータセットを操作する場合、またはデータのフィルタリングと分析を実行する場合に特に役立ちます。これらにより、明示的なループや条件チェックを必要とせずに、配列に対する効率的かつ簡潔な操作が可能になります。

配列のフィルタリングに加えて、ブール マスクは要素の割り当てにも使用できます。ブールマスクを介して選択した要素に新しい値を割り当てることで、条件に基づいて配列の特定の部分を変更できます。

全体として、ブール マスクは、指定された条件に基づいて NumPy 配列を操作およびフィルタリングするための柔軟かつ効率的な方法を提供し、データ処理と分析における貴重なツールになります。

4.5 NumPy Advanced Indexing -- Memory Views and Copies (L04: Scientific Computing in Python)
4.5 NumPy Advanced Indexing -- Memory Views and Copies (L04: Scientific Computing in Python)
  • 2020.09.20
  • www.youtube.com
We previously covered basic indexing. NumPy allows us to perform more advanced indexing beyond what regular Python lists are capable of. Jupyter notebook: ht...
 

4.6 NumPy 乱数ジェネレータ (L04: Python による科学計算)



4.6 NumPy 乱数ジェネレータ (L04: Python による科学計算)

このビデオでは、NumPy の乱数ジェネレーターの概要を説明します。 NumPy で乱数を生成するためのさまざまな方法をすべて取り上げるわけではありませんが、乱数ジェネレーターとその実用性を理解することに重点を置きます。

簡単な例から始めましょう。まず、乱数の生成に使用するライブラリである NumPy をインポートします。 NumPy には、乱数を描画するためのさまざまな関数を含む Random モジュールがあります。私たちが参照するドキュメントは少し古いものですが、さまざまな関数とその説明の役立つリストが提供されています。

よく使用される関数の 1 つは、一様分布からランダムなサンプルを生成するrandom.randです。目的の配列の形状 (2x3 など) を指定することにより、この関数は一様分布からの乱数で満たされた 2 次元配列を生成します。

NumPy は、半開区間 [0, 1) でランダムな浮動小数点を生成するrandom.random など、他の関数も提供します。また、random.randn 関数を使用して、標準正規分布などのさまざまな分布からランダムなサンプルを抽出することもできます。

場合によっては、コードが実行されるたびに同じランダムな結果が生成されるようにしたい場合があります。これは、特にコードを共有したり、異なるメソッドを比較したりする場合に、再現性を高めるのに役立ちます。これを実現するには、コードまたはノートブックの先頭にランダム シードを設定します。シードは、毎回同じ乱数のシーケンスが生成されるようにする任意の数です。

ランダム シードを設定すると、コードが複数回実行されても、生成される乱数は一定のままになります。ただし、別の無作為サンプルを抽出すると、やはり無作為プロセスであるため、結果が異なることに注意することが重要です。

一貫した結果が得られることは、データのシャッフルや実装のテストなどの機械学習アプリケーションで特に役立ちます。たとえば、データセットを分割する場合、ランダム シードを設定すると、分割が毎回同じになることが保証されます。これにより、さまざまな方法の正確な比較と評価が可能になります。

ランダム性をより細かく管理するには、NumPy でランダム状態オブジェクトを使用します。ランダム状態オブジェクトには独自の乱数ジェネレーターがあり、ランダム性が適用される場所をきめ細かく制御できます。複数のランダムな状態オブジェクトを作成することにより、コード内にさまざまなランダム性のソースを含めることができます。これは、コードの特定の部分で一貫した結果を生成し、他の部分でさまざまな乱数を生成する場合に特に有益です。

古いrandom_stateクラスは依然として広く使用されていますが、NumPyコミュニティは現在、新しいランダムジェネレータの使用を推奨しています。この新しいジェネレーターは、乱数を生成するために別の方法を採用していますが、ほとんどの単純なアプリケーションでは、この 2 つのどちらを選択しても目立った違いは生じません。最も重要なのは、再現性を高めるためにランダムなシードを設定することです。

コード内の乱数ジェネレーターは真のランダムではなく、疑似ランダムであることを覚えておくことが重要です。彼らはアルゴリズムを使用して、ランダム性を模倣した一連の数値を生成します。この文脈では、乱数生成に使用される特定のアルゴリズムではなく、一貫性と再現性に重点が置かれています。

結論として、NumPy で乱数ジェネレーターを使用する場合、ジェネレーター自体の選択は重要ではありません。重要なのは、一貫性と再現性のある結果を保証するためにランダム シードを設定することです。これは、コードを共有したり、課題を提出したり、さまざまなメソッドを比較したりするときに特に役立ちます。

4.6 NumPy Random Number Generators (L04: Scientific Computing in Python)
4.6 NumPy Random Number Generators (L04: Scientific Computing in Python)
  • 2020.09.21
  • www.youtube.com
Random number generators and seeds are at the core of reproducible research. In this video, I show you how to use random number generators in NumPy.Jupyter n...
 

4.7 NumPy 配列の再構成 (L04: Python による科学計算)



4.7 NumPy 配列の再構成 (L04: Python による科学計算)

ついに、NumPy シリーズも完結に近づきました。残りのビデオは 3 つだけになり、NumPy 配列の再構成という重要なトピックに到達しました。配列の再形成は、行列をベクトルに変換する、またはその逆に変換するなど、データを目的の形状に変換する必要がある場合に非常に重要です。この概念については、MNIST について説明した入門講義で簡単に言及しました。このプロセスを説明するために、単純化した例を考えてみましょう。

画像を表す 28 × 28 の次元の配列があると想像してください。通常、配列内の各要素はピクセル値に対応します。ただし、話を簡単にするために、各要素が 1 つの数字であると仮定します。したがって、数字のイメージを表す 28 × 28 の配列が得られます。ただし、この配列を分類器の特徴ベクトルとして使用したい場合は、それを 784 要素 (28 * 28) を持つ単一の長いベクトルに再形成する必要があります。各トレーニング サンプルは画像であり、各画像には 784 個の特徴があります。

配列の再形成は、NumPy の reshape 関数を使用して実行できます。たとえば、ベクトル 1、2、3、4、5、6 を 2 × 3 の行列に再形成できます。

array([[1, 2, 3],
       [4, 5, 6]])
再形成中に指定する次元は、元の配列の要素の総数と一致する必要があることに注意することが重要です。寸法が間違っているとエラーが発生します。たとえば、6 要素のベクトルを 3 × 3 の行列に再形成しようとすると、要素が足りないためエラーがスローされます。

配列を再形成すると、新しい配列ではなくメモリ ビューが作成されます。このメモリ ビューを使用すると、データを複製せずに再形成された配列を操作できます。これを確認するには、np.may_share_memory 関数を使用できますが、常に 100% 正確な結果が得られるとは限りません。

再形成時の次元として -1 を使用することは、NumPy の便利な機能です。これはプレースホルダーとして機能し、メソッドが要素の合計数に基づいて適切なディメンションを決定できるようにします。たとえば、6 つの要素を持つベクトルがあり、それを -1, 2 を使用して変形すると、3 行 2 列を配置して 6 つの要素を取得する方法は 1 つしかないため、-1 は 3 に置き換えられます。このプレースホルダーの概念は、任意の数の次元で機能します。

さらに、 reshape 関数を使用して配列を平坦化することもできます。次元として単一の値を指定することにより (例: reshape(6))、配列を 1 次元ベクトルに変換できます。実際には、-1 を使用するとサイズを覚えておく必要がなくなるため、より便利です。たとえば、6 要素配列の場合、 reshape(-1) は reshape(6) と同じ結果をもたらします。

NumPy で配列をフラット化する方法は複数あります。 -1 を指定した reshape 関数はメモリ ビューを作成しますが、 flatten 関数も配列を平坦化しますが、コピーを作成します。別の関数 ravel も配列を平坦化するために使用されます。これらの関数の違いを判断することは、良い自己評価クイズになります。

最後に、NumPy で配列を連結し、指定した軸に沿って配列を組み合わせることができます。最初の軸に沿って配列を連結する場合、Python リストに要素を追加するのと似ています。たとえば、1 つの軸を持つ 2 つの配列がある場合、その軸に沿って配列を連結すると、一方が他方の下に積み重ねられます。

データを目的の形状に操作するには、NumPy 配列の形状を変更することが不可欠です。さまざまなメソッド、プレースホルダー、連結手法を理解すると、配列を効果的に操作してコードを最適化できるようになります。次のビデオでは、NumPy 比較演算子とマスクについて説明します。これらは、再形成と組み合わせると強力なツールになります。

4.7 Reshaping NumPy Arrays (L04: Scientific Computing in Python)
4.7 Reshaping NumPy Arrays (L04: Scientific Computing in Python)
  • 2020.09.21
  • www.youtube.com
Sometimes, our arrays just don't have the right shape. In this video, I will show you how we can manipulate the axes of an array to get it into the required ...
 

4.8 NumPy 比較演算子とマスク (L04: Python での科学計算)



4.8 NumPy 比較演算子とマスク (L04: Python での科学計算)

NumPy では、比較演算子と選択マスクは柔軟性が高く、非常に楽しく作業できます。前回のビデオでは、マスクと比較演算子を紹介しましたが、今度はそれらを使用するときに使用できる追加のトリックを見てみましょう。

簡単な例から始めましょう。簡単にするために、NumPy 配列 [1, 2, 3, 4] があると仮定します。配列から特定の値を選択するためのマスクを定義できます。このマスクはブール配列になります。つまり、True または False の値が含まれます。 2 より大きい値を選択するなど、条件を指定してマスクを作成できます。結果のマスク配列は元の配列と同じ形状になり、True 値は条件が true である位置を示し、False 値は条件が false である位置を示します。

Python では、ブール値と整数の間に便利な関係があります。True は 1 に相当し、False は 0 に相当します。この関係により、興味深い演算を実行できるようになります。たとえば、if ステートメントを使用して、単に if 条件: と記述するだけで、条件が true であるかどうかを確認できます。また、not 演算子を使用して、if not 条件: と記述することで、条件が false であるかどうかを確認することもできます。これらのアプローチでは、条件を True または False で明示的に比較する場合と比較して、より読みやすいコードが提供されます。

もう 1 つの便利な機能は、特定の条件に一致する配列内の要素の数をカウントする機能です。 sum 演算子をマスクに適用すると、マスク内の True 値の数をカウントできます。たとえば、2 より大きい値を選択するマスクがある場合、sum(mask) を呼び出すことでそのような値の数をカウントできます。同様に、配列内の要素の合計数から合計を減算することで、False 値の数をカウントできます。

配列内の負の値の数をカウントするには、マスク内のブール値を反転する NumPy 反転関数を利用できます。マスクに反転を適用してから sum を呼び出すことで、False 値 (負の値を表す) の数をカウントできます。

配列の 2 値化、つまりバイナリ表現への変換も一般的な操作です。これを実現するには、条件が true の位置に特定の値を割り当て、条件が false の位置に別の値を割り当てます。ただし、操作全体を入力するのは面倒な場合があります。幸いなことに、NumPy には、このプロセスを簡素化する where 関数が用意されています。 where 関数は条件を受け取り、条件が true である位置には最初の値を割り当て、条件が false である位置には 2 番目の値を割り当てます。 where を使用すると、たった 1 行のコードで簡単に配列を 2 値化できます。

NumPy は、比較演算子に加えて、and、or、xor、not などの論理演算子を提供します。これらの演算子をマスクと組み合わせて、より複雑な条件を作成できます。たとえば、or 演算子を使用して、3 より大きい値または 2 より小さい値を選択できます。論理演算子を使用して複数の条件を組み合わせることで、ニーズに合った複雑な選択マスクを作成できます。

NumPy のこれらのブール マスク、論理演算子、比較演算子は、データ セットを操作したりデシジョン ツリー ルールを実装したりするときに非常に役立ちます。これらの概念については、今後のビデオでさらに詳しく説明します。次のビデオでは、NumPy の基本的な線形代数の概念を詳しく説明します。乞うご期待!

4.8 NumPy Comparison Operators and Masks (L04: Scientific Computing in Python)
4.8 NumPy Comparison Operators and Masks (L04: Scientific Computing in Python)
  • 2020.09.22
  • www.youtube.com
Using comparison operators and selection masks goes hand in hand with fancy indexing in NumPy. This video explains how we can select relevant data convenient...
 

4.9 NumPy 線形代数の基礎 (L04: Python による科学計算)



4.9 NumPy 線形代数の基礎 (L04: Python による科学計算)

このビデオでは、特に NumPy のコンテキストで、線形代数の基本的な概念をいくつか掘り下げていきたいと思います。このコースでは線形代数を広範囲には利用しませんが、ベクトル内積や行列の乗算などの基本演算を理解することが重要です。前に述べたように、線形代数表記を採用すると、より効率的かつ簡潔なコードを作成できます。

まず、1 次元配列を行ベクトルとして考えてみましょう。あるいは、複数の要素を含む 1 つの行で構成されるベクトルとして定義することもできます。一方、列ベクトルは、行ベクトルを 1 つの列と複数の要素を持つように再形成することによって作成できます。基本的に、これは列ベクトル表現を表します。特に、この文脈では角括弧の使用は不要です。

ベクトルを明示的に再形成する代わりに、NumPy の newaxis 関数を使用して新しい軸を追加することで、同じ結果を得ることができます。 2 つの新しい軸を追加することで、3D テンソルを作成することもできます。もう 1 つのアプローチは、None キーワードを使用することです。これは newaxis と同じ目的を果たします。これら 3 つのメソッド、つまり reshaping、newaxis、および None はすべて、必要に応じて追加の軸を追加するという目的を達成します。

次に、行列乗算の基本的な線形代数表記に遭遇します。線形代数では、行列の乗算は複数の内積を計算することと同じです。たとえば、ベクトル [1, 2, 3] と [1, 2, 3] がある場合、それらの内積は 14 になります。同様に、[4, 5, 6] と [1, 2, NumPy では、関数 matmul を使用して行列の乗算を実行できます。あるいは、便宜上 @ 演算子を使用することもできます。ただし、線形代数では行列とベクトルを直接乗算できないことに注意することが重要です。それにもかかわらず、列ベクトルを行列、具体的には 3x1 行列と考えることができます。このアプローチにより、厳密な線形代数では不可能な行列とベクトルの乗算が可能になります。したがって、NumPy は従来の線形代数に比べて柔軟性が高くなります。

さらに、NumPy は行列乗算用のドット関数を提供します。これは、ほとんどのマシンで効率的に実装できるため広く推奨されています。この関数を使用すると、特に行ベクトルを扱う場合に、コードをより簡単に作成できるようになります。これは、NumPy での行列乗算のショートカットまたは演算子のオーバーロードとして機能します。 dot 関数は、入力形状に基づいてドット積または行列の乗算を実行し、行列とベクトルのさまざまな組み合わせを処理できることは注目に値します。

パフォーマンスに関しては、matmul 関数と dot 関数はどちらも同様の速度を持っています。どちらを選択するかは、特定のマシンによって異なる場合があります。それにもかかわらず、実際にはドット関数が一般に好まれます。さらに、転置演算は線形代数の転置演算と同様の役割を果たし、行列を効果的に反転します。転置関数を明示的に使用する代わりに、簡潔にするために T 属性を利用できます。

NumPy には 2 次元配列の行列タイプが含まれていますが、NumPy コミュニティ内では一般的に使用されていません。ほとんどの場合、通常の多次元配列がその目的を果たします。行列タイプは 2 次元に制限されており、不必要な複雑さが生じます。特に必要な場合を除き、使用を避けることをお勧めします。

最後に、NumPy を超える幅広い追加機能を網羅する優れたライブラリである SciPy について簡単に触れます。このライブラリには、線形代数演算、フーリエ変換、内挿技術、最適化アルゴリズム、統計関数など、科学計算用の特殊なアルゴリズムが多数含まれています。 SciPy は NumPy に基づいていますが、拡張機能として機能し、さまざまな科学計算に特化したツールを提供します。このコースでは、必要に応じて SciPy 内の特定のアルゴリズムを検討します。すべての詳細を記憶する必要はありません。関連するアルゴリズムを見つけ次第、紹介して説明します。

これで、Python での科学技術コンピューティングのための NumPy と SciPy についての説明を終了します。次のビデオでは、強力なプロット ライブラリである matplotlib を探索することで科学コンピューティングの旅を続けます。

4.9 NumPy Linear Algebra Basics (L04: Scientific Computing in Python)
4.9 NumPy Linear Algebra Basics (L04: Scientific Computing in Python)
  • 2020.09.22
  • www.youtube.com
At its core, NumPy is an array library that implements tensors (including vectors and matrices) for linear algebra. After covering the basics of NumPy, this ...
 

4.10 Matplotlib (L04: Python による科学計算)



4.10 Matplotlib (L04: Python による科学計算)

かなり長かった講義4もようやく終わりました。ただし、NumPy について説明した概念が皆さんにとって有益だったことを願っています。将来的には、機械学習アルゴリズムを実装するための宿題で NumPy を幅広く活用する予定です。したがって、この時点で NumPy に習熟し、慣れることが重要です。

講義 4 の最後のトピックに進み、Python の人気のあるプロット ライブラリである matplotlib について説明します。現在、利用可能なプロット ライブラリがいくつかありますが、matplotlib が依然として最も広く使用されています。個人的には、これは私のお気に入りのプロット ライブラリでもあり、その名前は Metalab からインスピレーションを得ています。 matplotlib の構文は MATLAB に非常に似ていますが、これを評価する人もいれば、評価しない人もいます。たとえば、私は大学院時代は MATLAB を使用するのが嫌いでしたが、matplotlib は素晴らしいツールであると感じています。

MATLAB のファンでなくても、matplotlib は比較的使いやすいと思います。さらに、NumPy とスムーズに統合できることも利点です。それでは、matplotlib を始めましょう。個人的に言っておくと、matplotlib は低レベルのライブラリであるため、matplotlib でタスクを実行するための特別な方法をすべて覚えているわけではありません。これは、高レベルのカスタマイズ オプションが提供されますが、そのすべてが直感的であるわけではないことを意味します。したがって、私はしばしば物事を調べていることに気づきます。何か特定のことを行う必要があるときは、さまざまな例が紹介されている matplotlib ギャラリーにアクセスします。たとえば、ステム プロットを作成したい場合は、ギャラリーでそれを検索し、例を見つけて、それをデータに適合させるだけです。通常、このアプローチで私のニーズには十分です。ただし、より詳細なチュートリアルが必要な場合は、matplotlib.org Web サイトを参照してください。この Web サイトでは、matplotlib のさまざまな側面に関する説明的なチュートリアルが提供されています。

まず、Jupyter Lab または Jupyter Notebooks で matplotlib を使用する場合、inline 関数を使用してノートブック自体内にプロットを表示できます。これは、プロットがノートブックに直接表示され、別のウィンドウが必要なくなることを意味します。これを実現する別の方法もありますが、個人的には、さまざまなコンピューター間でより信頼性が高いインライン アプローチを使用することをお勧めします。インライン モードをアクティブにするには、マジック コマンド %matplotlib inline を使用します。あるいは、プロット ステートメントの末尾にセミコロンを追加すると、通常は同じ結果が得られます。ただし、特定のコンピュータではセミコロンのトリックがうまく機能しない可能性があるため、プロットを表示するには plt.show() を使用することをお勧めします。

ここで、matplotlib を使用していくつかの簡単なプロットを作成してみましょう。たとえば、正弦曲線をプロットすることから始めることができます。これを行うには、np.linspace 関数を使用して 0 から 10 までの範囲の 100 個の値を生成し、これらの値を正弦関数である np.sin に対してプロットします。プロットを作成する最も簡単な方法は、関数 plt.plot を使用することです。ここで、plt は matplotlib.pyplot の略称です。 plt.xlim 関数と plt.ylim 関数を使用してプロットの軸範囲を調整し、それぞれ x 軸と y 軸の制限を設定できます。さらに、関数 plt.xlabel および plt.ylabel を使用して、x 軸と y 軸にラベルを追加できます。最後に、プロットを表示するには、plt.show() 関数を使用するか、プロット ステートメントの最後にセミコロンを追加して不要な出力を抑制します。

単一のプロットに加えて、同じ Figure 内に複数のプロットを作成することもできます。たとえば、サイン曲線とコサイン曲線の両方を別々のサブプロットにプロットできます。これを実現するには、関数 plt.subplots を使用して 2 つの図を作成し、各サブプロットにそれぞれのサイン曲線とコサイン曲線をプロットします。 plt.subplots 関数は、Figure オブジェクトと Axes オブジェクトの配列を返します。これらを使用して、各サブプロットを個別にカスタマイズできます。

複数のサブプロットの作成を示すコード スニペットの例を次に示します。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace( 0 , 10 , 100 )
y1 = np.sin(x)
y2 = np.cos(x)

fig, axs = plt.subplots( 2 , 1 )  # Create a figure with 2 subplots arranged vertically

# Plot the sine curve in the first subplot
axs[ 0 ].plot(x, y1)
axs[ 0 ].set_title( 'Sine Curve' )  # Set a title for the subplot
axs[ 0 ].set_xlabel( 'X' )
axs[ 0 ].set_ylabel( 'Y' )

# Plot the cosine curve in the second subplot
axs[ 1 ].plot(x, y2)
axs[ 1 ].set_title( 'Cosine Curve' )
axs[ 1 ].set_xlabel( 'X' )
axs[ 1 ].set_ylabel( 'Y' )

plt.tight_layout()  # Adjust the spacing between subplots for better readability
plt.show()  # Display the figure
この例では、関数 plt.subplots を使用して、2 つのサブプロットが垂直方向に配置された図 (2, 1) を作成します。この関数は、指定されたサブプロット レイアウトと一致する次元を持つ Figure オブジェクト fig と Axes オブジェクト axs の配列を返します。 axs 配列にインデックスを付けることで、各サブプロットにアクセスできます。

サブプロット固有のコード ブロック内では、plot 関数を使用してそれぞれの曲線をプロットし、set_title、set_xlabel、set_ylabel 関数をそれぞれ使用して各サブプロットのタイトル、x 軸ラベル、y 軸ラベルをカスタマイズします。

サブプロット間の間隔を調整するために、tight_layout 関数が呼び出され、読みやすさが向上します。最後に、 plt.show() を使用して、サブプロットを含む図を表示します。

Jupyter Notebook または Jupyter Lab 環境でこのコードを実行して、サイン曲線とコサイン曲線が別々のサブプロットに表示された結果の図を確認してください。

これはサブプロットを作成する基本的な例にすぎません。プロットをより有益で視覚的に魅力的なものにするために、matplotlib にはさらに多くのカスタマイズ オプションが用意されています。さらなる例と詳細な説明については、matplotlib のドキュメントとギャラリーを参照してください。

4.10 Matplotlib (L04: Scientific Computing in Python)
4.10 Matplotlib (L04: Scientific Computing in Python)
  • 2020.09.22
  • www.youtube.com
In this video, I am showing you how to use my favorite plotting library to plot data in Python.Jupyter notebook: https://github.com/rasbt/stat451-machine-lea...
 

5.1 表形式のテキスト ファイルからのデータセットの読み取り (L05: Scikit-Learn による機械学習)



5.1 表形式のテキスト ファイルからのデータセットの読み取り (L05: Scikit-Learn による機械学習)

こんにちは、みんな!皆さんが素晴らしい一週間を過ごし、NumPy の資料をすべて学習する機会があったことを願っています。今週は、scikit-learn を使用したデータ処理と機械学習に焦点を当てるため、NumPy をよく理解することが不可欠です。コーディングを練習し、実際の例で学んだ概念を適用することは非常に有益であると信じています。そのため、この講義では事前にコーディングをいくつか行います。これらのツールを広範囲に使用すると、後ほどの授業で役立ちます。そういえば、最初の大きな宿題をアップロードしたこと以外、この講義に追加することはあまりありません。この宿題では、教師あり学習や NumPy を使用したコード例など、以前の講義で取り上げた概念をテストします。 K 最近傍アルゴリズムを実際に体験し、NumPy と scikit-learn をさらに詳しく調べる絶好の機会です。

さて、皆さんがビデオを見て、宿題をこなし、自己評価クイズに答えている間、楽しんで楽しむことを思い出していただきたいと思います。ここウィスコンシンでは、私の大好きな季節である秋が始まったばかりです。寒い気候と美しい色の紅葉が大好きです。ちなみに、私はすでに先週末にカボチャ畑に行って、ハロウィーンのために彫るのが待ちきれないカボチャをいくつか手に入れたので、本当に興奮しています。それでは、小さなカボチャに戻ってハロウィーンの準備をするために、講義を始めましょう。

さて、計算基礎講義のパート 3 が終わりました。この講義では、従来の機械学習タスクで最も一般的なファイル形式である CSV ファイルなどの表形式のテキスト ファイルからデータ セットを読み取ることから始めて、いくつかのトピックを取り上げます。次に、機械学習アルゴリズムやトレーニング手順用のデータの形成など、基本的なデータ処理手法について説明します。

その後、scikit-learn を使用した機械学習について詳しく見ていきます。その前に、Python クラスとオブジェクト指向プログラミングについて簡単にまとめておきたいと思います。以前の演習では、Python の準備をするか、Python の概念をよりよく理解するようにお願いしました。 scikit-learn はオブジェクト指向プログラミングに大きく依存しているため、オブジェクト指向プログラミングをよく理解することが重要です。したがって、scikit-learn の仕組みを理解するには、オブジェクト指向プログラミングを理解する必要があります。

次に、scikit-learn トランスフォーマー API を使用したトレーニング データの準備について説明します。また、scikit-learn パイプラインの定義についても説明します。これは、データセットの準備、スケーリング、正規化、次元削減、分類子自体など、さまざまな操作を連鎖させるのに役立ちます。パイプラインを使用すると、機械学習プロセスのさまざまな側面を接続する効率的なトレーニング ワークフローを作成でき、作業がより便利になります。これは scikit-learn の重要な強みの 1 つです。

今回の講義でもスライドを使うことにしました。 Jupiter Lab は素晴らしいツールですが、コード例にペンや鉛筆で注釈を付けると、特定の概念を説明しやすくなります。したがって、これらのスライドでは、Jupiter Lab と Jupiter Notebook のスクリーンショットをキャプチャしました。講義中に注釈を付けます。ただし、コード ノート全体を GitHub にアップロードしましたので、追加の説明を参照してください。この文書は、参考用のオプションのコースまたは講義ノートとしてお考えください。

このコースのどこにいるのかを簡単にまとめてみましょう。機械学習の概要から始めて、基本をカバーし、scikit-learn がどのように機能するかを検討しました。次に、Python をさらに深く掘り下げ、NumPy と科学技術コンピューティングについて学びました。現在、scikit-learn によるデータ処理と機械学習の段階に入っています。次の講義では、決定木、アンサンブル手法、モデル評価などの機械学習の中核概念に戻ります。これは計算基礎の講義の最後の部分ですが、これでコースが終了するわけではありません。計算基礎の講義を完了したら、ディープラーニングやニューラルネットワークなどの機械学習のより高度なトピックに進みます。

さて、この講義の最初のトピックである、表形式のテキスト ファイルからのデータ セットの読み取りについて詳しく見ていきましょう。機械学習を使用する場合、データを CSV (カンマ区切り) ファイルなどの表形式で保存するのが一般的です。これらのファイルにはデータの行と列が含まれており、各行はサンプルまたはインスタンスを表し、各列は特徴または属性を表します。

Python で CSV ファイルを読み取るには、Pandas ライブラリを使用できます。 Pandas は強力なデータ操作および分析ツールを提供するため、Python で表形式のデータを操作するための一般的な選択肢となっています。例を見てみましょう:

import pandas as pd

# Read the CSV file into a DataFrame
data = pd.read_csv( 'data.csv' )

# Display the first few rows of the DataFrame
print(data.head())

この例では、まず pandas ライブラリをインポートし、便宜上 pd というエイリアスを付けます。次に、read_csv() 関数を使用して、CSV ファイル data.csv を DataFrame に読み込みます。DataFrame は、Pandas が提供する 2 次元の表形式のデータ構造です。 DataFrameは変数dataに格納されます。

データを読み取った後、head() 関数を使用して DataFrame の最初の数行を表示できます。これにより、データを迅速に検査し、正しく読み取られたことを確認できます。

Pandas は、データを操作および分析するための幅広い機能とメソッドを提供します。行のフィルタリング、列の選択、データの集計など、さまざまな操作を実行できます。 Pandas を初めて使用する場合は、そのドキュメントを調べて、さまざまな操作を自分で試してみることをお勧めします。

データを読み取る方法がわかったので、次のトピックである基本的なデータ処理テクニックに進みましょう。機械学習のためにデータを扱う場合、データを適切に前処理して準備することが不可欠です。これには、欠損値の処理、カテゴリ変数のエンコード、数値特徴のスケーリング、データのトレーニング セットとテスト セットへの分割などのタスクが含まれます。

一般的な前処理手順の 1 つは、欠損値の処理です。欠損値は、データ内で NaN (Not a Number) または NULL 値として表されることがよくあります。これらの欠損値は、機械学習モデルをトレーニングするときに問題を引き起こす可能性があるため、適切に処理する必要があります。 Pandas には、欠損値を処理する関数がいくつか用意されています。たとえば、欠損値をチェックする isna()、欠損値を指定した値で埋める fillna()、欠損値のある行または列を削除する Dropna() などです。

カテゴリ変数のエンコードも重要な手順です。機械学習モデルは通常、数値データを処理するため、カテゴリ変数を数値表現に変換する必要があります。一般的なエンコーディング手法の 1 つはワンホット エンコーディングです。このエンコーディングでは、カテゴリごとにバイナリ列を作成し、カテゴリの有無をそれぞれ 1 または 0 で示します。

import pandas as pd

# Create a DataFrame with categorical variables
data = pd.DataFrame({ 'color' : [ 'red' , 'blue' , 'green' , 'red' , 'green' ]})

# Perform one-hot encoding
encoded_data = pd.get_dummies(data)

# Display the encoded data
print(encoded_data)
この例では、カテゴリ変数を含む列「color」を持つ DataFrame を作成します。次に、Pandas の get_dummies() 関数を使用して、ワンホット エンコーディングを実行します。結果として得られるエンコードされたデータには、元の「color」列の一意のカテゴリごとにバイナリ列が含まれます。

数値特徴のスケーリングは、もう 1 つの一般的な前処理ステップです。多くの機械学習アルゴリズムは、特徴の規模に敏感です。フィーチャのスケールが異なる場合、モデルのパフォーマンスに影響を与える可能性があります。これに対処するには、0 から 1 または -1 から 1 などの標準範囲に特徴をスケーリングできます。Pandas は、特徴のスケーリングを実行するために、sklearn.preprocessing モジュールで MinMaxScaler クラスと StandardScaler クラスを提供します。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# Create a DataFrame with numerical features
data = pd.DataFrame({ 'age' : [ 25 , 30 , 35 , 40 ], 'income' : [ 50000 , 60000 , 70000 , 80000 ]})

# Perform feature scaling using MinMaxScaler
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)

# Convert the scaled data back to a DataFrame
scaled_df = pd.DataFrame(scaled_data, columns=data.columns)

# Display the scaled data
print(scaled_df)
この例では、「年齢」と「収入」という 2 つの数値特徴を備えた DataFrame を作成します。次に、sklearn.preprocessing モジュールの MinMaxScaler クラスを使用して、特徴スケーリングを実行します。 fit_transform() メソッドはデータをスケーリングし、結果のスケーリングされたデータは NumPy 配列としてscaled_data 変数に保存されます。最後に、スケーリングされたデータを DataFrame に変換して表示します。

最後に、機械学習モデルのパフォーマンスを評価するには、データをトレーニング セットとテスト セットに分割することが重要です。通常、データを 2 つのセットに分割します。1 つはモデルのトレーニングに使用されるトレーニング セット、もう 1 つはそのパフォーマンスの評価に使用されるテスト セットです。 Pandas は、データをトレーニング セットとテスト セットに分割するための sklearn.model_selection モジュールに train_test_split() 関数を提供します。

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the CSV file into a DataFrame
data = pd.read_csv( 'data.csv' )

# Split the data into features and labels
X = data.drop( 'label' , axis= 1 )
y = data[ 'label' ]

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
この例では、まず CSV ファイル「data.csv」を DataFrame に読み込みます。次に、データを特徴 X とラベル y に分割します。X には「label」列を除くすべての列が含まれ、y には「label」列のみが含まれます。

次に、train_test_split() 関数を使用して、データをトレーニング セットとテスト セットに分割します。特徴 X とラベル y を渡し、目的のテスト サイズ (たとえば、20% テスト セットの場合は 0.2) を指定し、再現性のためにランダムな状態を設定します。

データを分割した後、トレーニング セット (X_train および y_train) を使用して機械学習モデルをトレーニングし、テスト セット (X_test および y_test) でのパフォーマンスを評価できます。

これらは、Python の Pandas ライブラリを使用した機械学習における基本的なデータ処理テクニックの一部です。データの前処理と準備は機械学習パイプラインの重要なステップであり、プロジェクトの特定の要件に応じて利用できるテクニックやツールが他にもたくさんあることを覚えておいてください。

5.1 Reading a Dataset from a Tabular Text File (L05: Machine Learning with Scikit-Learn)
5.1 Reading a Dataset from a Tabular Text File (L05: Machine Learning with Scikit-Learn)
  • 2020.09.27
  • www.youtube.com
Machine learning begins with loading your data into a friendly array format. In this video, we will use pandas' read_csv function to get data into our active...
 

5.2 基本的なデータ処理 (L05: Scikit-Learn による機械学習)



5.2 基本的なデータ処理 (L05: Scikit-Learn による機械学習)

前回のビデオでは、表形式のテキスト ファイルをデータセットとして読み取る方法について説明しました。具体的には、CSV ファイル、より具体的には Iris データセットの操作に焦点を当てました。 Iris データセットを CSV ファイルから Pandas DataFrame にインポートしました。

このビデオでは、scikit-learn を使用した機械学習に適切な形式でデータを準備する方法について詳しく説明します。 Pandas と NumPy を使用してデータを機械学習に適した形式に変換する、基本的なデータ処理手法を検討します。ただし、先に進む前に、Python 関数の概念を簡単にまとめておきます。これは、Pandas DataFrame での値の変換について説明するときに便利です。

ここには、「some_func」という単純な Python 関数があります。単一の入力引数「x」を受け取り、それを文字列に変換します。次に、変換された値を固定文字列「hello world」と連結します。 123 などの整数を入力として指定すると、文字列 (「123」) に変換され、「hello world」と連結されて、最終的な文字列が得られます。これは、Python 関数がどのように動作するかの基本的な概要であり、コロンは関数の本体を示し、return ステートメントは出力を指定します。関数内に複数行のコードが存在する場合がありますが、return ステートメントが終了を示します。

言及する価値のあるもう 1 つの概念は、ラムダ関数です。 Lambda 関数は、明示的に名前を付けずに小さな関数を定義する簡単な方法です。これらは、コード行を保存して関数をすばやく作成する必要がある場合によく使用されます。 Pandas 列のデータ変換のコンテキストでは、ラムダ関数がよく使用されます。ラムダ関数はより簡潔な構文を提供しますが、基本的には通常の関数と同じ操作を実行します。これらは、Pandas DataFrame 列の apply メソッドと組み合わせると特に便利です。

前回の講義では、CSV ファイルから Iris データセットを Pandas DataFrame に読み込みました。 Iris データセットは 150 行で構成されていますが、簡潔にするために最初の 5 行のみを表示しています。データセットには、必須ではない ID 列が含まれており、その後に計画行列 X で表される特徴が続きます。また、通常 y で示されるクラス ラベルもあります。従来、scikit-learn やその他のライブラリは文字列変数をクラス ラベルとして処理しなかったため、文字列変数を整数に変換するのが一般的でした。たとえば、「Iris setosa」は整数 0 に、「Iris versicolor」は 1 に、「Iris virginica」は 2 に変換されます。多くのアルゴリズムが文字列ラベルではなく整数クラス ラベルを処理するように設計されているため、この変換が必要でした。

ただし、scikit-learn はほとんどの関数で文字列クラス ラベルをサポートするようになり、明示的な変換の必要性がなくなりました。内部的には、変換は自動的に処理されます。ただし、一部のツールでは文字列データを正しく処理できない場合があるため、クラス ラベルを整数に変換することをお勧めします。そうすることで、さまざまなツールとの互換性が確保され、エラーが発生する可能性が低くなります。

変換プロセスを説明するために、ラムダ関数を apply メソッドと組み合わせて使用します。 DataFrame の種列にラムダ関数を適用することで、文字列クラス ラベルを整数ラベルに変換できます。ただし、多くの場合、マッピング ディクショナリを使用する方がより良いアプローチであることに注意してください。これにより、可読性が向上し、クラス ラベル変換の解釈が容易になります。さらに、後で元のクラス ラベルを取得する必要がある場合は、逆引き辞書を定義し、それを使用して整数ラベルを元の文字列表現にマップし直すことができます。

変換を実証するために、データセットを元の状態にリロードします。次に、apply を使用する代わりに、map 関数を使用して、マッピング ディクショナリを使用して文字列ラベルを整数に変換します。また、基礎となる NumPy 配列にアクセスする、values 属性の使用法も紹介します。 NumPy 配列の操作。

NumPy 配列を使用すると、いくつかの理由から有益な場合があります。 NumPy 配列は Pandas DataFrame に比べてメモリ効率が高く、大規模なデータセットに最適です。さらに、scikit-learn の多くの機械学習アルゴリズムは、入力データが NumPy 配列の形式であることを想定しています。

Pandas DataFrame を NumPy 配列に変換するには、DataFrame の value 属性にアクセスするだけです。例を見てみましょう:

import pandas as pd
import numpy as np

# Reload the Iris dataset
iris_df = pd.read_csv( 'iris.csv' )

# Convert the features (X) into a NumPy array
X = iris_df.drop([ 'species' ], axis= 1 ).values

# Convert the class labels (y) into a NumPy array
y = iris_df[ 'species' ].values
この例では、DataFrame の Drop メソッドを使用して「species」列を削除し、特徴を DataFrame として取得します。次に、values 属性にアクセスして、特徴を NumPy 配列に変換し、それを変数 X に割り当てます。

同様に、インデックス演算子 [] を使用して DataFrame の「species」列にアクセスし、それを NumPy 配列に変換し、変数 y に割り当てます。

ここで、X 変数には NumPy 配列として特徴行列が含まれ、y 変数には NumPy 配列としてクラス ラベルが含まれています。これらの配列をさまざまな機械学習アルゴリズムの入力として使用できます。

モデル評価のためにデータセットをトレーニング セットとテスト セットに分割したいとします。 Scikit-learn は、このタスクを簡単にする train_test_split というユーティリティ関数を提供します。以下に例を示します。

 from sklearn.model_selection import train_test_split

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
この例では、sklearn.model_selection モジュールから train_test_split 関数をインポートします。 X 配列と y 配列を引数として関数に渡し、テストに割り当てるデータセットの割合 (この場合は 20%) を指定する test_size パラメーターも渡します。 random_state パラメータにより、分割の再現性が保証されます。

train_test_split を呼び出した後、4 つの配列を取得します。X_train と y_train にはトレーニング データが含まれ、X_test と y_test にはテスト データが含まれます。

これで、X_train 配列と y_train 配列を使用して機械学習モデルをトレーニングし、X_test 配列と y_test 配列を使用してそのパフォーマンスを評価できるようになりました。

要約すると、Pandas DataFrame を NumPy 配列に変換することで、メモリ効率や機械学習アルゴリズムとの互換性などの NumPy の利点を活用できます。さらに、scikit-learn は、データをトレーニング セットとテスト セットに分割するための train_test_split などの便利な関数を提供します。

5.2 Basic data handling (L05: Machine Learning with Scikit-Learn)
5.2 Basic data handling (L05: Machine Learning with Scikit-Learn)
  • 2020.09.27
  • www.youtube.com
Before we train a machine learning classifier, we have to make sure that the dataset looks right. This means, we want to make sure that the feature and label...
 

5.3 オブジェクト指向プログラミングと Python クラス (L05: Scikit-Learn による機械学習)



5.3 オブジェクト指向プログラミングと Python クラス (L05: Scikit-Learn による機械学習)

次の講義で scikit-learn を使用した機械学習のトピックを掘り下げる前に、オブジェクト指向プログラミング、特に Python クラスについて少し説明しましょう。 scikit-learn はオブジェクト指向プログラミングの概念に大きく依存しているため、クラスを理解することは非常に重要です。このビデオの終わりに向けて、scikit-learn API を使用した K 最近傍の実装を示します。これは、scikit-learn が分類器のような推定器を実装するために使用するアプローチです。

それでは、Python クラスについて説明することから始めましょう。 scikit-learn API をより深く理解するには、クラスの基本を理解することが重要です。簡単に言えば、クラスはオブジェクトを作成するための設計図と考えることができます。オブジェクトはクラスのインスタンスであり、クッキーの作成に使用される同じクッキー カッターの形状のさまざまなバリエーションとして視覚化できます。クラス自体はクッキー カッター テンプレートとして機能し、クッキーはクラスから作成されたオブジェクトを表します。

Python では、class キーワードに続いてクラス名を使用してクラスを定義します。クラス内では、さまざまなクラス メソッドを定義します。クラス メソッドは関数に似ていますが、オブジェクト自体を参照する self と呼ばれる必須の最初の引数があります。この自己引数により、オブジェクトの属性とメソッドにアクセスできるようになります。言い換えれば、オブジェクトのデータと動作を操作できるようになります。

車両の例に関連して、単純な単純な車両クラスを考えてみましょう。このクラスは、自動車、オートバイ、トラックなどのさまざまなタイプの車両を表します。クラスには、その動作を定義するためのさまざまなメソッドがあります。最初のメソッドは __init__ メソッドで、コンストラクターとも呼ばれます。このメソッドは、クラスから新しいオブジェクトが作成されるときに自動的に実行されます。これは、self 引数と、オブジェクトの初期化に必要な追加の引数を受け入れます。

__init__ メソッドでは、引数として指定された値が割り当てられる、horsepower という属性を定義します。この属性は車両の馬力を表します。新しいオブジェクトが作成されると、馬力値を取得するためにアクセスできる馬力属性が設定されます。

__init__ メソッドに加えて、オブジェクトの属性を変更する他のメソッドを定義できます。たとえば、tune_motor メソッドは車両の馬力属性を 2 倍にし、モーターの調整をシミュレートします。車両オブジェクトでこのメソッドを呼び出すと、その馬力属性がそれに応じて変更されます。

さらに、オブジェクトの属性に基づいて値を返すメソッドを定義できます。この例では、horsepower_to_torque メソッドは、オブジェクトの馬力と指定された RPM 値に基づいてトルク値を計算します。このメソッドは、オブジェクトの属性を利用して計算を実行し、有用な結果を返す方法を示します。

Python では、メソッドの可視性を示すための規則があることに注意してください。 _private_method など、単一のアンダースコア接頭辞を持つメソッドはプライベートとみなされ、クラスのユーザーによる直接使用を目的としていません。ただし、一般的には推奨されていませんが、ユーザーは引き続きこれらのメソッドにアクセスして呼び出すことができます。 __very_private_method など、二重アンダースコア接頭辞が付いたメソッドはさらに制限が厳しく、アクセスするには特定の構文が必要です。

さらに、Python はクラスの継承をサポートしているため、親クラスからプロパティとメソッドを継承する子クラスを作成できます。この概念により、親クラスで定義された既存の機能を活用しながら、追加の属性と動作を備えた特殊なクラスを作成できます。たとえば、Vehicle クラスを継承し、車専用のnumber_of_wheels 属性を追加する特殊な Car クラスを作成できます。

説明する概念を説明するために、K 最近傍分類器の例を示します。この実装は scikit-learn API 規約に従い、scikit-learn での推定クラスの使用を示します。簡略化した実装は次のとおりです。

 class KNNClassifier:

    def __init__( self , k):
         self .k = k
         self .X_train = None
         self .y_train = None
    
    def fit( self , X_train, y_train):
         self .X_train = X_train
         self .y_train = y_train
    
    def predict( self , X_test):
        predictions = []
         for x in X_test:
            distances = []
             for i, x_train in enumerate( self .X_train):
                distance = self ._calculate_distance(x, x_train)
                distances.append((distance, self .y_train[i]))
            distances.sort()
            k_nearest = distances[: self .k]
            prediction = self ._majority_vote(k_nearest)
            predictions.append(prediction)
         return predictions
    
    def _calculate_distance( self , x1, x2):
         # Calculate the distance between two data points
         # (e.g., Euclidean distance)
        pass
    
    def _majority_vote( self , neighbors):
         # Determine the majority class among the nearest neighbors
        pass

この例では、KNNClassifier は K 最近傍分類子を表すクラスです。コンストラクターはパラメーター k を受け取り、考慮する最近傍の数を指定します。

fit メソッドは分類器をトレーニングするために使用されます。これは、X_train (トレーニング データ) と y_train (対応するラベル) の 2 つの引数を取ります。このメソッドは、後で使用できるようにトレーニング データとラベルをオブジェクトの属性に保存するだけです。

予測メソッドは、新しいデータに対して予測を行うために使用されます。 X_test (テスト データ) を引数として受け取り、テスト データの予測されたラベルを返します。 X_test の各データ ポイントについて、メソッドは _calculate_ distance メソッドを使用してトレーニング セット内のすべてのデータ ポイントまでの距離を計算します。次に、k 個の最近傍を選択し、_majority_vote メソッドを使用して多数決クラスを決定します。予測されたラベルが予測リストに追加されます。

_calculate_ distance メソッドは、2 つのデータ ポイント間の距離を計算するプライベート メソッド (先頭のアンダースコアで示されます) です。これは、ユークリッド距離または問題に適したその他の距離メトリックである可能性があります。

_majority_vote メソッドは、近傍セットの中で多数派クラスを決定する別のプライベート メソッドです。これは、各クラス ラベルの出現をカウントし、最もカウントの高いラベルを選択することで実行できます。

この例では、scikit-learn の推定クラスの基本構造を示します。もちろん、scikit-learn は、KNeighborsClassifier クラスの K 最近傍のより洗練された最適化された実装を提供しますが、この簡略化されたバージョンは基礎となる原理を示しています。

5.3 Object Oriented Programming & Python Classes (L05: Machine Learning with Scikit-Learn)
5.3 Object Oriented Programming & Python Classes (L05: Machine Learning with Scikit-Learn)
  • 2020.09.27
  • www.youtube.com
In my opinion, the scikit-learn machine learning library is one of the best-designed Python libraries out there. It heavily relies on object oriented program...
 

5.4 Scikit-Learn の概要 (L05: Scikit-Learn を使用した機械学習)



5.4 Scikit-Learn の概要 (L05: Scikit-Learn を使用した機械学習)

この比較的短いビデオの目標は、scikit-learn を使用した機械学習を紹介することです。 Scikit-learn は、Python で広く使用されている機械学習ライブラリであり、さまざまな機械学習タスク用の包括的なツールとアルゴリズムのセットを提供します。これまでに k 近傍 (KNN) 講義のコンテキストで scikit-learn を見たことがあるかもしれませんが、このビデオは一歩下がってライブラリを適切に紹介することを目的としています。

この短いビデオの後には、scikit-learn を使用したトレーニング データセットの準備について詳しく説明する長いビデオが表示されます。ここでは、従来のアプローチと比較してデータの準備をより便利かつ効率的にする手法とツールについて説明します。

後続のビデオでは、scikit-learn パイプラインを使用した、前処理手法の組み合わせ、機械学習分類器のフィッティング、トレーニングなど、scikit-learn の優れた概念のいくつかを説明します。これにより、より合理化された効率的なワークフローが可能になります。

ここで、scikit-learn を使用した機械学習について詳しく説明します。 Scikit-learn は、確立された評判、大規模なユーザー ベース、およびユーザーフレンドリーな性質により、Python の主要な機械学習ライブラリとして広く考えられています。これは、一貫性のある直感的な API を提供する、適切に設計されたライブラリです。 Scikit-learn は積極的にメンテナンスされ、定期的に更新されており、多くの貢献者によって、Scikit-learn は機械学習タスクにとって堅牢で信頼できる選択肢となっています。

scikit-learn は主に従来の機械学習手法に焦点を当てており、深層学習を目的としたものではないことに注意することが重要です。ディープラーニングは、独自の特殊なライブラリを持つ別の分野です。深層学習には、通常、TensorFlow や PyTorch などの他のライブラリが使用されます。ただし、従来の機械学習タスクでは、scikit-learn が頼りになるライブラリであることがよくあります。

Scikit-learn はかなり前から存在しており、最初のリリースは 2007 年に遡ります。古いにもかかわらず、依然として人気があり、積極的にメンテナンスされているライブラリです。これは、David Cournapeau による Google Summer of Code プロジェクトとして始まり、時間の経過とともに他の多くの開発者からの貢献を得ました。 GitHub には 1,875 人を超える寄稿者と 150,000 人近くのユーザーがおり、scikit-learn が充実したコミュニティ サポートを持つ高く評価されているライブラリであることは明らかです。

scikit-learn の公式 Web サイトには、ドキュメント、チュートリアル、その他の役立つリソースが含まれています。研究プロジェクトで scikit-learn を使用する場合は、その開発に費やされた努力を認めて、そのライブラリを参照として引用することをお勧めします。

scikit-learn の Estimator API を理解するために、その主要コンポーネントを詳しく見てみましょう。 Estimator API は教師あり学習タスクに使用され、回帰分析用のリグレッサーと分類タスク用の分類子が含まれています。 scikit-learn を使用する場合、通常は、クラスのコンストラクターで設定される特定のハイパーパラメーターを使用して推定器を初期化します。

フィッティングプロセスは、見積もり担当者にとって非常に重要です。初期化後、fit メソッドを呼び出して、トレーニング データ (特徴) とそれに対応するラベルを提供する必要があります。 fit メソッドは、指定されたデータに基づいて推定器をトレーニングし、後で予測できるようにします。フィッティング プロセス中に、特定の属性が推定器に割り当てられます。これは、モデルのフィッティング中に作成されたことを示す末尾のアンダースコアで示されます。

モデルが適合すると、predict メソッドを使用して新しいデータに対して予測を行うことができます。予測メソッドは、テスト データ (トレーニング データと同じ特徴を持つ) を入力として受け取り、予測されたラベルを返します。

さらに、scikit-learn は、モデルのパフォーマンスを計算するスコア付けメソッドを提供します。分類器の場合は精度を表すことが多く、リグレッサーの場合は通常、決定係数 (R^2 スコア) を計算します。この方法は、モデルのパフォーマンスを評価する便利な方法として機能します。

これらのコア コンポーネントに加えて、scikit-learn は、機械学習ワークフローを強化するための幅広い前処理手法とユーティリティも提供します。

機械学習の重要な側面の 1 つはデータの前処理です。これには、生データをモデルのトレーニングに適した形式に変換することが含まれます。 Scikit-learn は、特徴スケーリング、欠損値の処理、カテゴリ変数のエンコードなどのタスクを処理できるさまざまな前処理モジュールを提供します。

たとえば、StandardScaler クラスを使用すると、平均を減算し単位分散にスケーリングすることで特徴を標準化できます。これは、アルゴリズムがより速く収束し、より正確な結果を生成するのに役立つため、異なるスケールを持つ特徴を操作する場合に重要です。

もう 1 つの便利な前処理手法は、欠損値の処理です。 SimpleImputer クラスは、対応する特徴の平均値、中央値、または最頻値を使用するなど、欠損値を適切な代替値で置き換える戦略を提供します。

カテゴリカル変数を扱う場合、scikit-learn は OneHotEncoder クラスと LabelEncoder クラスを提供します。 LabelEncoder はカテゴリカル ラベルを数値に変換し、OneHotEncoder はカテゴリカル特徴をバイナリ ベクトル表現に変換して、アルゴリズムがカテゴリカル データを効果的に処理できるようにします。

機械学習ワークフローを合理化するために、scikit-learn はパイプラインと呼ばれる強力なツールを提供します。パイプラインは、複数の前処理ステップと機械学習モデルを 1 つのオブジェクトに結合するため、ワークフロー全体の一貫した管理と適用が容易になります。

パイプラインにより、同じ前処理ステップがトレーニング データセットとテスト データセットの両方に一貫して適用されることが保証され、データ漏洩や潜在的なエラーが回避されます。また、個々の前処理手順を気にすることなく、パイプライン オブジェクト全体を保存して新しいデータで再利用できるため、デプロイメント プロセスも簡素化されます。

scikit-learn のパイプライン機能を使用すると、スケーリング、欠損値の代入、カテゴリ変数のエンコードなど、複数の前処理手法を目的の機械学習モデルと連鎖させることができます。これにより、ワークフローがより合理化され効率的になり、機械学習プロジェクトの中核的な部分に集中できるようになります。

Scikit-learn は、線形回帰、ロジスティック回帰、サポート ベクター マシン、デシジョン ツリー、ランダム フォレスト、勾配ブースティングなどを含む幅広い機械学習アルゴリズムをサポートしています。各アルゴリズムは、fit、predict、score などの一貫したメソッドを備えた推定クラスとして実装されます。

タスクに適切なアルゴリズムを選択するために、scikit-learn はモデルの選択と評価のためのさまざまなツールを提供します。これらには、相互検証、ハイパーパラメータ調整、モデル評価メトリクスの手法が含まれます。相互検証は、データを複数のトレーニングとテストの分割に分割し、データのさまざまなサブセットでモデルをトレーニングおよび評価することで、モデルのパフォーマンスを評価するのに役立ちます。

ハイパーパラメーターの調整には、モデルのハイパーパラメーターの最適な値を見つけることが含まれます。ハイパーパラメーターは、データから学習されるのではなく、トレーニング前に設定されるパラメーターです。 Scikit-learn は、最適なハイパーパラメータ値を検索するプロセスを自動化するグリッド検索やランダム検索などのメソッドを提供します。

精度、適合率、再現率、F1 スコア、ROC 曲線下面積などのモデル評価指標は、さまざまなタスクにおけるモデルのパフォーマンスを評価するために重要です。 Scikit-learn は、簡単に計算して比較できるさまざまなメトリクスを提供します。

Scikit-learn は、Python の強力で人気のある機械学習ライブラリであり、さまざまな機械学習タスク用の幅広いツールとアルゴリズムを提供します。ユーザーフレンドリーな API、豊富なドキュメント、活発なコミュニティにより、初心者と経験豊富な実践者の両方にとって優れた選択肢となっています。データの前処理、パイプラインの構築、モデルの選択、またはパフォーマンスの評価が必要な場合でも、scikit-learn には、ジョブを効率的かつ効果的に実行するために必要なツールが備わっています。

5.4 Intro to Scikit-learn (L05: Machine Learning with Scikit-Learn)
5.4 Intro to Scikit-learn (L05: Machine Learning with Scikit-Learn)
  • 2020.09.30
  • www.youtube.com
Finally! It's about time to introduce my favorite machine learning library! Jupyter Notebook: https://github.com/rasbt/stat451-machine-learning-fs20/blob/ma...