ホームページ > テクノロジー周辺機器 > AI > Python で大規模な機械学習データセットを処理する簡単な方法

Python で大規模な機械学習データセットを処理する簡単な方法

王林
リリース: 2023-04-09 19:51:01
転載
1752 人が閲覧しました

この記事の対象読者:

  1. 大規模なデータ セットに対して Pandas/NumPy 操作を実行したい人。
  2. Python を使用してビッグ データに対して機械学習タスクを実行したい人。

Python で大規模な機械学習データセットを処理する簡単な方法

この記事では、.csv 形式のファイルを使用して、Python のさまざまな操作だけでなく、配列、テキスト ファイルなどの他の形式も示します。

大規模な機械学習データセットにパンダを使用できないのはなぜですか?

Pandas が機械学習データセットを読み込むためにコンピューター メモリ (RAM) を使用することはわかっていますが、コンピューターに 8 GB のメモリ (RAM) がある場合、なぜパンダは依然として 2 GB のデータセット毛織物を読み込むことができないのでしょうか?その理由は、Pandas を使用して 2 GB のファイルを読み込むには、2 GB の RAM だけでなく、より多くのメモリが必要になるためです。合計メモリ要件はデータセットのサイズとそのデータセットに対して実行する操作によって異なるためです。

これは、コンピューター メモリにロードされたさまざまなサイズのデータ​​セットの簡単な比較です:

Python で大規模な機械学習データセットを処理する簡単な方法

さらに、Pandas はオペレーティング システムのコアを 1 つだけ使用するため、処理が非常に困難になります。遅い。言い換えれば、pandas は並列処理 (問題を小さなタスクに分割すること) をサポートしていないと言えます。

コンピューターに 4 つのコアがあると仮定して、次の図は CSV ファイルをロードするときに pandas によって使用されるコアの数を示しています。

Python で大規模な機械学習データセットを処理する簡単な方法

Pandas は通常、大規模な機械学習を処理するために使用されるデータセットの主な理由は次の 2 点です。1 つはコンピューターのメモリ使用量、もう 1 つは並列処理の欠如です。 NumPy と Scikit-learn では、大規模なデータセットに対して同じ問題に直面します。

これら 2 つの問題を解決するには、Dask と呼ばれる Python ライブラリを使用できます。これにより、大規模なデータ セットに対してパンダ、NumPy、ML などのさまざまな操作を実行できるようになります。

Dask はどのように機能しますか?

Dask はデータセットをパーティションにロードしますが、pandas は通常、機械学習データセット全体をデータフレームとして使用します。 Dask では、データセットの各パーティションは pandas データフレームとみなされます。

Python で大規模な機械学習データセットを処理する簡単な方法

#Dask は一度に 1 つのパーティションをロードするため、メモリ割り当てエラーを心配する必要はありません。

以下は、dask を使用してさまざまなサイズの機械学習データセットをコンピューター メモリに読み込む場合の比較です。

Python で大規模な機械学習データセットを処理する簡単な方法

Dask は、並列処理の問題を解決します。データは複数のパーティションに分割され、それぞれが個別のコアを使用するため、データセットの計算が高速化されます。

コンピューターに 4 つのコアがあると仮定して、dask が 5 GB の csv ファイルをロードする方法を次に示します。

Python で大規模な機械学習データセットを処理する簡単な方法

dask ライブラリを使用するには、次のコマンドを使用できます。インストールするには:

<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span>
ログイン後にコピー

Dask には、dask.array、dask.dataframe、dask.distributed などのいくつかのモジュールがあり、それぞれ NumPy、pandas、Tornado などの対応するライブラリをインストールしている場合にのみ機能します。

dask を使用して大きな CSV ファイルを処理するにはどうすればよいですか?

dask.dataframe は大きな CSV ファイルを処理するために使用されます。最初に、pandas を使用してサイズ 8 GB のデータセットをインポートしようとしました。

<span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">import</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pandas</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">as</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pd</span><br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">df</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pd</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">read_csv</span>(<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">“data</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">csv”</span>)
ログイン後にコピー

私の 16 GB RAM ラップトップでメモリ割り当てエラーが発生しました。

ここで、dask.dataframe を使用して同じ 8 GB データをインポートしてみます。

Python で大規模な機械学習データセットを処理する簡単な方法

dask は、8 GB ファイル全体を ddf にロードするのにわずか 1 秒かかりました。変数。

ddf 変数の出力を見てみましょう。

Python で大規模な機械学習データセットを処理する簡単な方法

ご覧のとおり、実行時間は 0.5 秒で、119 個のパーティションに分割されていることがわかります。

次のコマンドを使用して、データフレームのパーティション数を確認することもできます。

Python で大規模な機械学習データセットを処理する簡単な方法

デフォルトでは、dask は 8 GB CSV ファイルを 119 のパーティション (各パーティション) にロードします。サイズは 64MB です)、これは利用可能な物理メモリとコンピューターのコア数に基づいて行われます。

CSV ファイルをロードするときに、blocksize パラメーターを使用して独自のパーティション数を指定することもできます。

Python で大規模な機械学習データセットを処理する簡単な方法

#文字列値 400MB のブロックサイズ パラメーターが指定されているため、各パーティションのサイズは 400 MB になります。パーティションがいくつあるか見てみましょう

Python で大規模な機械学習データセットを処理する簡単な方法

キー ポイント: Dask DataFrames を使用する場合、経験則としてパーティションを 100MB 未満に抑えることです。

次のメソッドを使用して、データフレームの特定のパーティションを呼び出します。

Python で大規模な機械学習データセットを処理する簡単な方法

負のインデックスを使用して最後のパーティションを呼び出すこともできます。リストを最後の要素として呼び出しています。

データセットの形状を見てみましょう:

Python で大規模な機械学習データセットを処理する簡単な方法

len() を使用してデータセットの行数を確認できます:

Python で大規模な機械学習データセットを処理する簡単な方法##Dask にはサンプル データセットがすでに含まれています。時系列データを使用して、dask がデータセットに対してどのように数学的演算を実行するかを示します。

Python で大規模な機械学習データセットを処理する簡単な方法dask.datasets をインポートした後、ddf_20y は 2000 年 1 月 1 日から 2021 年 12 月 31 日までの時系列データをロードしました。

時系列データのパーティション数を見てみましょう。

Python で大規模な機械学習データセットを処理する簡単な方法#20 年間の時系列データは 8035 のパーティションに分散されています。

pandas では、head を使用してデータセットの最初の数行を出力します。これは dask にも当てはまります。

Python で大規模な機械学習データセットを処理する簡単な方法id ​​列の平均を計算してみましょう。

Python で大規模な機械学習データセットを処理する簡単な方法dask は遅延計算を使用するため、データフレームの合計行数を出力しません (出力は必要になるまで表示されません)。出力を表示するには、compute メソッドを使用します。

Python で大規模な機械学習データセットを処理する簡単な方法 データセットの各列を正規化する (値を 0 から 1 の間に変換する) と仮定すると、Python コードは次のとおりです。

Python で大規模な機械学習データセットを処理する簡単な方法列をループし、各列の最小値と最大値を見つけ、単純な数式を使用して列を正規化します。

キーポイント: 正規化の例では、実際の数値計算が行われるとは考えないでください。これは単なる遅延評価です (必要になるまで出力は表示されません)。

Dask 配列を使用する理由

Dask は配列を小さなチャンクに分割します。各チャンクは NumPy 配列です。

Python で大規模な機械学習データセットを処理する簡単な方法dask.arrays は、大きな配列を処理するために使用されます。次の Python コードでは、dask を使用して 10000 x 10000 の配列を作成し、それを x 変数に格納します。

Python で大規模な機械学習データセットを処理する簡単な方法x 変数を呼び出すと、配列に関するさまざまな情報が生成されます。

配列の特定の要素を表示する

Python で大規模な機械学習データセットを処理する簡単な方法dask 配列に対して数学演算を実行する Python の例:

正如您所看到的,由于延迟执行,它不会向您显示输出。我们可以使用compute来显示输出:

Python で大規模な機械学習データセットを処理する簡単な方法

dask 数组支持大多数 NumPy 接口,如下所示:

  • 数学运算:+, *, exp, log, ...
  • sum(), mean(), std(), sum(axis=0), ...
  • 张量/点积/矩阵乘法:tensordot
  • 重新排序/转置:transpose
  • 切片:x[:100, 500:100:-2]
  • 使用列表或 NumPy 数组进行索引:x[:, [10, 1, 5]]
  • 线性代数:svd、qr、solve、solve_triangular、lstsq

但是,Dask Array 并没有实现完整 NumPy 接口。

你可以从他们的官方文档中了解更多关于 dask.arrays 的信息。

什么是Dask Persist?

假设您想对机器学习数据集执行一些耗时的操作,您可以将数据集持久化到内存中,从而使数学运算运行得更快。

从 dask.datasets 导入了时间序列数据

Python で大規模な機械学習データセットを処理する簡単な方法

让我们取数据集的一个子集并计算该子集的总行数。

Python で大規模な機械学習データセットを処理する簡単な方法

计算总行数需要 27 秒。

我们现在使用 persist 方法:

Python で大規模な機械学習データセットを処理する簡単な方法

持久化我们的子集总共花了 2 分钟,现在让我们计算总行数。

Python で大規模な機械学習データセットを処理する簡単な方法

同样,我们可以对持久化数据集执行其他操作以减少计算时间。

Python で大規模な機械学習データセットを処理する簡単な方法

persist应用场景:

  • 数据量大
  • 获取数据的一个子集
  • 对子集应用不同的操作

为什么选择 Dask ML?

Dask ML有助于在大型数据集上使用流行的Python机器学习库(如Scikit learn等)来应用ML(机器学习)算法。

什么时候应该使用 dask ML?

  • 数据不大(或适合 RAM),但训练的机器学习模型需要大量超参数,并且调优或集成技术需要大量时间。
  • 数据量很大。

Python で大規模な機械学習データセットを処理する簡単な方法

正如你所看到的,随着模型大小的增加,例如,制作一个具有大量超参数的复杂模型,它会引起计算边界的问题,而如果数据大小增加,它会引起内存分配错误。因此,在这两种情况下(红色阴影区域)我们都使用 Dask 来解决这些问题。

如官方文档中所述,dask ml 库用例:

  • 对于内存问题,只需使用 scikit-learn(或其他ML 库)。
  • 对于大型模型,使用 dask_ml.joblib 和scikit-learn estimators。
  • 对于大型数据集,使用 dask_ml estimators。

让我们看一下 Dask.distributed 的架构:

Python で大規模な機械学習データセットを処理する簡単な方法

Dask 让您能够在计算机集群上运行任务。在 dask.distributed 中,只要您分配任务,它就会立即开始执行。

简单地说,client就是提交任务的你,执行任务的是Worker,调度器则执行两者之间通信。

python -m <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span> distributed –upgrade
ログイン後にコピー

如果您使用的是单台机器,那么就可以通过以下方式创建一个具有4个worker的dask集群

Python で大規模な機械学習データセットを処理する簡単な方法

如果需要dashboard,可以安装bokeh,安装bokeh的命令如下:

<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">bokeh</span>
ログイン後にコピー

就像我们从 dask.distributed 创建客户端一样,我们也可以从 dask.distributed 创建调度程序。

要使用 dask ML 库,您必须使用以下命令安装它:

<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span>-ml
ログイン後にコピー

我们将使用 Scikit-learn 库来演示 dask-ml 。

Grid_Search メソッドを使用すると仮定すると、通常は次の Python コードを使用します。

Python で大規模な機械学習データセットを処理する簡単な方法

dask.distributed を使用してクラスターを作成します。

Python で大規模な機械学習データセットを処理する簡単な方法

クラスターを使用して scikit-learn モデルを適合させるには、joblib を使用するだけで済みます。

Python で大規模な機械学習データセットを処理する簡単な方法

以上がPython で大規模な機械学習データセットを処理する簡単な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート