トラフィック予測 PyTorch

トラフィック予測

トラフィック予測は時系列データの予測タスクになります。

ここでは、LSTM (Long Short-Term Memory) モデルを使用してPyTorchでトラフィック予測を行うサンプルコードを示します。

データセットとしては、シカゴの交通量データを仮想的に生成します。

まず、以下のコードを使用してPyTorchと必要なライブラリをインポートします。

1
2
3
4
5
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

次に、トラフィックデータを生成します。

1
2
3
4
5
6
7
8
9
10
11
12
# 仮想的なトラフィックデータを生成
np.random.seed(0)
num_points = 500
time_steps = np.linspace(0, 20, num_points)
traffic_data = np.sin(time_steps) + np.random.uniform(-0.5, 0.5, num_points)

# データを正規化
traffic_data = (traffic_data - np.min(traffic_data)) / (np.max(traffic_data) - np.min(traffic_data))

# トレーニングデータとテストデータに分割
train_data = traffic_data[:400]
test_data = traffic_data[400:]

次に、LSTMモデルを定義します。

1
2
3
4
5
6
7
8
9
10
11
12
13
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(LSTMModel, self).__init__()
self.hidden_size = hidden_size
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)

def forward(self, x):
h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)
c0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device)
out, _ = self.lstm(x, (h0, c0))
out = self.fc(out[:, -1, :])
return out

データの準備とモデルの定義ができたら、次にトレーニングを行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# ハイパーパラメータ
input_size = 1
hidden_size = 32
output_size = 1
num_epochs = 100
learning_rate = 0.01

# モデルと損失関数、オプティマイザの定義
model = LSTMModel(input_size, hidden_size, output_size)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

# トレーニングループ
train_data = torch.tensor(train_data, dtype=torch.float32).view(-1, 1, 1)
test_data = torch.tensor(test_data, dtype=torch.float32).view(-1, 1, 1)

for epoch in range(num_epochs):
model.train()
outputs = model(train_data)
loss = criterion(outputs, train_data)
optimizer.zero_grad()
loss.backward()
optimizer.step()

if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

# テストデータでの予測
model.eval()
with torch.no_grad():
test_outputs = model(test_data)
test_outputs = test_outputs.view(-1).numpy()
test_data = test_data.view(-1).numpy()

# グラフ化
plt.figure(figsize=(10, 6))
plt.plot(time_steps[400:], test_data, label='Actual Data', color='blue')
plt.plot(time_steps[400:], test_outputs, label='Predicted Data', color='red')
plt.xlabel('Time')
plt.ylabel('Traffic Data')plt.legend()
plt.show()

このコードは、トラフィックデータをLSTMモデルでトレーニングし、予測結果をグラフで表示します。

時間の経過に伴うトラフィックデータの予測と実測を比較することができます。

[実行結果]

ソースコード解説

このソースコードは、PyTorchを使用してトラフィックデータの予測を行うためのサンプルコードです。

以下でコードの詳細を説明します。

  1. データ生成:

    • np.random.seed(0) でランダムシードを設定して再現性を確保します。
    • num_points は生成するデータの点の数を指定します。
    • time_steps は時間の経過を表す連続した値を生成します。
    • traffic_datanp.sin(time_steps) にランダムなノイズを加えてトラフィックデータを仮想的に生成します。
    • 生成したトラフィックデータを [0, 1] の範囲に正規化します。
  2. LSTMモデルの定義:

    • LSTMModel クラスは nn.Module クラスを継承しています。
    • モデルの構造として、LSTM層を使用して時系列データを学習し、最後に全結合層を用いて予測を行います。
  3. ハイパーパラメータの設定:

    • input_size, hidden_size, output_size はモデルの入力次元数、隠れ状態の次元数、出力次元数を設定します。
    • num_epochs はトレーニングのエポック数を指定します。
    • learning_rate はオプティマイザの学習率を設定します。
  4. モデルの初期化:

    • LSTMModel クラスを使用して、定義したモデルを初期化します。
    • nn.MSELoss() を使用して、損失関数として平均二乗誤差を設定します。
    • optim.Adam() を使用して、Adamオプティマイザを定義します。
  5. トレーニングループ:

    • トレーニングデータをPyTorchのテンソルに変換して、LSTMモデルに渡します。
    • モデルをトレーニングして損失を計算し、バックプロパゲーションとオプティマイザの更新を行います。
  6. テストデータでの予測:

    • トレーニングが終了した後、テストデータをモデルに渡して予測を行います。
    • 予測結果をNumpy配列に変換して、グラフ表示のためのデータにします。
  7. グラフ化:

    • Matplotlibを使用して、実測データと予測データをグラフ上にプロットします。

グラフは、実際のトラフィックデータ(青色)とモデルによる予測データ(赤色)が表示されています。

トレーニングを通じてモデルがデータに適応し、テストデータで予測性能がどのようになるかを確認することができます。

結果解説

この結果は、トラフィック予測のトレーニング中にエポックごとの損失値が表示されています。

エポック数が増えるにつれて損失が減少していることがわかります。

損失は、モデルがトレーニングデータに適応するように最適化される指標であり、小さいほどモデルがデータに適合していることを意味します。

具体的には、次のように解釈できます:

  • Epoch [10/100], Loss: 0.0858:
    10回目のエポックのトレーニングでは、平均二乗誤差(Mean Squared Error)が約0.0858となっています。
  • Epoch [20/100], Loss: 0.0834:
    20回目のエポックのトレーニングでは、損失がわずかに減少して約0.0834となっています。
  • Epoch [30/100], Loss: 0.0707:
    30回目のエポックのトレーニングでは、損失がさらに減少して約0.0707となっています。
  • …(以下、同様の解釈)

エポックが進むにつれて、モデルはトレーニングデータの特徴をよりよく捉えるようになり、損失が小さくなっていることがわかります。

ただし、損失が小さいからと言って、必ずしもモデルが良い予測結果を得られるわけではありません。

過学習に陥っている可能性もあるため、テストデータでの性能を確認することも重要です。


グラフを見ると、予測データが実測データに近づいていることが分かるでしょうか?

モデルがトラフィックデータをうまく学習できたため、未知のデータに対してもある程度の予測ができていることが示唆されています。

ただし、実際の応用では、さまざまなハイパーパラメータやモデルアーキテクチャの調整、さらにはより多くのデータや特徴量の考慮などが必要になる場合があります。

病状診断 PyTorch

病状診断

病状診断は医療分野に属する複雑な問題であり、実際の医療診断には十分なデータセットや専門知識が必要です。

ここでは、サンプルとしてシンプルな乳がんの診断を行うコードを示します。

乳がんの診断は二値分類問題で、PyTorchを使用して簡単なニューラルネットワークを構築して実行します。

このサンプルでは、乳がんのデータセットであるBreast Cancer Wisconsin (Diagnostic) Data Setを使用します。

データセットはscikit-learnライブラリから利用できます。

また、結果を分かりやすくするためにMatplotlibを使用してグラフ化します。

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

1
2
3
4
5
6
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

次に、データセットをロードして前処理を行います。

1
2
3
4
5
6
7
8
9
10
# データセットの読み込み
data = load_breast_cancer()
X, y = data.data, data.target

# データをPyTorchのテンソルに変換
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32).view(-1, 1)

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

次に、簡単なニューラルネットワークモデルを定義します。

1
2
3
4
5
6
7
8
9
10
11
12
13
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc1 = nn.Linear(30, 16)
self.fc2 = nn.Linear(16, 8)
self.fc3 = nn.Linear(8, 1)
self.sigmoid = nn.Sigmoid()

def forward(self, x):
x = self.sigmoid(self.fc1(x))
x = self.sigmoid(self.fc2(x))
x = self.sigmoid(self.fc3(x))
return x

次に、モデルを訓練して、結果をグラフ化します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# モデルの初期化
model = SimpleModel()

# 損失関数とオプティマイザの設定
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 訓練ループ
num_epochs = 100
train_losses = []
test_losses = []

for epoch in range(num_epochs):
# 訓練
model.train()
optimizer.zero_grad()
outputs = model(X_train)
loss = criterion(outputs, y_train)
loss.backward()
optimizer.step()
train_losses.append(loss.item())

# テスト
model.eval()
with torch.no_grad():
outputs = model(X_test)
loss = criterion(outputs, y_test)
test_losses.append(loss.item())

# グラフのプロット
plt.plot(train_losses, label='Train Loss')
plt.plot(test_losses, label='Test Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()

このコードでは、訓練データとテストデータに対する損失の推移を可視化しています。

訓練データとテストデータの損失が共に減少していることが確認できれば、モデルがうまく機能していることが分かります。

ただし、このサンプルはあくまで簡単なものであり、実際の医療診断にはより高度なモデルや専門知識が必要です。

[実行結果]

ソースコード解説

このソースコードは、PyTorchを使用して単純なニューラルネットワークモデルを定義し、乳がんデータセットを使ってそのモデルを訓練し、訓練とテストの損失をプロットするプログラムです。

  1. データの準備:

    • ライブラリのインポート: 必要なライブラリをインポートします。
      PyTorchのニューラルネットワーク関連のモジュール(torch, torch.nn, torch.optim)やデータセットの読み込みに使うScikit-learn関連のモジュール(sklearn.datasets, sklearn.model_selection)をインポートしています。
    • データセットの読み込み: Scikit-learnのload_breast_cancer()関数を使って乳がんデータセットをロードします。
      このデータセットは、乳がんの診断に関連する特徴量と対応するラベル(0: 悪性、1: 良性)を持つものです。
  2. データの前処理:

    • データをPyTorchのテンソルに変換: NumPy配列からPyTorchのテンソルに変換します。
      特徴量Xは浮動小数点数のテンソルに変換され、ラベルyは浮動小数点数のテンソルに変換され、さらに1次元テンソルに変形(.view(-1, 1))されます。
    • 訓練データとテストデータに分割: train_test_split()関数を使ってデータを訓練データとテストデータに分割します。
      ここでは、全体の20%をテストデータとして使用し、乱数のシードを固定して再現性を確保しています。
  3. ニューラルネットワークモデルの定義:

    • SimpleModelクラス: PyTorchのnn.Moduleを継承した単純なニューラルネットワークモデルを定義しています。
      このモデルは、3つの全結合層(nn.Linear)とそれらの間の活性化関数(nn.Sigmoid)で構成されています。
  4. モデルの初期化:

    • model = SimpleModel(): SimpleModelクラスからモデルをインスタンス化します。
  5. 損失関数とオプティマイザの設定:

    • criterion = nn.BCELoss(): 二値交差エントロピー損失関数(Binary Cross Entropy Loss)を使用します。
      この損失関数は、二値分類問題に適しています。
    • optimizer = optim.Adam(model.parameters(), lr=0.01): Adamオプティマイザを使用して、モデルのパラメータを最適化します。
      学習率(lr)は0.01です。
  6. 訓練ループ:

    • num_epochs = 100: エポック数を100に設定します。
      エポックとは、データセット全体を一度学習することを意味します。
    • train_lossestest_losses: 訓練中に各エポックの訓練損失とテスト損失を保存するためのリストです。
  7. 訓練とテストの実行:

    • model.train(): モデルを訓練モードに設定します。
    • 訓練データで順伝播を行い、損失を計算します。
      そして逆伝播とオプティマイザのステップ(パラメータ更新)を行います。
    • model.eval(): モデルを評価モードに設定します。
      これにより、ドロップアウトなどの評価時にのみ適用されるレイヤーが適切に動作します。
    • テストデータで順伝播を行い、テスト損失を計算します。
      逆伝播は行いません。
  8. グラフのプロット:

    • 訓練とテストの損失をエポックごとにプロットします。
      プロットされたグラフは、訓練損失とテスト損失のエポックごとの変化を可視化するのに役立ちます。

このプログラムは、単純なニューラルネットワークを使って乳がんデータセットを分類するタスクを行っており、訓練とテストの損失を監視することでモデルの学習の進行状況を確認できます。

顧客行動予測 PyTorch

顧客行動予測

PyTorchを使用して顧客行動予測を行うサンプルコードを示します。

ここでは、顧客の過去の購入履歴から次に購入する商品を予測するというシナリオを考えてみましょう。

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

1
2
3
4
5
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

次に、顧客の購入履歴データを模擬的に作成します。

ここでは、10人の顧客が10種類の商品を購入した履歴をランダムに生成します。

1
2
3
4
np.random.seed(0)
num_customers = 10
num_products = 10
purchase_history = np.random.randint(2, size=(num_customers, num_products))

次に、ニューラルネットワークのモデルを定義します。

ここでは、単純な全結合層のみのネットワークを使用します。

1
2
3
4
5
6
7
8
9
10
11
12
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(num_products, 50)
self.fc2 = nn.Linear(50, num_products)

def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.sigmoid(self.fc2(x))
return x

net = Net()

次に、学習の設定を行います。

損失関数には二値交差エントロピーを、最適化手法にはAdamを使用します。

1
2
criterion = nn.BCELoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)

そして、学習を行います。

ここでは、100エポック学習を行うことにします。

1
2
3
4
5
6
7
8
9
10
11
12
for epoch in range(100):
inputs = torch.from_numpy(purchase_history).float()
targets = torch.from_numpy(purchase_history).float()

optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()

if epoch % 10 == 0:
print(f'Epoch {epoch}, Loss: {loss.item()}')

最後に、学習結果をグラフ化します。

1
2
3
4
5
6
7
8
9
predicted = net(torch.from_numpy(purchase_history).float()).detach().numpy()
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(purchase_history, cmap='binary')
plt.title('Actual')
plt.subplot(1, 2, 2)
plt.imshow(predicted, cmap='binary')
plt.title('Predicted')
plt.show()
[実行結果]

このコードは、顧客の購入履歴を元に次に購入する商品を予測するものです。

ただし、これは非常に単純化された例であり、実際の問題ではより複雑なモデルやデータ前処理が必要になることをご理解ください。

ソースコード解説

コードの詳細を説明します。

1. import 文:

必要なライブラリをインポートします。
torch はPyTorchの主要なライブラリです。
nn はニューラルネットワークを定義するためのサブパッケージ、optim は最適化アルゴリズムを含むサブパッケージ、numpy は数値計算用ライブラリ、matplotlib.pyplot はデータをグラフ化するためのライブラリです。

2. ランダムな顧客の購買履歴データの生成:

np.random.randint(2, size=(num_customers, num_products)) を使用して、0と1のランダムな値で構成されるnum_customers x num_products の行列 purchase_history を生成しています。
これは仮想的なデータであり、各行が各顧客の購買履歴を表しています。

3. ニューラルネットワークモデルの定義:

Net クラスを定義しています。
nn.Module を継承しています。
このモデルは、入力として num_products 個の特徴を受け取り、2つの全結合層 (fc1fc2) を通して処理されます。
fc1 は入力次元から50次元への変換を行い、torch.relu 関数によって活性化されます。
次に、fc2 は50次元から出力次元(num_products)への変換を行い、torch.sigmoid 関数によって0から1の範囲にスケーリングされます。

4. ニューラルネットワークモデルのインスタンス化:

net = Net() を使用して、定義した Net クラスのインスタンス net を作成します。

5. 損失関数と最適化アルゴリズムの定義:

この例では、損失関数に二値交差エントロピー(BCELoss)を使用しています。
最適化アルゴリズムにはAdamを使用しています。
学習率は0.001です。

6. モデルの訓練:

データをPyTorchのTensorに変換し、100エポックの間でモデルを訓練しています。
各エポックで、最適化アルゴリズムによって損失が最小化されるようにモデルの重みを更新しています。

7. 予測と結果のグラフ化:

訓練が終了した後、学習済みのモデルを使って購買履歴データを入力として予測を行い、predicted という変数に予測結果を格納しています。
そして、元の購買履歴データと予測結果を2つのサブプロットを持つグラフとして表示しています。

上記のコードは非常にシンプルな顧客行動予測の例ですが、実際の問題にはさらなるデータの前処理やモデルの改善が必要になることがあります。

CartPole PyTorch

CartPole

OpenAI GymのCartPoleという環境でActor-Critic法を用いた強化学習のサンプルコードを示します。

このコードは、棒を立て続けるためにカートを左右に動かすというタスクを解くためのものです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Categorical
import matplotlib.pyplot as plt

class Policy(nn.Module):
def __init__(self):
super(Policy, self).__init__()
self.affine1 = nn.Linear(4, 128)
self.affine2 = nn.Linear(128, 2)

self.saved_log_probs = []
self.rewards = []

def forward(self, x):
x = torch.relu(self.affine1(x))
action_scores = self.affine2(x)
return torch.softmax(action_scores, dim=1)

def select_action(state):
state = torch.from_numpy(state).float().unsqueeze(0)
probs = policy(state)
m = Categorical(probs)
action = m.sample()
policy.saved_log_probs.append(m.log_prob(action))
return action.item()

def finish_episode():
R = 0
policy_loss = []
returns = []
for r in policy.rewards[::-1]:
R = r + 0.99 * R
returns.insert(0, R)
returns = torch.tensor(returns)
returns = (returns - returns.mean()) / (returns.std() + 1e-6)
for log_prob, R in zip(policy.saved_log_probs, returns):
policy_loss.append(-log_prob * R)
optimizer.zero_grad()
policy_loss = torch.cat(policy_loss).sum()
policy_loss.backward()
optimizer.step()
del policy.rewards[:]
del policy.saved_log_probs[:]

policy = Policy()
optimizer = optim.Adam(policy.parameters(), lr=1e-2)

env = gym.make('CartPole-v1')
rewards_history = [] # 保存用の総報酬のリスト
for episode in range(500):
state = env.reset()
total_reward = 0 # エピソードの総報酬
for t in range(10000): # 学習の無限ループを防ぐための上限
action = select_action(state)
state, reward, done, _ = env.step(action)
policy.rewards.append(reward)
total_reward += reward
if done:
break

finish_episode()
rewards_history.append(total_reward) # エピソードごとの総報酬を保存
if episode % 50 == 0:
print('Episode {}\tLast length: {:5d}\tTotal Reward: {}'.format(episode, t, total_reward))

# 総報酬の推移をグラフ化
plt.plot(range(len(rewards_history)), rewards_history)
plt.xlabel('Episode')
plt.ylabel('Total Reward')
plt.title('Total Reward per Episode')
plt.show()

このコードは、CartPoleの環境で棒を立て続けるためにカートを左右に動かすタスクを解くためのものです。

ここでは、ニューラルネットワークを用いてポリシー(行動を選択する確率分布)を表現し、そのポリシーを改善するためにエピソード(一連の行動と報酬)の結果を用いて学習を行っています。

[実行結果]

このコードは基本的な強化学習のフレームワークを示していますが、実際の問題ではより複雑な環境やポリシー、学習アルゴリズムを用いることが多いです。

また、このコードは学習の進行状況を表示するためのロギングや、学習済みのモデルを保存する機能などは省略しています。

これらの機能は実際の開発では重要な要素となります。

ソースコード解説

このソースコードは、強化学習の一種であるPolicy Gradientを用いて、OpenAI GymのCartPole-v1という環境を学習するものです。

CartPoleは、棒を倒さないように台車を左右に動かすというタスクです。


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

gymは強化学習の環境を提供するライブラリ、numpyは数値計算、torchは深層学習のライブラリ、matplotlib.pyplotはグラフ描画のためのライブラリです。


次に、Policyという名前のニューラルネットワークを定義しています。

このネットワークは、状態を入力として受け取り、各アクションの確率を出力します。

このネットワークは2つの全結合層から構成されています。

ReLU活性化関数を用いて非線形性を導入し、softmax関数を用いて出力を確率に変換しています。


select_action関数は、与えられた状態に基づいてアクションを選択します。

この関数は、現在のポリシーを用いてアクションの確率を計算し、その確率に基づいてアクションをサンプリングします。


finish_episode関数は、エピソードが終了したときに呼び出され、ポリシーネットワークの更新を行います。

この関数は、エピソード中に収集された報酬とログ確率を用いて、ポリシーロスを計算し、そのロスを用いてネットワークのパラメータを更新します。


その次にメインの学習ループがあります。

ここでは、環境をリセットし、アクションを選択し、そのアクションを環境に適用し、報酬と新しい状態を受け取り、その報酬を累積します。

エピソードが終了したら(つまり、棒が倒れたら)、エピソードを終了し、ポリシーを更新します。


最後に、エピソードごとの総報酬をプロットして、学習の進行を視覚化します。

これにより、エージェントが時間とともにどの程度学習しているかを確認できます。

どちらかを選択

ソースコードの各部分の説明をします。

  • Policy クラス: ポリシーネットワークを定義するクラスです。nn.Module を継承しており、入力の次元数が4であり、全結合層を2つ持ちます。forward メソッドでは、入力に対してReLU活性化関数を適用し、最後の層の出力をソフトマックス関数によって確率分布として表現します。

  • select_action 関数: 状態に基づいて行動を選択する関数です。状態をテンソルに変換し、ポリシーネットワークを介して行動の確率分布を取得します。確率分布から行動をサンプリングし、その行動の対数確率を保存します。

  • finish_episode 関数: エピソードの終了時に呼び出される関数です。累積報酬を計算し、ポリシーロスを計算します。ポリシーロスは、対数確率と累積報酬の要素ごとの積の総和です。また、ポリシーロスをバックプロパゲーションしてパラメータを更新します。

  • policy インスタンス: Policy クラスのインスタンスであり、ポリシーネットワークを表します。

  • optimizer インスタンス: optim.Adam を使用してポリシーネットワークのパラメータを最適化するためのオプティマイザです。

  • env インスタンス: gym.make を使用してCartPole環境を作成します。

  • rewards_history リスト: エピソードごとの総報酬を保存するためのリストです。

  • エピソードのループ: エピソードごとに以下の処理を実行します。

    • 状態のリセット
    • エピソードの総報酬を初期化
    • タイムステップのループ: 最大タイムステップ数まで繰り返します。
      • select_action 関数を呼び出して行動を選択し、状態、報酬、終了状態を取得します。
      • 報酬を保存し、総報酬に加算します。
      • エピソード終了時にはループを終了します。
    • finish_episode 関数を呼び出してポリシーネットワークを更新し、報酬を保存します。
    • エピソードごとの総報酬を rewards_history リストに追加します。
  • 総報酬の推移のグラフ化: plt.plot を使用してエピソードごとの総報酬の推移をグラフ化します。


ソースコードの実行結果は、エピソードごとの最後のステップの長さ(Last length)と総報酬(Total Reward)が表示されます。

また、最後には総報酬の推移をグラフ化して可視化します。

これにより、エージェントの学習の進行状況やタスクの制御の改善を視覚的に確認することができます。

実行結果 解説

それぞれのエピソードでの結果の説明をします。

  • Episode 0:
    エピソード0では、最後のステップの長さ(Last length)が94で、総報酬(Total Reward)が95.0です。エージェントは初期状態での制御がまだうまくできていないようです。

  • Episode 50:
    エピソード50では、最後のステップの長さが107で、総報酬が108.0です。エージェントの学習が進み、タスクの制御が改善されてきていることがわかります。

  • Episode 100:
    エピソード100では、最後のステップの長さが37で、総報酬が38.0です。エージェントの制御が一時的に低下している可能性がありますが、学習が進行していることを示しています。

  • Episode 150:
    エピソード150では、最後のステップの長さが53で、総報酬が54.0です。エージェントの学習が進み、タスクの制御が改善されていることがわかります。

  • Episode 200:
    エピソード200では、最後のステップの長さが499で、総報酬が500.0です。エージェントはタスクの制御を非常にうまく行い、安定した報酬を得ることができるようになりました。

  • Episode 250:
    エピソード250では、最後のステップの長さが106で、総報酬が107.0です。エージェントの学習が継続され、タスクの制御を改善し続けています。

  • Episode 300:
    エピソード300では、最後のステップの長さが115で、総報酬が116.0です。エージェントの学習が進み、タスクの制御が改善されていることがわかります。

  • Episode 350:
    エピソード350では、最後のステップの長さが43で、総報酬が44.0です。エージェントの学習が進行しており、一時的な低下があるものの、制御の改善が継続しています。

  • Episode 400:
    エピソード400では、最後のステップの長さが80で、総報酬が81.0です。エージェントは学習を継続し、タスクの制御を改善し続けています。

  • Episode 450:
    エピソード450では、最後のステップの長さが146で、総報酬が147.0です。エージェントの学習が進み、タスクの制御が改善されていることがわかります。


総じて、エージェントの学習が進むにつれて、CartPoleタスクの制御が改善されていることがわかります。

初めは制御がうまくできていなかったが、学習が進み、最終的には高い報酬を得ることができるようになりました。

エピソードごとの総報酬の推移をグラフ化することで、エージェントの学習の進行状況やタスクの制御の改善を視覚的に確認することができます。

選挙結果予測 scikit-learn

選挙結果予測

選挙に関するデータ分析の一例として、選挙結果を予測するモデルを作成してみましょう。

ここでは、選挙の候補者の年齢、教育レベル、キャンペーンの予算などを特徴として使用します。

これらの特徴を基に、候補者が選挙に勝つかどうかを予測します。


まず、サンプルデータを作成します。

ここでは、pandasとnumpyを使用します。

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np

# データの作成
np.random.seed(0)
data = {
'年齢': np.random.randint(30, 70, 100),
'教育レベル': np.random.randint(1, 4, 100),
'キャンペーン予算': np.random.randint(1, 10, 100) * 10000,
'選挙結果': np.random.randint(0, 2, 100)
}
df = pd.DataFrame(data)

次に、scikit-learnを使用してデータを訓練セットとテストセットに分割し、ロジスティック回帰モデルを訓練します。

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# 特徴とラベルを分割
X = df[['年齢', '教育レベル', 'キャンペーン予算']]
y = df['選挙結果']

# データを訓練セットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# ロジスティック回帰モデルの訓練
model = LogisticRegression()
model.fit(X_train, y_train)

最後に、matplotlibを使用して結果をグラフ化します。

ここでは、テストデータの予測結果と実際の結果を比較する混同行列を作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix

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

# 混同行列の作成
cm = confusion_matrix(y_test, y_pred)

# 混同行列のグラフ化
plt.imshow(cm, cmap=plt.cm.Blues)
plt.xlabel("Predicted labels")
plt.ylabel("True labels")
plt.xticks([], [])
plt.yticks([], [])
plt.title('Confusion matrix ')
plt.colorbar()
plt.show()
[実行結果]

このコードはあくまで一例であり、実際の選挙データ分析では、より多くの特徴を考慮に入れ、より複雑なモデルを使用することが一般的です。

また、データの前処理や特徴選択、モデルの評価など、ここでは触れていない重要なステップもあります。

ソースコード解説

以下にソースコードの詳細な説明を示します:


1行目と2行目では、pandasとnumpyをインポートしています。

pandasはデータ解析や操作を行うためのライブラリであり、numpyは数値計算を行うためのライブラリです。


5行目から11行目では、データセットを作成しています。

np.random.seed(0)は乱数のシードを設定し、再現性を確保しています。

dataには4つの特徴(年齢、教育レベル、キャンペーン予算、選挙結果)を持つ100行のデータが生成されます。


12行目では、作成したデータを使ってpandasのDataFrameを作成しています。


22行目では、scikit-learnのtrain_test_splitを使用してデータを訓練セットとテストセットに分割しています。

Xには特徴量のカラム(’年齢’、’教育レベル’、’キャンペーン予算’)が代入され、yにはラベルのカラム(’選挙結果’)が代入されます。

test_size=0.2はテストセットの割合を指定しており、random_state=0は乱数のシードを設定して再現性を確保しています。


25行目では、scikit-learnのLogisticRegressionを使用してロジスティック回帰モデルを作成しています。


28行目と29行目では、matplotlibのpyplotモジュールとscikit-learnのconfusion_matrixをインポートしています。


32行目では、作成したモデルを使用してテストデータの予測を行っています。


35行目では、予測結果と真のラベルを用いて混同行列を作成しています。


38行目から45行目では、混同行列をグラフ化しています。

plt.imshow()で混同行列を表示し、plt.xlabel()、plt.ylabel()で軸ラベルを設定しています。

plt.xticks([], [])とplt.yticks([], [])は軸の目盛りを非表示にしています。

plt.title()でグラフのタイトルを設定し、plt.colorbar()でカラーバーを表示しています。

最後のplt.show()でグラフを表示します。


このソースコードは、訓練セットとテストセットの分割、ロジスティック回帰モデルの訓練、テストデータの予測、混同行列の作成とグラフ化を順番に行っています。

アルツハイマー病の診断 scikit-learn

アルツハイマー病の診断

アルツハイマー病の診断には、様々な特徴量が関与しますが、ここではシンプルな例として、年齢一部の生化学的指標(例えば、血液中の特定のタンパク質レベル)を特徴量として使用するとします。

以下に、scikit-learnを使用した分類問題の解き方を示します。


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

1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, accuracy_score
import seaborn as sns

次に、仮想的なデータセットを作成します。

ここでは、年齢とタンパク質レベルの2つの特徴量を持つ1000人の患者データを生成します。

また、各患者がアルツハイマー病であるかどうかをランダムに決定します。

1
2
3
np.random.seed(0)
X = np.random.randint(60, 100, (1000, 2)) # Age and Protein level
y = np.random.choice([0, 1], 1000) # 0: Healthy, 1: Alzheimer's

データを訓練セットとテストセットに分割します。

1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

ランダムフォレスト分類器を訓練します。

1
2
clf = RandomForestClassifier(n_estimators=100, random_state=0)
clf.fit(X_train, y_train)

テストセットでの予測と評価を行います。

1
2
y_pred = clf.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")

最後に、混同行列をグラフ化します。

1
2
3
4
5
6
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt="d")
plt.title("Confusion Matrix")
plt.xlabel("Predicted Label")
plt.ylabel("True Label")
plt.show()

このコードは、ランダムに生成したデータに対してランダムフォレスト分類器を訓練し、テストデータでの予測精度を計算し、混同行列を表示します。

[実行結果]

実際の問題では、適切な特徴量の選択と前処理、モデルの選択とチューニングが重要となります。

特徴抽出 scikit-learn

特徴抽出

Scikit-learnを使用して特徴抽出を行い、結果をグラフ化するためのサンプルコードを示します。

以下の例では、Breast Cancerデータセットから特徴抽出を行い、主成分分析(PCA)を使用してデータの次元削減を行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# データセットの読み込み
data = load_breast_cancer()
X = data.data
y = data.target

# 特徴抽出: PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# グラフ化
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('Breast Cancer Dataset - PCA')
plt.colorbar(label='Target')
plt.show()

上記のコードでは、Breast Cancerデータセットを使用して特徴抽出を行っています。

データセットから特徴量Xとラベルyを取得し、PCAを使用してデータの次元削減を行っています。

PCAn_componentsパラメータを2に設定しているため、データは2次元に削減されます。

削減後のデータをX_pcaに格納します。

最後に、削減されたデータを散布図として表示しています。

散布図の点の色はyの値に基づいて変化し、カラーバーが対応するクラスラベルを表示します。

[実行結果]

これにより、元のデータを2次元の空間にプロットし、データの分布やクラスの分離状況を視覚化することができます。

注意: 上記のコードでは、Breast Cancerデータセットを使用していますが、他のデータセットに適用する場合は、データセットの読み込み方法や特徴量の選択を変更してください。

また、必要に応じて他の特徴抽出手法を使用することもできます。

アノマリ検知 scikit-learn

アノマリ検知

アノマリ検知の一つの例として、Isolation Forestを使ったアノマリ検知を紹介します。

Isolation Forestは、異常値を見つけるための効果的な方法で、特に高次元のデータセットに対して有効です。

以下にPythonとScikit-learnを使ったサンプルコードを示します。

このコードでは、2次元のデータセットを生成し、Isolation Forestを使ってアノマリを検出し、結果をグラフ化します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# データの生成
rng = np.random.RandomState(42)

# 正常なデータポイント
X_train = 0.3 * rng.randn(100, 2)
X_train = np.r_[X_train + 2, X_train - 2]

# 新しい正常なデータポイント
X_test = 0.3 * rng.randn(20, 2)
X_test = np.r_[X_test + 2, X_test - 2]

# 異常なデータポイント
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))

# Isolation Forestの適用
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

# プロット
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("IsolationForest")
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)

b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white',
s=20, edgecolor='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green',
s=20, edgecolor='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red',
s=20, edgecolor='k')

plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([b1, b2, c],
["training observations",
"new regular observations", "new abnormal observations"],
loc="upper left")
plt.show()

このコードを実行すると、正常なデータポイント(白と緑の点)と異常なデータポイント(赤い点)がプロットされます。

Isolation Forestは、異常なデータポイントを効果的に検出します。

[実行結果]

ソースコード解説

このソースコードは、Isolation Forest(孤立性森)アルゴリズムを使用してアノマリ検知を行う例です。

以下にソースコードの各部分を詳しく説明します。

1. ライブラリのインポート:
1
2
3
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

必要なライブラリをインポートします。NumPyは数値計算を行うために使用し、Matplotlibはグラフの描画に使用します。
IsolationForestはScikit-learnのアノマリ検知アルゴリズムです。

2. データの生成:
1
2
3
4
5
6
7
8
9
10
11
12
rng = np.random.RandomState(42)

# 正常なデータポイント
X_train = 0.3 * rng.randn(100, 2)
X_train = np.r_[X_train + 2, X_train - 2]

# 新しい正常なデータポイント
X_test = 0.3 * rng.randn(20, 2)
X_test = np.r_[X_test + 2, X_test - 2]

# 異常なデータポイント
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))

正常なデータポイント(X_train)と新しい正常なデータポイント(X_test)を生成します。
また、異常なデータポイント(X_outliers)も生成します。

3. Isolation Forestの適用:
1
2
3
4
5
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

IsolationForestクラスのインスタンスを作成し、X_trainを使用してモデルをトレーニングします。
そして、トレーニングデータとテストデータ、異常データそれぞれのアノマリスコアを予測します。

4. プロット:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
xx, yy = np.meshgrid(np.linspace(-5, 5, 50), np.linspace(-5, 5, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("IsolationForest")
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)

b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white',
s=20, edgecolor='k')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green',
s=20, edgecolor='k')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red',
s=20, edgecolor='k')

plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([b1, b2, c],
["training observations",
"new regular observations", "new abnormal observations"],
loc="upper left")
plt.show()

アノマリスコアをグラフ化し、データポイントをプロットします。等高線プロットはアノマリスコアのレベルを示し、青い色が正常である領域を表します。
また、正常データポイントは白色で、新しい正常データポイントは緑色、異常データポイントは赤色でプロットされます。

これにより、Isolation Forestアルゴリズムによるアノマリ検知の結果が可視化されます。

グラフを通じて、異常データポイントが正常データから分離される様子を確認できます。

クレジットスコアリング scikit-learn

クレジットスコアリング

クレジットスコアリングの一例として、ロジスティック回帰を用いた二項分類問題を考えてみましょう。

この例では、顧客がローンを返済する(1)かしない(0)かを予測します。

特徴量としては、年齢と収入を考えてみます。

まず、必要なライブラリをインポートし、仮想のデータセットを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import seaborn as sns

# 仮想データセットの作成
np.random.seed(0)
age = np.random.randint(20, 70, 1000)
income = np.random.randint(20000, 100000, 1000)
will_pay_back = np.random.randint(0, 2, 1000)

df = pd.DataFrame({
'age': age,
'income': income,
'will_pay_back': will_pay_back
})

次に、データを訓練セットとテストセットに分割し、ロジスティック回帰モデルを訓練します。

1
2
3
4
5
6
7
8
9
10
# 特徴量とターゲットに分割
X = df[['age', 'income']]
y = df['will_pay_back']

# 訓練セットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# ロジスティック回帰モデルの訓練
model = LogisticRegression()
model.fit(X_train, y_train)

最後に、訓練したモデルを用いてテストセットのデータを予測し、結果をグラフ化します。

1
2
3
4
5
6
7
# テストセットのデータを予測
y_pred = model.predict(X_test)

# 結果のグラフ化
cm = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])
sns.heatmap(cm, annot=True, fmt='d')
plt.show()

このヒートマップは混同行列を表しており、モデルがどの程度正確に予測できているかを視覚的に理解するのに役立ちます。

[実行結果]

ソースコード解説

コードの詳細な説明は下記の通りです。

1. import ステートメント:

必要なライブラリやモジュールをインポートします。
numpypandassklearnmatplotlib.pyplotseabornが使用されています。

2. 仮想データセットの作成:

numpy.randomを使って、age(年齢)、income(収入)、will_pay_back(返済するかどうか)の3つの特徴量を持つ仮想的なデータセットを作成します。
これらの特徴量はランダムな値で生成されます。

3. データフレームの作成:

pandas.DataFrameを使って、上記で生成した特徴量を含むデータフレーム df を作成します。

4. 特徴量とターゲットの分割:

df から特徴量 X(’age’と’income’)とターゲット変数 y(’will_pay_back’)を分割します。

5. 訓練セットとテストセットの分割:

sklearn.model_selection.train_test_split を使って、データを訓練セットとテストセットに分割します。
ここでは、テストセットのサイズを設定し、乱数のシードを固定して再現性を確保しています。

6. ロジスティック回帰モデルの訓練:

sklearn.linear_model.LogisticRegression を使って、ロジスティック回帰モデルを作成し、訓練セットを用いてモデルを訓練します。

7. テストセットのデータを予測:

訓練されたモデルを使って、テストセットの特徴量 X_test を予測します。

8. 結果のグラフ化:

予測結果と実際のターゲット変数 y_test をもとに、混同行列(confusion matrix)を作成し、seaborn.heatmap を使って可視化します。
混同行列は、予測されたクラスと実際のクラスの組み合わせごとにカウントされます。

9. plt.show():

グラフを表示します。


このコードを実行すると、ロジスティック回帰モデルを使って返済するかどうかを予測し、混同行列をグラフ化することができます。

混同行列は、予測の正確性や誤分類の種類を評価するのに役立ちます。

詐欺検出 scikit-learn

詐欺検出

金融取引の詐欺検出の例題として、以下のデータセットを考えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# サンプルデータの生成
rng = np.random.RandomState(42)
X = 0.3 * rng.randn(100, 2)
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))
X = np.vstack([X, X_outliers])

# Isolation Forestモデルの構築と詐欺検出の実行
clf = IsolationForest(contamination=0.1, random_state=rng)
clf.fit(X)
y_pred = clf.predict(X)

# 結果の可視化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("Fraud Detection with Isolation Forest")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

この例では、Isolation Forestと呼ばれるアルゴリズムを使用して詐欺検出を行っています。

Isolation Forestは、データの異常度を評価し、異常なデータポイントを検出するために使用されます。

結果をグラフ化すると、データポイントが異常かどうかに応じて色分けされた散布図が表示されます。

異常なデータポイントは通常、他のデータポイントからは明らかに分離していることが視覚的に確認できます。

異常なデータポイントは、詐欺の可能性が高いと考えられます。

上記のコードを実行すると、詐欺検出の結果をグラフで確認することができます。

[実行結果]

コード解説

このコードは、Isolation Forestを使用して金融取引の詐欺検出を行い、結果をグラフ化するためのものです。

以下に各部分の説明をします。

1行目から3行目:

必要なライブラリをインポートします。
numpyは数値計算のために使用され、matplotlib.pyplotはグラフの描画に使用されます。
sklearn.ensembleからはIsolation Forestモデルをインポートします。

6行目から9行目:

サンプルデータの生成を行います。
numpy.random.RandomStateを使用して乱数のシードを設定し、乱数を用いて2次元のデータセットXを生成します。
X_outliersは異常値を表すデータセットです。最後にnp.vstackを使用してXX_outliersを結合します。

12行目:

IsolationForestクラスのインスタンスを作成します。
contaminationパラメータは異常値の割合を指定し、random_stateパラメータは乱数のシードを指定します。

13行目:

fitメソッドを使用してIsolation Forestモデルをデータに適合させます。

13行目:

predictメソッドを使用してデータポイントの異常度を予測します。
異常であれば-1、正常であれば1のラベルが返されます。

17行目から21行目:

結果を可視化します。
plt.scatterを使用してデータポイントを散布図として表示します。
cパラメータをy_predとし、異常度に応じて色を付けます。
plt.titleplt.xlabelplt.ylabelを使用してグラフにタイトルや軸ラベルを追加します。
最後の行で、グラフを表示します。


このコードを実行すると、生成されたデータセット上での詐欺検出結果を可視化したグラフが表示されます。

異常なデータポイントは異なる色で表示され、詐欺の可能性が高いと予測されます。