お問い合わせ
7 分で読むことができます。

【TensorFlow】医療費予測モデルの作成

執筆者 橋口 更新日時 2024年6月13日

はじめに

以前こちらの記事で、AWS SageMaker Canvas という AutoMLツールを使って、医療費の予測モデルを作成しました。本記事は、(自分の勉強用に)この回帰モデルをコーディングで作ってみようという主旨です。また、こちらの記事で、TensorFlow Playground を使用したので、ライブラリも TensorFlow を使おうと思います。

学習に使用するデータは CSV で、カラムの構成は以下になっています。

  • age: 主たる受取人の年齢
  • sex: 保険契約者の性別
  • bmi: BMI指数。身長に対する体重の相対的な高低。
  • children: 健康保険に加入している子供の数/扶養家族の数
  • smoker: 喫煙
  • region: 米国内の受給者の居住地域(北東部、南東部、南西部、北西部)
  • charges: 健康保険から請求された個々の医療費

これらのデータを使用して、回帰モデルを TensorFlow を使用して作成します。

モデル作成

1. ライブラリのインストールとインポート

まず、必要なライブラリをインストールし、インポートします。

pip install pandas scikit-learn tensorflow

次に、Pythonスクリプトで必要なライブラリをインポートします。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.metrics import mean_absolute_error, mean_squared_error

2. データの準備

データを読み込み、データを特徴量(X)とターゲット(y)に分割、カテゴリカルデータのエンコードと数値データの標準化を行い、データを学習用とテスト用に分割します。

# データの読み込み
data = pd.read_csv('insurance_data.csv')

# 特徴量とターゲットの分割
X = data.drop('charges', axis=1)
y = data['charges']

# カテゴリカルデータのエンコードと数値データの標準化
categorical_features = ['sex', 'smoker', 'region']
numeric_features = ['age', 'bmi', 'children']

preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(), categorical_features)
    ])

# データの前処理
X_processed = preprocessor.fit_transform(X)

# トレーニングデータとテストデータの分割
X_train, X_test, y_train, y_test = train_test_split(X_processed, y, test_size=0.2, random_state=42)
  • 特徴量とターゲットの分割:
    • charges 列が予測対象(ターゲット)となるため、これを y として分離し、他の列を特徴量 X として扱います。
  • カテゴリカルデータのエンコード:
    • categorical_features に指定された列(sex, smoker, region)はカテゴリカルデータです。これらは数値データではないため、モデルが直接利用できません。
    • OneHotEncoder を使用してカテゴリカルデータをバイナリ(0または1)に変換します。この手法により、カテゴリカルデータを数値データとしてモデルに提供できます。
  • 数値データの標準化:
    • numeric_features に指定された列(age, bmi, children)は数値データです。これらのデータはスケールが異なることが多いため、モデルが効率的に学習するためにはスケーリングが必要です。
    • StandardScaler を使用して標準化を行います。標準化は、各特徴量を平均0、標準偏差1にスケーリングします。これにより、すべての数値データが同じスケールで扱われ、モデルの学習が安定します。
  • データの前処理:
    • ColumnTransformer を使用して、数値データの標準化とカテゴリカルデータのエンコードを一度に処理します。これにより、前処理のステップを簡潔に行うことができます。
  • トレーニングデータとテストデータの分割:
    • データセットをトレーニングデータとテストデータに分割することにより、モデルの性能を評価するための新しいデータセットを保持します。
    • train_test_split を使用して、データを80%のトレーニングデータと20%のテストデータに分割します。random_state=42 を指定することで、分割の再現性を確保します。

3. モデルの構築

TensorFlowを使用してシーケンシャルモデルを構築します。

# モデルの構築
model = Sequential([
    Dense(64, activation='relu', input_shape=(X_train.shape[1])),  # 入力層と第1隠れ層
    Dense(64, activation='relu'),  # 第2隠れ層
    Dense(1)  # 出力層
])
  • Sequential: モデルの各層が順に積み重なっていく単純なスタックモデルを定義するためのクラス。
  • Dense: 全結合層。ユニット数と活性化関数を指定。各ニューロンが前の層のすべてのニューロンと接続されていることを示します。
    • 64: ユニットの数。この場合、64個のユニットを持つ全結合層を追加します。(ここでは64)は層の出力の次元を指定。
    • activation='relu': 活性化関数としてReLUを使用します。
    • input_shape=(X_train.shape[1]): 最初の層にのみ必要で、入力データの形状を指定。
      ここでは、トレーニングデータ
      X_train の特徴量の数を指定しています。
  • 出力層: 出力層には活性化関数を指定していません。通常、回帰問題では出力層の活性化関数は使用しません。

4. モデルのコンパイル

モデルをコンパイルします。

# モデルのコンパイル
model.compile(optimizer='adam', loss='mean_squared_error')
  • optimizer='adam': モデルの重みを最適化するためのアルゴリズム(ここではAdamオプティマイザーを使用)。
  • loss='mean_squared_error': モデルがどれだけ悪いかを定量化するための損失関数(ここでは平均二乗誤差(MSE)を使用)。

5. モデルのトレーニング

トレーニングデータを使用してモデルをトレーニングします。

# モデルのトレーニング
history = model.fit(X_train, y_train, epochs=100, validation_split=0.2, batch_size=32)
  • model.fit: モデルのトレーニングを行うメソッドです。このメソッドを呼び出すことで、モデルは指定されたデータで学習を開始します。
    • epochs: トレーニングデータ全体を何回繰り返すかを指定。
    • validation_split: トレーニングデータの一部を検証データとして使用する割合を指定(ここでは20%)。
    • batch_size: 1エポックでトレーニングに使用するデータのサブセットのサイズを指定。

6. トレーニング過程の確認

トレーニング過程をプロットし、トレーニング中のモデルパフォーマンスを確認します。

# トレーニング過程のプロット
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend(loc='lower right')
plt.show()

Matplotlib に関しては割愛します。結果は以下の通り。

横軸はエポック数(Epoch)、縦軸は損失(Loss)を表しています。青い線はトレーニングデータに対する損失、オレンジの線は検証データに対する損失を示しています。

損失がエポック数が増えるにつれて安定していることから、モデルの学習が収束していることがわかります。つまり、これ以上学習を続けても損失の減少が期待できない状態に達しています。

7. モデルの評価

テストデータを使用してモデルの予測を行い、評価指標を計算します。

# テストデータでの予測
y_pred = model.predict(X_test)

# モデルの評価
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = mean_squared_error(y_test, y_pred, squared=False)

print(f'MAE: {mae}')
print(f'MSE: {mse}')
print(f'RMSE: {rmse}')
  • model.predict(X_test): トレーニング済みのモデルを使って、テストデータ (X_test) に対する予測を行う関数です。この関数は、テストデータに基づいてモデルが予測した値を返します。
    • mean_absolute_error(y_test, y_pred): 平均絶対誤差(MAE)を計算します。これは、予測値と実際の値の差の絶対値の平均です。MAEが小さいほど、予測の精度が高いことを示します。
    • mean_squared_error(y_test, y_pred): 平均二乗誤差(MSE)を計算します。これは、予測値と実際の値の差の二乗の平均です。MSEが小さいほど、予測の精度が高いことを示します。
    • mean_squared_error(y_test, y_pred, squared=False): 平方根平均二乗誤差(RMSE)を計算します。これは、MSEの平方根を取ったものです。RMSEが小さいほど、予測の精度が高いことを示します。

結果ですが、以下が出力されました。

MAE: 4060.9136578962225

MSE: 32895051.458825566

RMSE: 5735.4207743482575

ちなみに AWS SageMaker Canvas の結果は以下でした。

MAE: -

MSE: 23578592.000

RMSE: 4855.799

どちらも良い結果ではないですが、比較では Canvas の方が良い結果となりました。

まとめ

以上の手順で、医療費(Charges)の予測モデルを作成しました。評価を見るに、まだ改善の余地はありますが、回帰モデルを TensorFlow を使って作成することができました。Canvas の方が良い結果となりましたが、TensorFlow(ニューラルネットワーク)でなく他の手法を使うなどすればまた変わってくると思うのでまた試してみたいと思います。

Canvas については GUI ベースの使いやすい AutoMLツールであるので、興味があれば使ってみてください。

Topics: AI 機械学習 TensorFlow
9 分で読むことができます。

【TensorFlow】 画像分類モデルの作成

執筆者 橋口 更新日時 2024年6月12日

はじめに

以前こちらの記事で、Google Teachable Machine という AutoMLツールを使って、顔写真の表情分類モデルを作成しました。本記事は、(自分の勉強用に)この分類モデルをコーディングで作ってみようという主旨です。また、こちらの記事で、TensorFlow Playground を使用したので、ライブラリも TensorFlow を使おうと思います。

学習に使用する画像は 48x48 の JPEG形式で、Happy, Angry, Sad, Surprise のフォルダに分かれており、それぞれのフォルダには以下の枚数の画像が含まれています。

  •  Happy: 7215枚
  •  Angry: 3995枚
  •  Sad: 4830枚 
  •  Surprise: 3171枚 

これらの画像を使用して、感情分類モデルを TensorFlow を使用して作成します。

モデル作成

1. ライブラリのインストールとインポート

まず、必要なライブラリをインストールし、インポートします。

pip install tensorflow matplotlib

次に、Pythonスクリプトで必要なライブラリをインポートします。

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt

2. データの準備

データジェネレータを使用して、トレーニングデータとテストデータを準備します。

# データジェネレータの設定
train_datagen = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    validation_split=0.2  # トレーニングデータの20%を検証データとして使用
)
  • ImageDataGenerator: 画像データの前処理やデータオーグメンテーションを行うためのクラスです。
  • train_datagen: トレーニングデータの前処理とデータオーグメンテーションを設定します。
    • rescale=1./255: 画像のピクセル値を0-255から0-1に正規化します。
    • shear_range=0.2: 画像をランダムに傾けます。
    • zoom_range=0.2: 画像をランダムにズームします。
    • horizontal_flip=True: 画像をランダムに水平反転します。
    • validation_split=0.2: トレーニングデータの20%を検証データとして使用します。
  • test_datagen: テストデータの前処理を設定します。
    • rescale=1./255: 画像のピクセル値を0-255から0-1に正規化します。
# トレーニングデータのジェネレータ
train_generator = train_datagen.flow_from_directory(
    'emotional/train',
    target_size=(48, 48),  # 画像のサイズを48x48に設定
    color_mode='grayscale',  # グレースケール画像として読み込む
    batch_size=16,  # バッチサイズを16に設定
    class_mode='categorical',
    subset='training'  # トレーニングデータ
)

# 検証データのジェネレータ
validation_generator = train_datagen.flow_from_directory(
    'emotional/train',
    target_size=(48, 48),  # 画像のサイズを48x48に設定
    color_mode='grayscale',  # グレースケール画像として読み込む
    batch_size=16,  # バッチサイズを16に設定
    class_mode='categorical',
    subset='validation'  # 検証データ
)
  • flow_from_directory: ディレクトリから画像を読み込み、前処理を行い、バッチ単位でデータを生成します。
    • 'emotional/train': トレーニングデータが格納されているディレクトリのパス。
    • target_size=(48, 48): すべての画像を48x48ピクセルにリサイズします。
    • batch_size=16: 1バッチあたりの画像の数を16に設定します。(Google Teachable Machineの設定に合わせました)
    • class_mode='categorical': 出力ラベルが複数クラスに分かれていることを示します。
    • subset='training': トレーニング用のデータを生成します。

3. モデルの構築

TensorFlowを使用してシーケンシャルモデルを構築します。

# モデルの構築
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1)),
    MaxPooling2D(pool_size=(2, 2)),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Conv2D(128, (3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Flatten(),
    Dense(512, activation='relu'),
    Dropout(0.5),
    Dense(4, activation='softmax')  # 出力層(4つのクラス)
])
  • Sequential:ニューラルネットワークモデルの各レイヤーを順次積み重ねるためのクラスです。このモデルでは、各レイヤーが順番に追加されていきます。
    • Conv2D: 2次元の畳み込み層。フィルタの数、カーネルサイズ、活性化関数、入力形状を指定。
      • 32: フィルターの数。この場合、32個のフィルターを使用します。
      • (3, 3): フィルターのサイズ。この場合、3x3のフィルターを使用します。
      • activation='relu': 活性化関数としてReLUを使用します。ReLUは、負の値を0にし、正の値をそのまま通します。
      • input_shape=(48, 48 1): 入力データの形状を指定します48x48ピクセルのグレースケール画像(1チャンネル、カラー画像なら3)を入力とします。この指定は最初の層にのみ必要です。
    • MaxPooling2D: プーリング層。プーリングサイズを指定。
      • pool_size=(2, 2): プーリングサイズ。この場合、2x2の領域ごとに最大値を取得します。
    • Flatten: 2次元の特徴マップを1次元のベクトルに変換します。この変換により、全結合層(Dense Layer)にデータを渡すことができます。
    • Dense: 全結合層。ユニット数と活性化関数を指定。
      • 512: ユニットの数。この場合、512個のユニットを持つ全結合層を追加します。
      • activation='relu': 活性化関数としてReLUを使用します。
    • Dropout: ドロップアウト層。過学習を防ぐために一部のユニットをランダムに無効化。
      • 0.5: ドロップアウト率。この場合、ランダムに50%のユニットを無効化します。
    • softmax: 出力層の活性化関数。分類問題で使用され、クラスごとの確率を出力。

4. モデルのコンパイル

モデルをコンパイルします。

# モデルのコンパイル
model.compile(
    optimizer=Adam(learning_rate=0.001),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)
  • optimizer=Adam(learning_rate=0.001): オプティマイザーは、モデルの重みをどのように更新するかを決定するアルゴリズムです。ここではAdamを使用します。Adamは、学習率の調整を自動で行い、収束が速いとされる最適化アルゴリズムです。学習率を0.001にしているのは、 Google Teachable Machine のデフォルトに合わせました。
  • loss='categorical_crossentropy': 損失関数として、多クラス分類に適したカテゴリカルクロスエントロピーを使用します。
  • metrics=['accuracy']: モデルの評価指標として精度を使用します。精度は、正しく分類されたサンプルの割合を示します。

5. モデルのトレーニング

トレーニングデータを使用してモデルをトレーニングします。

# モデルのトレーニング
history = model.fit(
    train_generator,
    steps_per_epoch=train_generator.samples // train_generator.batch_size,
    validation_data=validation_generator,
    validation_steps=validation_generator.samples // validation_generator.batch_size,
    epochs=50
)
  • model.fit: モデルのトレーニングを行うメソッドです。このメソッドを呼び出すことで、モデルは指定されたデータで学習を開始します。
    • train_generator:トレーニングデータのジェネレータです。このジェネレータは、ディスクからバッチ単位で画像を読み込み、前処理を行い、モデルに供給します。
    • steps_per_epoch: 1エポックあたりのトレーニングステップ数です。train_generatorのサンプル数をバッチサイズで割った値です(train_generator.samples // train_generator.batch_size)。これは、1エポックでトレーニングデータ全体を一度処理するために必要なステップ数を示します。
    • validation_data: 検証データのジェネレータです。トレーニング中にモデルの性能を評価するために使用されます。トレーニングデータと同じディレクトリから、検証用に指定された画像データを読み込みます。
    • validation_steps: 1エポックあたりの検証ステップ数です。validation_generator のサンプル数をバッチサイズで割った値です(validation_generator.samples // validation_generator.batch_size)。steps_per_epoch と同様。
    • epochs:トレーニングを行うエポック数です。1エポックは、モデルがトレーニングデータセット全体を一度学習することを意味します。ここでは、50エポックを指定しており、これも Google Teachable Machine のデフォルトに合わせています。
  • history:
    • model.fit メソッドは、トレーニングの過程(各エポックごとの損失と精度の履歴)を含む History オブジェクトを返します。
    • history オブジェクトを使用することで、トレーニング中のモデルのパフォーマンスを可視化することができます。

6. トレーニング過程の確認

トレーニング過程をプロットし、トレーニング中のモデルパフォーマンスを確認します。

# トレーニング過程のプロット
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label = 'val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend(loc='lower right')
plt.show()

Matplotlib に関しては割愛します。結果は以下の通り。

横軸はエポック数(Epoch)、縦軸は精度(Accuracy)を表しています。青い線はトレーニングデータに対する精度、オレンジの線は検証データに対する精度を示しています。

  • トレーニング精度(青い線): トレーニング精度はエポックが進むにつれて安定して上昇していますが、途中で変動が見られます。全体的には、エポック数が増えるにつれて精度が向上し、60%から80%の間で推移しています。
  • 検証精度(オレンジの線): 検証精度は非常に不安定で、エポックごとに大きな変動があります。高いときには100%、低いときには0%に達しており、一貫性がありません。

本来であればデータの前処理、学習率の調整など再度行ったりしますが、今回はこのモデルの評価を行ってみます。

7. モデルの評価

テストデータを使って、モデルの評価を行います。テストデータも学習データと同様にフォルダ分けされており、それぞれ以下の枚数となっています。

  • Happy: 1774枚
  • Angry: 958枚
  • Sad: 1247枚
  • Surprise: 831枚
# データジェネレータの設定
test_datagen = ImageDataGenerator(rescale=1./255)

# テストデータのジェネレータ
test_generator = test_datagen.flow_from_directory(
    'emotional/test',  # テストデータが含まれるディレクトリのパス
    target_size=(48, 48),  # 画像のサイズを48x48に設定
    color_mode='grayscale',  # グレースケール画像として読み込む
    batch_size=16,  # バッチサイズを16に設定
    class_mode='categorical'
)

# テストデータの評価
test_loss, test_acc = model.evaluate(
		test_generator,
		steps=test_generator.samples // test_generator.batch_size
)
print(f'Test accuracy: {test_acc}')

(テストデータのジェネレータについては学習データ・検証データと同様です。)

  • model.evaluate: モデルを評価するためのメソッド。このメソッドを使用して、モデルの損失と精度を計算します。
    • test_generator: train_generator, validation_generator と同様です。
    • steps: 1エポックあたりのテストステップ数です。test_generator のサンプル数をバッチサイズで割った値です(test_generator.samples // test_generator.batch_size)。これは、テストデータ全体を一度処理するために必要なステップ数を示します。
    • test_loss: テストデータに対する損失値です。損失値は、モデルの予測と実際の値との誤差を示します。この値が小さいほど、モデルの予測精度が高いことを示します。
    • test_acc: テストデータに対する精度です。精度は、正しく分類されたサンプルの割合を示します。この値が大きいほど、モデルの予測精度が高いことを示します。

結果ですが、以下が出力されました。

Test accuracy: 0.752916693687439

ちなみに Google Teachable Machine の結果は以下でした。

これと比較した限りでは悪くない結果ではないでしょうか。

まとめ

以上の手順で、画像分類モデルを作成しました。やはり AutoMLツールと比較して手間がかかりますが、技術の理解は深まると思います。簡単にモデルを作りたい場合だと Google Teachable Machine で作ってみるというのも選択肢の一つとしてアリかと思います。

Google Teachable Machine についてはこちらから無料で使うことができますので、興味があれば使ってみてください。

https://teachablemachine.withgoogle.com/

Topics: AI 機械学習 TensorFlow
8 分で読むことができます。

【機械学習入門】TensorFlow Playgroundの使い方

執筆者 橋口 更新日時 2024年6月10日

以前 TensorFlow Playground というニューラルネットワークデモツールを使用したので、使い方などまとめてみました。

Topics: AI 機械学習 TensorFlow
3 分で読むことができます。

【機械学習】SHAP分析やってみた

執筆者 Budo Ogimoto 更新日時 2023年12月19日

初めに


案件において、DataRobotを扱う際にDataRobot内の機能としてSHAPが提供されていました。

Topics: Python 機械学習 SHAP
6 分で読むことができます。

【AutoML】DataRobot, AWS SageMaker Canvas, Google Teachable Machine 比較

執筆者 橋口 更新日時 2023年12月14日

1. はじめに

以前、DataRobot、AWS SageMaker Canvas、Google Teachable Machine という3種のAutoMLツールについて学習したので、本記事ではそれらの機能などを比較したいと思います。

Topics: AI AWS 機械学習 AutoML
15 分で読むことができます。

【AutoML】AWS SageMaker Canvas でモデル構築してみた

執筆者 橋口 更新日時 2023年12月13日

AWS SageMaker Canvas は AWS が提供する AutoMLツールです。本記事では、AWS SageMaker Canvas を使用してモデルを構築する方法に解説します。

Topics: AI AWS 機械学習 AutoML
9 分で読むことができます。

【AutoML】Google Teachable Machine の使い方を解説

執筆者 橋口 更新日時 2023年12月13日

Google Teachable Machine は、機械学習モデルを作成するための便利なツールです。本記事では、Google Teachable Machine の基本的な使い方を解説します。

Topics: AI 機械学習 AutoML
2 分で読むことができます。

AutoMLツール紹介 DataRobot

執筆者 Budo Ogimoto 更新日時 2021年5月28日

DataRobotとは

DataRobotとは機械学習モデル作成を自動化するAIプラットフォームです。
データの分析・モデル構築・システムへのデプロイまでを素早く行え、機械学習ソリューションにありがちな問題であるモデルの判定結果における要因解釈について、わかりやすく可視化も行えることが特徴です。
ここからは、実際の予測モデルを作成する流れを通して、各機能を紹介いたします。

Topics: 機械学習 AutoML DataRobot