このガイドでは、次のことについて学びます。
- 機械学習とは
- Webスクレイピングが機械学習に役立つ理由
- 機械学習用のスクレイピングを実行する方法
- スクレイピングデータで機械学習を行う方法
- スクレイピングデータを使用したMLモデルトレーニングプロセスの詳細
- 機械学習用にデータスクレイピングを行うためにETLを設定する方法
さっそく始めましょう!
機械学習とは
機械学習は「ML」としても知られ、データから学習できるシステムの構築に焦点を当てた人工知能(AI)のサブセクションです。機械学習をソフトウェアや計算システムに適用することでもたらされる特筆すべき革新として、MLの問題を解決するためにコンピュータを明示的にプログラムする必要がないことが挙げられます。これは、データから学習する機械学習システムのために可能となっています。
機械によるデータ学習の方法応用数学として捉えることにより、機械学習の理解がしやすくなることでしょう。実のところ、MLモデルには公開されている基礎データのパターンを識別することができるため、新しい入力データが公開された場合の出力が予測可能となります。
Webスクレイピングが機械学習に役立つ理由
機械学習システム(および他のあらゆるAIシステム)におけるモデルトレーニングにはデータが必要 と なるため、データ専門家にとってWebスクレイピングは好ましい機会となります。
Webスクレイピングが機械学習のために重要である理由は次のとおりです。
- 大規模なデータ収集:機械学習モデル(特に深層学習モデル)では、効果的なトレーニングのために膨大な量のデータが必要となります。Webスクレイピングにより、他では入手できない規模のデータセットの収集が可能となります。
- 多様で豊富なデータソース:機械学習モデルをトレーニングするためのデータをすでに所有している場合、ウェブでは多種多様なデータがホストされているため、Webスクレイピングはデータセットを拡大するチャンスとなります。
- 最新情報:所有するデータが最新のトレンドに合わせて更新されない場合、Webスクレイピングが役に立ちます。最新の情報(例:株価予測、 ニュース心理分析など)に依存するモデルの場合、Webスクレイピングを行うことにより、最新データフィードの利用が可能となります。
- モデルパフォーマンスの向上:作業モデルやプロジェクトによっては、手元のデータだけでは十分ではない場合があります。Webスクレイピングを使用したウェブデータの取得は、モデルのパフォーマンス向上、および検証目的におけるより多くのデータ取得につながります。
- 市場分析:レビューやコメント、評価のスクレイピングは、企業にとって価値のある消費者心理の理解に役立ちます。また、新たなトピックに関するデータ収集や、市場のトレンドや世論の予測にも役立ちます。
前提条件
このチュートリアルでは、Pythonで機械学習用のWebスクレイピングを実行する方法を学びます。
以下のPythonプロジェクトを再現するには、システムが次の前提条件を満たしている必要があります。
- Python 3.6以降:Python 3.6以降のすべてのバージョンに対応します。具体的には、3.4以降のPythonバージョンですでにインストールされている
pip
を介し、依存関係をインストールします。 - Jupyter Notebook 6.x:Jupyter Notebookを使用してデータを分析し、機械学習で予測を行います。6.x以降のすべてのバージョンに対応します。
- IDE: VS CODE やその他すべてのPython IDEに対応します。
機械学習用のスクレイピングを実行する方法
このステップ・バイ・ステップセクションでは、機械学習によるさらなる分析の対象となるデータを取得するため、Webスクレイピングプロジェクトを作成する方法を学びます。
Yahoo!ファイナンスをスクレイピング することにより、NVIDIAの株価を取得する方法を詳しく学ぶことができます。次に、取得したデータを機械学習に使用する方法を学びます。
ステップ#1:環境を設定する
まず、次のように、 data
、 notebooks
、および scripts
というサブフォルダを持つ scraping_project
という名前(例)のリポジトリを作成します。
場所:
data_retrieval.py
にはスクレイピングロジックが含まれます。analysis.ipynb
には機械学習ロジックが含まれます。data/
には、機械学習による分析を行うスクレイピングデータが含まれます。
venv/
フォルダには仮想環境が含まれます。次のように作成することができます。
アクティベートするには、Windowsで次を実行します。
macOS/Linuxでは、次を実行します。
これで、必要なライブラリをすべてインストールすることができるようになります。
ステップ#2:ターゲットページを定義する
NVIDIA履歴データを取得するには、次のURLにアクセスする必要があります。
ただし、ページにはデータの表示方法を定義するためのいくつかのフィルターが表示されます。
機械学習に必要な量のデータを取得するには、「5年」でフィルタリングを行います。すでに5年でデータのフィルタリングを行っている次のURLの使用が役立ちます。
このページでは、次の表をターゲットにして、そこからデータを取得する必要があります。
表を定義するCSSセレクターは .table
であるため、 data_retrieval.py
ファイルに次のコードを書くことができます。
この時点でコードは次のようなことを行います。
- Selenium Chromeドライバインスタンスを設定する
- ターゲットURLを定義し、そのURLにアクセスするようSeleniumに指示する
- 表がロードされるのを待つ(この場合、ターゲットの表はJavascriptによってロードされるため、表がロードされたことを確認するためにウェブドライバは20秒間待機します)
- 専用のCSSセレクターを使用して表全体をインターセプトする
ステップ#3:データを取得してCSVファイルに保存する
この時点で次の操作を実行することができます。
- 表からヘッダーを抽出する(これはそのままCSVファイルに追加されます)
- 表からすべてのデータを取得する
- データを Numpyデータフレームに変換する
これは次のコードで行うことができます。
ステップ#4:CSVファイルを data/
フォルダに保存する
作成したフォルダの構造から、 data_retrieval.py
ファイルが scripts/
フォルダにあることが思い出されるはずです。代わりにCVSファイルを data/
フォルダに保存する必要があるため、コードでこのことを考慮する必要があります。
このコードは、 os.path.dirname()
メソッドを使用して現在の(絶対)パスを決定し、 os.path.join()
メソッドで data/
フォルダに移動した後、 os.makedirs(data_dir, exist_ok=True)
メソッドで存在の確認を行い、 df.to_csv()
メソッドでPandasライブラリからデータをCSVファイルとして保存し、ドライバを終了します。
ステップ#5:完成
これが data_retrieval.py
ファイルの完全なコードです。
つまり、数行のコードだけで、NVIDIA株に関する5年間の履歴データを取得し、CSVファイルとして保存したことになります。
Windowsでは、次のコマンドで上記のスクリプトを起動します。
Linux/macOSの場合は次のとおりです。
スクレイピングした出力データは、次のように表示されます。
スクレイピングデータにおける機械学習の使用方法
データがCSVファイルとして保存されると、機械学習を使用した予測を行うことができます。
次のステップでその方法を見てみましょう。
ステップ#1:新しいJupyter Notebookファイルを作成する
新しいJupyter Notebookファイルを作成するには、メインフォルダから notebooks/
フォルダに移動します。
その後、Jupyter Notebookを次のように開きます。
ブラウザが開いたら、 新規 > Python3 (ipykernel) をクリックして、新しいJupyter Notebookファイルを作成します。
例として、ファイルの名前を analysis.ipynb
に変更します。
ステップ#2:CSVファイルを開き、ヘッドを表示する
これで、データを含むCSVファイルを開き、データフレームの先頭を表示できます。
このコードは csv_path = "../data/nvda_stock_data.csv"
で data/
フォルダに移動します。次に、 pd.read_csv()
メソッドを使用し、CSVをデータフレームとして開き、 df.head()
メソッドで先頭(最初の5行)を表示します。
この場合、期待される結果は次のとおりです。
ステップ#3:** Adj Close
値の経時的なトレンドを視覚化する
データフレームが正しくロードされたため、調整後の終値を表す Adj Close
値のトレンドを視覚化することができます。
このスニペットは次のことを行います。
df["Date"]
が、データフレームのDate
列にアクセスし、pd.to_datetime()
メソッドで日付が日付形式になっていることを確認する-
df.sort_values()
はDate
列の日付を並べ替える。これにより、データは時系列で表示されます。 plt.figure()
はプロットの次元を設定し、plt.plot()
はそれを表示する-
# Customize the plot
コメントの下のコード行から、タイトルや座標軸のラベルを指定し、凡例を表示することにより、プロットのカスタマイズが簡単に行えます -
plt.show()
メソッドは、実際にプロットを表示するためのメソッドです
期待される結果は次のようなものです。
このプロットは、NVIDIA株価の調整後終値の経時的なトレンドを示しています。トレーニングする機械学習モデルには、できる限りこれを正確に予測することが求められます。
ステップ#3:機械学習用データを準備する
機械学習用のデータを準備する時が来ました!
まず、データのクリーニングと準備を行います。
このコードは次のようなことを行います。
-
Volume
とOpen
の値をto_numeric()
メソッドに変換する -
interpolate()メソッドを使用して欠損値を補間し、埋める
-
MinMaxScaler()
を使用してデータをスケーリングする - ターゲット変数
Adj Close
をfit_transform()メソッドで選択して変換(スケーリング)する
ステップ#4:トレインおよびテストセットを作成する
このチュートリアルで使用するモデルは、RNN(回帰型ニューラルネットワーク)のLSTM(長短期記憶)であるため、データの学習のためにステップのシーケンスを作成します。
コード:
- 60の時間ステップのシーケンスを作成します。
X
は機能の配列であり、y
はターゲット値の配列です - 初期データフレームを次のように分割します:80%がトレインセット、20%がテストセット
ステップ#5:モデルをトレーニングする
これにより、トレインセットでRNNのトレーニングを行うことができるようになります。
このコードは次のようなことを行います。
- トレインセットとテストセットの両方について、
reshape()
メソッドを使用し、機能の配列を再形成してLSTMニューラルネットワークへの準備を行う - パラメータを設定してLSTMニューラルネットワークを構築する
-
fit()メソッドを使用してLSTMをトレインセットに当てはめる
これにより、モデルがトレインセットに適合され、予測を行う準備が整いました。
ステップ#6:予測を行い、モデルのパフォーマンスを評価する
これにより、モデルが Adj Close
値を予測する準備が整うため、パフォーマンスを次のように評価することができます。
このコードは次のようなことを行います。
- 横軸の値を逆にして、最新データを時系列順に表示できるようにする。これは、
inverse_transform()
メソッドを使用して行われます。 - 平均二乗誤差 と R^2スコアを使用してモデルを評価する。
MLモデルの確率的性質により発生する可能性のある統計的誤差を考慮すると、期待される結果は次のようになります。
これらは比較的良好な値であり、選択したモデルの機能を考慮したとき、 Adj Close
が予測に適していることを示しています。
ステップ#7:実際の値と予測値をプロットで比較する
機械学習に際しては、前のステップで行ったように結果を分析的に比較するだけでは不十分な場合があります。選択したモデルが適切となる可能性を高めるための一般的な解決策は、プロットの作成も行うことです。
例えば、一般的な解決策として、 Adj Close
の実際の値をLSTMモデルにより予測された値と比較するプロットの作成が挙げられます。
コード:
- テストセットのレベルで実際の値と予測値の比較を設定するため、実際の値をテストセットの形状に合わせてトリミングする必要があります。これは、
iloc()
とflatten()
のメソッドにより行います。 - プロットの作成、座標軸へのラベルとタイトルの追加、およびその他設定の管理により視覚化の改善を行います。
期待される結果は次のようなものです。
プロットが示すように、LSTMニューラルネットワークによって予測された値(黄色の点線)は、実際の値(青の連続線)をかなり正確に予測します。この場合、分析結果が良好であったことを示していますが、プロットが結果の視覚化に役立つことがわかります。
ステップ#8:完成
analysis.ipynb
ノートブックの完全なコードは、次のとおりです。
このコードは、データフレームを開くときに先頭を示す部分をスキップし、 Adj Close
の実際の値のみをプロットするため、全体が直接ゴールに向かいます。
これらの手順は、予備的なデータ分析の一環としてこの段落の冒頭で報告されたものであり、実際にMLモデルをトレーニングする前に、データに対し行われることを理解するのに役立ちます。
注:コードは個別に提示されていますが、MLの確率的性質を考慮し、コード全体をまとめて実行してLSTMモデルの適切なトレーニング、および検証を行うことが推奨されます。これを行わないと、最終的なプロットが大きく異なってしまう可能性があります。
スクレイピングデータを使用したMLモデルトレーニングプロセスについての注記
内容を簡潔にするため、この記事で提供されているステップ・バイ・ステップガイドでは、LSTMニューラルネットワークのフィッティングについて直接説明しています。
実際、MLモデルではこのようなことは起こりません。MLモデルを必要とする問題を解決しようとする場合、プロセスは次のようになります。
- 予備的データ分析:これはプロセスの中で最も重要な部分であり、所有するデータの理解や、NaN値を削除することによるデータクリーニング、最終的な重複箇所の管理、および所有データに関連する他の数学的な問題の解決などが実現します。
- MLモデルのトレーニング:最初に思いついたモデルが、MLでの問題解決に最適であるかどうかはわかりません。一般的な解決策は、いわゆる スポットチェック を実行することです。これは次のことを意味します。
- トレインセットで3~4のMLモデルのトレーニングを行い、パフォーマンスを評価する。
- トレインセットで最高のパフォーマンスを発揮した2~3のMLモデルを取得し、 それらのハイパーパラメータを調整する。
- 最も優れたいくつかのモデルのパフォーマンスを、テストセットで調整したハイパーパラメータで比較する。
- テストセットで最高のパフォーマンスを発揮したモデルを選択する。
- デプロイ:最高のパフォーマンスを発揮したモデルが、本番環境にてデプロイされます。
機械学習用にデータをスクレイピングするためのETLの設定
この記事の冒頭では、Webスクレイピングが機械学習に役立つ理由について説明しました。しかし、Webスクレイピングにより取得されたデータがCSVファイルに保存されている、という事実に依存して開発されたプロジェクトには、一貫性がないことにお気づきになられたかもしれません。
これは機械学習では一般的な方法ですが、ターゲット値の将来値を予測するのに最適なモデルを見つけることが目的である場合、MLプロジェクトの開始時に行われるべきです。
最も優れたモデルが見つかったら、次はウェブから新しいデータを取得し、クリーンアップしてデータベースにロードするため、 ETL(抽出、変換、ロード)パイプライン を設定します。
このプロセスは次のようなものになります。
- 抽出:このフェーズでは、Webスクレイピングをはじめとし、さまざまなソースからデータの取得を行います
- 変換:収集されたデータは、データのクリーニングと準備のプロセスを経ます
- ロード:取得および変換されたデータは処理され、データベースまたはデータウェアハウスに保存されます
データが保存されたら、次のフェーズで機械学習ワークフローとの統合が行われ、新しいデータによるモデルの再トレーニング、再検証などの処理が行われます。
まとめ
今回の記事では、スクレイピングを使用してウェブからデータを取得する方法と、それらを機械学習に使用する方法について学びました。また、機械学習におけるWebスクレイピングの重要性や、ETLのトレーニングおよび構造化のプロセスについても説明しました。
紹介したプロジェクトは簡単な事例ではあるものの、基盤となるプロセス(特に、MLモデルを改善するために継続的にウェブデータを取得してETLを構築するプロセスなど)がさらなる分析を要するため、難解な面もあるといえるでしょう。
Yahoo!ファイナンスでの実際のスクレイピングは、ここに示した内容よりもはるかに複雑となる場合があります。このサイトはいくつかのアンチスクレイピング技術を採用しているため、特に注意が必要となります。プロフェッショナルでフル機能のオール・イン・ワンソリューションについては、 Bright DataのYahoo!ファイナンススクレイパーをご覧ください!
また、機械学習プロジェクト用にデータが必要でありながら、スクレイピングが苦手な場合は、 AIおよび機械学習のニーズに合わせてカスタマイズされた効率的なデータ検索ソリューションをご覧ください。
今すぐ無料のBright Dataアカウントを作成し、当社のスクレイパーAPIを試したり、データセットについて学んだりしましょう。