機械学習用にWebスクレイピングを使用する方法

ETLの設定やモデルトレーニングのヒントなど、機械学習のプロジェクトでWebスクレイピングデータを収集、準備、および使用する方法を学びましょう。
10 min read
How to Use Web Scraping for Machine Learning blog image

このガイドでは、次のことについて学びます。

  • 機械学習とは
  • 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という名前(例)のリポジトリを作成します。

scraping_project/
├── data/
│   └── ...
├── notebooks/
│   └── analysis.ipynb
├── scripts/
│   └── data_retrieval.py
└── venv/

場所:

  • data_retrieval.py にはスクレイピングロジックが含まれます。
  • analysis.ipynb には機械学習ロジックが含まれます。
  • data/ には、機械学習による分析を行うスクレイピングデータが含まれます。

 venv/ フォルダには仮想環境が含まれます。次のように作成することができます。

python3 -m venv venv 

アクティベートするには、Windowsで次を実行します。

venv\Scripts\activate

macOS/Linuxでは、次を実行します。

source venv/bin/activate

これで、必要なライブラリをすべてインストールすることができるようになります。

pip install selenium requests pandas matplotlib scikit-learn tensorflow notebook

ステップ#2:ターゲットページを定義する

NVIDIA履歴データを取得するには、次のURLにアクセスする必要があります。

https://finance.yahoo.com/quote/NVDA/history/

ただし、ページにはデータの表示方法を定義するためのいくつかのフィルターが表示されます。

データの表示方法を定義するためのフィルター

機械学習に必要な量のデータを取得するには、「5年」でフィルタリングを行います。すでに5年でデータのフィルタリングを行っている次のURLの使用が役立ちます。

https://finance.yahoo.com/quote/NVDA/history/?frequency=1d&period1=1574082848&period2=1731931014

このページでは、次の表をターゲットにして、そこからデータを取得する必要があります。

始値や終値、安値、高値などの日次財務データを含む表

表を定義するCSSセレクターは .table であるため、 data_retrieval.py ファイルに次のコードを書くことができます。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common import NoSuchElementException
import pandas as pd
import os

# Configure Selenium
driver = webdriver.Chrome(service=Service())

# Target URL
url = "https://finance.yahoo.com/quote/NVDA/history/?frequency=1d&period1=1574082848&period2=1731931014"
driver.get(url)

# Wait for the table to load
try:
    WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, ".table"))
    )
except NoSuchElementException:
    print("The table was not found, verify the HTML structure.")
    driver.quit()
    exit()

# Locate the table and extract its rows
table = driver.find_element(By.CSS_SELECTOR, ".table")
rows = table.find_elements(By.TAG_NAME, "tr")

この時点でコードは次のようなことを行います。

  • Selenium Chromeドライバインスタンスを設定する
  • ターゲットURLを定義し、そのURLにアクセスするようSeleniumに指示する
  • 表がロードされるのを待つ(この場合、ターゲットの表はJavascriptによってロードされるため、表がロードされたことを確認するためにウェブドライバは20秒間待機します)
  • 専用のCSSセレクターを使用して表全体をインターセプトする

ステップ#3:データを取得してCSVファイルに保存する

この時点で次の操作を実行することができます。

  1. 表からヘッダーを抽出する(これはそのままCSVファイルに追加されます)
  2. 表からすべてのデータを取得する
  3. データを Numpyデータフレームに変換する

これは次のコードで行うことができます。

# Extract headers from the first row of the table
headers = [header.text for header in rows[0].find_elements(By.TAG_NAME, "th")]

# Extract data from the subsequent rows
data = []
for row in rows[1:]:
    cols = [col.text for col in row.find_elements(By.TAG_NAME, "td")]
    if cols:
        data.append(cols)

# Convert data into a pandas DataFrame
df = pd.DataFrame(data, columns=headers)

ステップ#4:CSVファイルを data/ フォルダに保存する

作成したフォルダの構造から、 data_retrieval.py ファイルが scripts/ フォルダにあることが思い出されるはずです。代わりにCVSファイルを data/ フォルダに保存する必要があるため、コードでこのことを考慮する必要があります。

# Determine the path to save the CSV file
current_dir = os.path.dirname(os.path.abspath(__file__))  

# Navigate to the "data/" directory
data_dir = os.path.join(current_dir, "../data") 

# Ensure the directory exists 
os.makedirs(data_dir, exist_ok=True)  

# Full path to the CSV file
csv_path = os.path.join(data_dir, "nvda_stock_data.csv")  

# Save the DataFrame to the CSV file
df.to_csv(csv_path, index=False)
print(f"Historical stock data saved to {csv_path}")

# Close the WebDriver
driver.quit()

このコードは、 os.path.dirname()メソッドを使用して現在の(絶対)パスを決定し、 os.path.join()メソッドで data/ フォルダに移動した後、 os.makedirs(data_dir, exist_ok=True)メソッドで存在の確認を行い、 df.to_csv() メソッドでPandasライブラリからデータをCSVファイルとして保存し、ドライバを終了します。

ステップ#5:完成

これが data_retrieval.py ファイルの完全なコードです。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common import NoSuchElementException
import pandas as pd
import os

# Configure Selenium
driver = webdriver.Chrome(service=Service())

# Target URL
url = "https://finance.yahoo.com/quote/NVDA/history/?frequency=1d&period1=1574082848&period2=1731931014"
driver.get(url)

# Wait for the table to load
try:
    WebDriverWait(driver, 5).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "table.table.yf-j5d1ld.noDl"))
    )
except NoSuchElementException:
    print("The table was not found, verify the HTML structure.")
    driver.quit()
    exit()

# Locate the table and extract its rows
table = driver.find_element(By.CSS_SELECTOR, ".table")
rows = table.find_elements(By.TAG_NAME, "tr")

# Extract headers from the first row of the table
headers = [header.text for header in rows[0].find_elements(By.TAG_NAME, "th")]

# Extract data from the subsequent rows
data = []
for row in rows[1:]:
    cols = [col.text for col in row.find_elements(By.TAG_NAME, "td")]
    if cols:
        data.append(cols)

# Convert data into a pandas DataFrame
df = pd.DataFrame(data, columns=headers)

# Determine the path to save the CSV file
current_dir = os.path.dirname(os.path.abspath(__file__))  

# Navigate to the "data/" directory
data_dir = os.path.join(current_dir, "../data") 

# Ensure the directory exists 
os.makedirs(data_dir, exist_ok=True)

# Full path to the CSV file  
csv_path = os.path.join(data_dir, "nvda_stock_data.csv")

# Save the DataFrame to the CSV file
df.to_csv(csv_path, index=False)
print(f"Historical stock data saved to {csv_path}")

# Close the WebDriver
driver.quit()

つまり、数行のコードだけで、NVIDIA株に関する5年間の履歴データを取得し、CSVファイルとして保存したことになります。

Windowsでは、次のコマンドで上記のスクリプトを起動します。

python data_retrieval.py

Linux/macOSの場合は次のとおりです。

python3 data_retrieval.py

スクレイピングした出力データは、次のように表示されます。

スクレイピングした表の出力

スクレイピングデータにおける機械学習の使用方法

データがCSVファイルとして保存されると、機械学習を使用した予測を行うことができます。

次のステップでその方法を見てみましょう。

ステップ#1:新しいJupyter Notebookファイルを作成する

新しいJupyter Notebookファイルを作成するには、メインフォルダから notebooks/ フォルダに移動します。

cd notebooks 

その後、Jupyter Notebookを次のように開きます。

jupyter notebook

ブラウザが開いたら、 新規 > Python3 (ipykernel) をクリックして、新しいJupyter Notebookファイルを作成します。

新しいJupyter Notebookファイルを作成する

例として、ファイルの名前を analysis.ipynbに変更します。

ステップ#2:CSVファイルを開き、ヘッドを表示する

これで、データを含むCSVファイルを開き、データフレームの先頭を表示できます。

import pandas as pd

# Path to the CSV file
csv_path = "../data/nvda_stock_data.csv"

# Open the CVS file
df = pd.read_csv(csv_path)

# Show head
df.head()

このコードは csv_path = "../data/nvda_stock_data.csv"で data/ フォルダに移動します。次に、 pd.read_csv() メソッドを使用し、CSVをデータフレームとして開き、 df.head()メソッドで先頭(最初の5行)を表示します。

この場合、期待される結果は次のとおりです。

期待される結果

ステップ#3:** Adj Close 値の経時的なトレンドを視覚化する

データフレームが正しくロードされたため、調整後の終値を表す Adj Close 値のトレンドを視覚化することができます。

import matplotlib.pyplot as plt

# Ensure the "Date" column is in datetime forma
df["Date"] = pd.to_datetime(df["Date"])

# Sort the data by date (if not already sorted)
df = df.sort_values(by="Date")

# Plot the "Adj Close" values over time
plt.figure(figsize=(10, 6))
plt.plot(df["Date"], df["Adj Close"], label="Adj Close", linewidth=2)

# Customize the plot
plt.title("NVDA Stock Adjusted Close Prices Over Time", fontsize=16) # Sets title
plt.xlabel("Date", fontsize=12) # Sets x-axis label
plt.ylabel("Adjusted Close Price (USD)", fontsize=12) # Sets y-axis label
plt.grid(True, linestyle="--", alpha=0.6) # Defines styles of the line
plt.legend(fontsize=12) # Shows legend
plt.tight_layout()

# Show the plot
plt.show()

このスニペットは次のことを行います。

  • df["Date"] が、データフレームの Date 列にアクセスし、 pd.to_datetime()メソッドで日付が日付形式になっていることを確認する
  •  df.sort_values() は Date 列の日付を並べ替える。これにより、データは時系列で表示されます。
  • plt.figure() はプロットの次元を設定し、 plt.plot() はそれを表示する
  •  # Customize the plot コメントの下のコード行から、タイトルや座標軸のラベルを指定し、凡例を表示することにより、プロットのカスタマイズが簡単に行えます
  •  plt.show() メソッドは、実際にプロットを表示するためのメソッドです

期待される結果は次のようなものです。

NVDA株の調整後終値の経時的な例

このプロットは、NVIDIA株価の調整後終値の経時的なトレンドを示しています。トレーニングする機械学習モデルには、できる限りこれを正確に予測することが求められます。

ステップ#3:機械学習用データを準備する

機械学習用のデータを準備する時が来ました!

まず、データのクリーニングと準備を行います。

from sklearn.preprocessing import MinMaxScaler

# Convert data types
df["Volume"] = pd.to_numeric(df["Volume"].str.replace(",", ""), errors="coerce")
df["Open"] = pd.to_numeric(df["Open"].str.replace(",", ""), errors="coerce")

# Handle missing values 
df = df.infer_objects().interpolate() 

# Select the target variable ("Adj Close") and scale the data
scaler = MinMaxScaler(feature_range=(0, 1))  # Scale data between 0 and 1
data = scaler.fit_transform(df[["Adj Close"]])

このコードは次のようなことを行います。

  •  Volume と Open の値を to_numeric()メソッドに変換する
  •  interpolate()メソッドを使用して欠損値を補間し、埋める
  •  MinMaxScaler()を使用してデータをスケーリングする
  • ターゲット変数 Adj Close を fit_transform()メソッドで選択して変換(スケーリング)する

ステップ#4:トレインおよびテストセットを作成する

このチュートリアルで使用するモデルは、RNN(回帰型ニューラルネットワーク)のLSTM(長短期記憶)であるため、データの学習のためにステップのシーケンスを作成します。

import numpy as np

# Create sequences of 60 time steps for prediction
sequence_length = 60
X, y = [], []

for i in range(sequence_length, len(data)):
    X.append(data[i - sequence_length:i, 0])  # Last 60 days
    y.append(data[i, 0])  # Target value

X, y = np.array(X), np.array(y)

# Split into training and test sets
split_index = int(len(X) * 0.8)  # 80% training, 20% testing
X_train, X_test = X[:split_index], X[split_index:]
y_train, y_test = y[:split_index], y[split_index:]

コード:

  • 60の時間ステップのシーケンスを作成します。 X は機能の配列であり、 y はターゲット値の配列です
  • 初期データフレームを次のように分割します:80%がトレインセット、20%がテストセット

ステップ#5:モデルをトレーニングする

これにより、トレインセットでRNNのトレーニングを行うことができるようになります。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Reshape X for LSTM [samples, time steps, features]
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))

# Build the Sequential Neural Network
model = Sequential()
model.add(LSTM(32, activation="relu", return_sequences=False))
model.add(Dense(1))
model.compile(loss="mean_squared_error", optimizer="adam")

# Train the Model
history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test), verbose=1)

このコードは次のようなことを行います。

  • トレインセットとテストセットの両方について、 reshape()メソッドを使用し、機能の配列を再形成してLSTMニューラルネットワークへの準備を行う
  • パラメータを設定してLSTMニューラルネットワークを構築する
  •  fit()メソッドを使用してLSTMをトレインセットに当てはめる

これにより、モデルがトレインセットに適合され、予測を行う準備が整いました。

ステップ#6:予測を行い、モデルのパフォーマンスを評価する

これにより、モデルが Adj Close 値を予測する準備が整うため、パフォーマンスを次のように評価することができます。

from sklearn.metrics import mean_squared_error, r2_score

# Make Predictions
y_pred = model.predict(X_test)

# Inverse scale predictions and actual values for comparison
y_test = scaler.inverse_transform(y_test.reshape(-1, 1))
y_pred = scaler.inverse_transform(y_pred)

# Evaluate the Model
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# print results
print("\nLSTM Neural Network Results:")
print(f"Mean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")

このコードは次のようなことを行います。

  • 横軸の値を逆にして、最新データを時系列順に表示できるようにする。これは、 inverse_transform()メソッドを使用して行われます。
  •  平均二乗誤差 と R^2スコアを使用してモデルを評価する。

MLモデルの確率的性質により発生する可能性のある統計的誤差を考慮すると、期待される結果は次のようになります。

統計的誤差を考慮した予想結果

これらは比較的良好な値であり、選択したモデルの機能を考慮したとき、 Adj Closeが予測に適していることを示しています。

ステップ#7:実際の値と予測値をプロットで比較する

機械学習に際しては、前のステップで行ったように結果を分析的に比較するだけでは不十分な場合があります。選択したモデルが適切となる可能性を高めるための一般的な解決策は、プロットの作成も行うことです。

例えば、一般的な解決策として、 Adj Close の実際の値をLSTMモデルにより予測された値と比較するプロットの作成が挙げられます。

# Visualize the Results
test_results = pd.DataFrame({
    "Date": df["Date"].iloc[len(df) - len(y_test):],  # Test set dates
    "Actual": y_test.flatten(),
    "Predicted": y_pred.flatten()
})

# Setting plot
plt.figure(figsize=(12, 6))
plt.plot(test_results["Date"], test_results["Actual"], label="Actual Adjusted Close", color="blue", linewidth=2)
plt.plot(test_results["Date"], test_results["Predicted"], label="Predicted Adjusted Close", color="orange", linestyle="--", linewidth=2)
plt.title("Actual vs Predicted Adjusted Close Prices (LSTM)", fontsize=16)
plt.xlabel("Date", fontsize=12)
plt.ylabel("Adjusted Close Price (USD)", fontsize=12)
plt.legend()
plt.grid(alpha=0.6)
plt.tight_layout()
plt.show()

コード:

  • テストセットのレベルで実際の値と予測値の比較を設定するため、実際の値をテストセットの形状に合わせてトリミングする必要があります。これは、 iloc() と flatten()のメソッドにより行います。
  • プロットの作成、座標軸へのラベルとタイトルの追加、およびその他設定の管理により視覚化の改善を行います。

期待される結果は次のようなものです。

実際の調整後終値と予測終値の比較

プロットが示すように、LSTMニューラルネットワークによって予測された値(黄色の点線)は、実際の値(青の連続線)をかなり正確に予測します。この場合、分析結果が良好であったことを示していますが、プロットが結果の視覚化に役立つことがわかります。

ステップ#8:完成

 analysis.ipynb ノートブックの完全なコードは、次のとおりです。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, r2_score
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Path to the CSV file
csv_path = "../data/nvda_stock_data.csv"  
# Open CSV as data frame
df = pd.read_csv(csv_path)

# Convert "Date" to datetime format
df["Date"] = pd.to_datetime(df["Date"])

# Sort by date
df = df.sort_values(by="Date")

# Convert data types
df["Volume"] = pd.to_numeric(df["Volume"].str.replace(",", ""), errors="coerce")
df["Open"] = pd.to_numeric(df["Open"].str.replace(",", ""), errors="coerce")

# Handle missing values 
df = df.infer_objects().interpolate()

# Select the target variable ("Adj Close") and scale the data
scaler = MinMaxScaler(feature_range=(0, 1))  # Scale data between 0 and 1
data = scaler.fit_transform(df[["Adj Close"]])

# Prepare the Data for LSTM
# Create sequences of 60 time steps for prediction
sequence_length = 60
X, y = [], []

for i in range(sequence_length, len(data)):
    X.append(data[i - sequence_length:i, 0])  # Last 60 days
    y.append(data[i, 0])  # Target value

X, y = np.array(X), np.array(y)

# Split into training and test sets
split_index = int(len(X) * 0.8)  # 80% training, 20% testing
X_train, X_test = X[:split_index], X[split_index:]
y_train, y_test = y[:split_index], y[split_index:]

# Reshape X for LSTM [samples, time steps, features]
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))

# Build the Sequential Neural Network
model = Sequential()
model.add(LSTM(32, activation="relu", return_sequences=False))
model.add(Dense(1))
model.compile(loss="mean_squared_error", optimizer="adam")

# Train the Model
history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test), verbose=1)

# Make Predictions
y_pred = model.predict(X_test)

# Inverse scale predictions and actual values for comparison
y_test = scaler.inverse_transform(y_test.reshape(-1, 1))
y_pred = scaler.inverse_transform(y_pred)

# Evaluate the Model
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# Print results
print("\nLSTM Neural Network Results:")
print(f"Mean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")

# Visualize the Results
test_results = pd.DataFrame({
    "Date": df["Date"].iloc[len(df) - len(y_test):],  # Test set dates
    "Actual": y_test.flatten(),
    "Predicted": y_pred.flatten()
})

# Setting plot
plt.figure(figsize=(12, 6))
plt.plot(test_results["Date"], test_results["Actual"], label="Actual Adjusted Close", color="blue", linewidth=2)
plt.plot(test_results["Date"], test_results["Predicted"], label="Predicted Adjusted Close", color="orange", linestyle="--", linewidth=2)
plt.title("Actual vs Predicted Adjusted Close Prices (LSTM)", fontsize=16)
plt.xlabel("Date", fontsize=12)
plt.ylabel("Adjusted Close Price (USD)", fontsize=12)
plt.legend()
plt.grid(alpha=0.6)
plt.tight_layout()
plt.show()

このコードは、データフレームを開くときに先頭を示す部分をスキップし、 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を試したり、データセットについて学んだりしましょう。

クレジットカードは必要ありません