宗教選択予想 scikit-learn

宗教選択予想

宗教の例題として、ある地域の人々の宗教信仰に関するデータを使って、その要因から宗教の選択を予測する多クラス分類問題を考えてみましょう。

具体的には、年齢、性別、家族の宗教、教育レベルなどを特徴量とし、宗教をカテゴリで表すターゲットを予測します。

まずは、scikit-learnのライブラリをインポートします。

1
2
3
4
5
6
7
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_multilabel_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

次に、架空の宗教データを作成します。

1
2
3
4
5
6
7
8
9
# 架空の宗教データを生成
X, y = make_multilabel_classification(n_samples=500, n_features=4, n_classes=5, n_labels=2, random_state=42)

# 特徴量のスケーリング
scaler = StandardScaler()
X = scaler.fit_transform(X)

# データをトレーニング用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

次に、K近傍法(K-Nearest Neighbors)を使って多クラス分類モデルを構築し、トレーニングデータを用いて学習させます。

1
2
3
4
5
# K近傍法のモデルを初期化
knn = KNeighborsClassifier(n_neighbors=5)

# モデルをトレーニングデータで学習
knn.fit(X_train, y_train)

モデルを学習させた後は、テストデータを用いて予測を行い、性能を評価してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# テストデータを用いて予測
y_pred = knn.predict(X_test)

# 正解率を計算
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 分類レポートを表示
print("Classification Report:")
print(classification_report(y_test, y_pred))

# 混同行列を表示
print("Confusion Matrix:")
print(confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1)))

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

宗教が5つのカテゴリに分かれるため、t-SNE(t-distributed Stochastic Neighbor Embedding)を使って特徴量を2次元に圧縮し、散布図として表示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.manifold import TSNE

# t-SNEを使って特徴量を2次元に圧縮
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)

# 散布図を描画
plt.figure(figsize=(8, 6))
for i in range(5):
plt.scatter(X_tsne[y[:, i] == 1, 0], X_tsne[y[:, i] == 1, 1], label=f'Religion {i+1}')
plt.legend()
plt.xlabel('t-SNE Dimension 1')
plt.ylabel('t-SNE Dimension 2')
plt.title('t-SNE Visualization - Religious Affiliation')
plt.show()

これにより、宗教の要因から宗教の選択を予測する多クラス分類問題を解くためのK近傍法モデルを構築し、性能評価とともに宗教の選択を2次元散布図で可視化しました。

ただし、実際のデータではさまざまな要因が複雑に絡み合うため、より多くの特徴量やより複雑なモデルを検討する必要があるかもしれません。

[実行結果]

ソースコード解説

このコードは、架空の宗教データを生成し、K近傍法(K-Nearest Neighbors)を使って多クラス分類モデルを構築し、その性能を評価する一連の処理を行っています。

また、t-SNEを用いて特徴量を2次元に圧縮し、宗教の選択を可視化しています。

具体的な処理について説明します。

1. 架空の宗教データの生成

make_multilabel_classification関数を使って、架空の宗教データを生成しています。
n_samplesでサンプル数、n_featuresで特徴量の数、n_classesでクラス数、n_labelsで各サンプルにおけるラベルの数(多クラス分類の場合は1以上)を指定しています。

2. 特徴量のスケーリング

StandardScalerを使って特徴量をスケーリングしています。
スケーリングを行うことで、特徴量の範囲を揃え、モデルの学習を安定化させることができます。

3. データの分割

train_test_splitを使って、トレーニングデータとテストデータにデータを分割しています。
トレーニングデータはモデルの学習に使用し、テストデータはモデルの性能評価に使用します。
test_sizeでテストデータの割合を指定します。

4. K近傍法モデルの初期化と学習

KNeighborsClassifierを使ってK近傍法モデルを初期化し、トレーニングデータを用いてモデルを学習させています。
n_neighborsで近傍点の数を指定します。

5. テストデータを用いた予測と評価

学習したK近傍法モデルを使って、テストデータの特徴量から宗教の選択を予測します。
予測結果と正解データを用いて、正解率、分類レポート、混同行列を計算し、結果を表示します。

6. t-SNEによる可視化

TSNEを使って特徴量を2次元に圧縮します。
次元圧縮を行うことで、多次元の特徴量を2次元にプロットし、可視化します。
散布図を描画し、各クラスごとに色分けして宗教の選択を可視化しています。

このコードは、架空の宗教データを使って多クラス分類モデルを構築し、その性能評価と特徴量の可視化を行っているものです。

ただし、架空のデータであるため、実際のデータに対してはより多くの試行と評価が必要です。

結果解説

この結果は、多クラス分類モデル(K近傍法)による宗教の選択の予測の評価結果です。

1. Accuracy(正解率): 0.30

  • 正解率は、全体の予測がどれだけ正確だったかを示す指標で、0から1までの値を取ります。
    この結果では、30%の正解率が得られています。
    つまり、全体の予測のうち、30%が正しく宗教の選択を予測できているということを意味します。

2. Classification Report(分類レポート):

  • 分類レポートは、各クラスごとに、precision(適合率)、recall(再現率)、f1-score(F1スコア)、support(サポート数)の評価指標を示しています。
  • precision: 正例と予測したサンプルのうち、実際に正例だった割合を示します。
    値が高いほど、偽陽性(誤って正と予測した場合)が少なくなります。
  • recall: 実際の正例のうち、正しく正例と予測できた割合を示します。
    値が高いほど、偽陰性(誤って負と予測した場合)が少なくなります。
  • f1-score: 適合率と再現率の調和平均であり、両者をバランスよく考慮した指標です。
    値が高いほど、適合率と再現率がバランス良く高いことを示します。
  • support: 各クラスのサンプル数を示します。

3. Confusion Matrix(混同行列):

  • 混同行列は、予測結果と実際のラベルの対応を示す行列です。行が実際のラベル、列が予測結果を表します。
  • 行列の (i, j) の要素は、実際のラベルが i であり、予測結果が j であったサンプル数を表します。

この結果を見ると、モデルの性能はあまり高くないことがわかります。

正解率が30%と低いため、全体的な予測があまり精度よくありません。

各クラスの適合率、再現率、f1-scoreを見ると、クラスごとにばらつきがあります。
特にクラス4の適合率、再現率、f1-scoreは低く、このクラスの予測が困難であることが示唆されます。


これらの結果を元にモデルの改善点を考えると、特徴量の選択や追加、モデルのハイパーパラメータの調整、より複雑なモデルの検討などが考えられます。

実際のデータに対しては、より多くの試行と評価が必要です。

アナフィラキシー scikit-learn

アナフィラキシー

アナフィラキシーに関する例題として、特定の症状やアレルギーの情報を使用して、ある人がアナフィラキシーを経験するかどうかを予測する二値分類タスクを考えます。

この例題では、scikit-learnを使用してランダムフォレストモデルを構築し、その結果をグラフ化します。

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
import pandas as pd
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 accuracy_score, confusion_matrix, roc_curve, roc_auc_score

# 乱数のシードを設定(再現性のため)
np.random.seed(42)

# サンプルデータの件数
num_samples = 100

# ランダムなサンプルデータを生成
age = np.random.randint(18, 80, num_samples)
gender = np.random.choice(['男性', '女性'], num_samples)
allergy_symptom_1 = np.random.randint(0, 2, num_samples)
allergy_symptom_2 = np.random.randint(0, 2, num_samples)
allergy_symptom_3 = np.random.randint(0, 2, num_samples)
anaphylaxis_experience = np.random.randint(0, 2, num_samples)

# データフレームに変換
data = pd.DataFrame({
'年齢': age,
'性別': gender,
'アレルギー症状1': allergy_symptom_1,
'アレルギー症状2': allergy_symptom_2,
'アレルギー症状3': allergy_symptom_3,
'アナフィラキシー経験': anaphylaxis_experience
})

# カテゴリカル変数をダミー変数化
data = pd.get_dummies(data, columns=['性別'])

# 特徴量とラベルに分割
X = data.drop('アナフィラキシー経験', axis=1)
y = data['アナフィラキシー経験']

# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ランダムフォレストモデルの構築
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

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

# 正解率の計算
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

# 混同行列の作成
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# ROC曲線とAUCの計算
y_prob = model.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_prob)
roc_auc = roc_auc_score(y_test, y_prob)
print("AUC:", roc_auc)

# 結果のグラフ化
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='b', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='gray', linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc='lower right')
plt.show()

このコードでは、ランダムフォレストモデルを構築し、テストデータで予測結果を評価しています。

また、ROC曲線AUCを計算してモデルの予測性能を評価し、結果をグラフ化しています。

上記のコードを実行すると、ランダムなサンプルデータに対するモデルの予測性能を確認することができます。

[実行結果]

ソースコード解説

このコードは、アナフィラキシーを経験するかどうかを予測するためのランダムフォレストモデルを構築し、その性能を評価して可視化するためのPythonコードです。

以下に各部分の説明を提供します:

1. ライブラリのインポート:

  • import pandas as pd:
    pandasライブラリをインポートし、データを扱うためのデータフレームを作成するために使用します。
  • import numpy as np:
    NumPyライブラリをインポートし、数値計算やランダムなサンプルデータの生成に使用します。
  • import matplotlib.pyplot as plt:
    Matplotlibライブラリをインポートし、グラフを描画するために使用します。
  • from sklearn.model_selection import train_test_split:
    scikit-learnのtrain_test_split関数をインポートし、データをトレーニングセットとテストセットに分割するために使用します。
  • from sklearn.ensemble import RandomForestClassifier:
    scikit-learnのRandomForestClassifierクラスをインポートし、ランダムフォレストモデルを構築するために使用します。
  • from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, roc_auc_score:
    scikit-learnの各種評価指標をインポートし、モデルの性能評価に使用します。

2. サンプルデータの生成:

  • np.random.seed(42):
    乱数のシードを設定して、再現性を確保します。
  • num_samples = 100:
    サンプルデータの件数を100件として設定します。
  • age, gender, allergy_symptom_1, allergy_symptom_2, allergy_symptom_3, anaphylaxis_experience:
    乱数を使用して、年齢や性別、アレルギー症状の有無、アナフィラキシーの経験をランダムに生成します。

3. サンプルデータをデータフレームに変換:

  • data = pd.DataFrame({ ... }):
    ランダムに生成したサンプルデータを辞書形式でデータフレームに変換します。
  • pd.get_dummies(data, columns=['性別']):
    性別のようなカテゴリカル変数をダミー変数化して、特徴量のデータを数値データに変換します。

4. データの前処理:

  • X = data.drop('アナフィラキシー経験', axis=1):
    特徴量を抽出します。
  • y = data['アナフィラキシー経験']:
    ラベル(アナフィラキシー経験の有無)を抽出します。
  • X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42):
    データをトレーニングセットとテストセットに分割します。

5. ランダムフォレストモデルの構築と評価:

  • model = RandomForestClassifier(random_state=42):
    ランダムフォレストモデルを構築します。
  • model.fit(X_train, y_train):
    モデルをトレーニングデータに適合させます。
  • y_pred = model.predict(X_test):
    テストデータで予測を行います。
  • accuracy = accuracy_score(y_test, y_pred):
    正解率を計算します。
  • conf_matrix = confusion_matrix(y_test, y_pred):
    混同行列を作成します。
  • y_prob = model.predict_proba(X_test)[:, 1]:
    テストデータに対するアナフィラキシーの経験の確率を予測します。
  • fpr, tpr, _ = roc_curve(y_test, y_prob):
    ROC曲線を計算します。
  • roc_auc = roc_auc_score(y_test, y_prob):
    AUCを計算します。

6. 結果のグラフ化:

  • plt.plot(fpr, tpr, ... ):
    ROC曲線をグラフ化します。
  • plt.xlabel('False Positive Rate'):
    X軸のラベルを設定します。
  • plt.ylabel('True Positive Rate'):
    Y軸のラベルを設定します。
  • plt.title('Receiver Operating Characteristic (ROC)'):
    グラフのタイトルを設定します。
  • plt.legend(loc='lower right'):
    グラフに凡例を表示します。
  • plt.show():
    グラフを表示します。

これにより、ランダムフォレストモデルの性能評価が実行され、ROC曲線が可視化されます。

結果解説

結果を詳しく説明します。

1. 正解率 (Accuracy): 0.35

正解率は、モデルが全体の予測において正確だった割合を示します。
この値は0から1の間で取ることができます。
今回の結果では、正解率が0.35(または35%)となっています。
つまり、テストセットに対してモデルの予測が正確だった割合は35%であることを意味します。

2. 混同行列 (Confusion Matrix):

混同行列は、モデルの予測結果と実際の真のラベルとの一致状況を示す行列です。
この行列は4つの要素から構成されます。

  • 真陽性 (True Positive, TP): 正しくアナフィラキシーを経験したと予測されたサンプル数 (5)
  • 偽陽性 (False Positive, FP): アナフィラキシーを経験していないのに誤ってアナフィラキシーを経験したと予測されたサンプル数 (7)
  • 真陰性 (True Negative, TN): 正しくアナフィラキシーを経験していないと予測されたサンプル数 (2)
  • 偽陰性 (False Negative, FN): アナフィラキシーを経験したのに誤ってアナフィラキシーを経験していないと予測されたサンプル数 (6)

今回の混同行列の結果は以下のようになっています:

1
2
[[2 7]
[6 5]]

この結果から、実際にアナフィラキシーを経験しているグループに対しては、5つのサンプルを正確に予測し、6つのサンプルを誤って予測しています。
一方、実際にアナフィラキシーを経験していないグループに対しては、2つのサンプルを正確に予測し、7つのサンプルを誤って予測しています。

3. AUC (Area Under the Curve): 0.43434343434343436

AUCは、ROC曲線(Receiver Operating Characteristic curve)の下の面積を示す値です。
ROC曲線は、真陽性率(True Positive Rate, TPR)に対する偽陽性率(False Positive Rate, FPR)の変化を表現します。

AUCは、モデルの分類性能を評価する指標で、0から1の間の値を取ります。
AUCが0.5に近いほど、モデルの分類性能がランダムに近くなります。
今回の結果では、AUCが約0.43であるため、モデルの性能はランダムに近いと評価されます。

この結果から、現在のモデルはアナフィラキシーの経験を予測するにはあまり精度が高くなく、改善の余地があると考えられます。

モデルの性能向上のためには、特徴量の選択やエンジニアリング、ハイパーパラメータの調整、より大きなデータセットの使用などが考えられます。

物流 scikit-learn

物流

物流の例題として、「ある企業が複数の倉庫から商品を顧客へ配送する場合の最適なルート設計」を考えてみましょう。

この問題は、倉庫と顧客の位置情報を元に、最短距離を通るルートを見つける問題として解釈できます。

ここでは、scikit-learnのKMeansクラスタリングアルゴリズムを使用して、倉庫と顧客をクラスタリングし、それぞれのクラスタの重心(倉庫の位置)とクラスタ内の各顧客との距離を求める方法を示します。

なお、本来の物流問題はより複雑であり、現実的なソリューションにはさまざまな要素(ルートの容量、交通状況、顧客の要求など)が含まれますが、ここでは単純化した例題を取り扱います。


以下はPythonコードでの例示です。

なお、numpymatplotlibも使用しますので、事前にインストールしてください。

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
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# データの作成(仮想的な倉庫と顧客の位置情報)
np.random.seed(0)
n_warehouses = 3
n_customers = 10
data = np.vstack((
np.random.rand(n_warehouses, 2) * 10, # 倉庫の位置情報 (x, y)
np.random.rand(n_customers, 2) * 10 # 顧客の位置情報 (x, y)
))

# KMeansクラスタリング
n_clusters = n_warehouses
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(data)
centers = kmeans.cluster_centers_ # 倉庫の位置

# グラフ化
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_, cmap='rainbow')
plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=200, c='black', label='Warehouses')
plt.legend()
plt.title('Warehouse Location and Customer Clustering')
plt.xlabel('X-coordinate')
plt.ylabel('Y-coordinate')
plt.grid(True)
plt.show()

このコードでは、倉庫と顧客の位置情報をランダムに生成し、KMeansアルゴリズムを使用してクラスタリングしています。

グラフでは、倉庫と顧客を異なる色でプロットし、倉庫の位置を「X」マークで示しています。

[実行結果]

ソースコード解説

このコードは、Pythonを使用して物流の例題を扱い、scikit-learnmatplotlibを使ってデータのクラスタリングとグラフ化を行っています。

以下、各部分の詳細な説明を行います。

1. ライブラリのインポート:

1
2
3
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
  • numpyは数値計算を行う際の基本的なライブラリです。
  • matplotlib.pyplotはデータの可視化のためのライブラリで、グラフのプロットに使用します。
  • sklearn.cluster.KMeansは、scikit-learnライブラリのKMeansクラスタリングアルゴリズムを提供します。

2. データの作成:

1
2
3
4
5
6
7
np.random.seed(0)
n_warehouses = 3
n_customers = 10
data = np.vstack((
np.random.rand(n_warehouses, 2) * 10, # 倉庫の位置情報 (x, y)
np.random.rand(n_customers, 2) * 10 # 顧客の位置情報 (x, y)
))
  • np.random.seed(0)は、ランダムなデータを生成する際に再現性を持たせるための乱数シードを設定しています。
  • n_warehousesは倉庫の数を表し、n_customersは顧客の数を表します。
  • np.random.rand(n_warehouses, 2) * 10np.random.rand(n_customers, 2) * 10は、それぞれ倉庫と顧客の位置情報を2次元のランダムな座標(x, y)で生成しています。
    * 10は生成される座標を0から10の範囲にスケーリングするためです。

3. KMeansクラスタリング:

1
2
3
4
n_clusters = n_warehouses
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(data)
centers = kmeans.cluster_centers_ # 倉庫の位置
  • n_clustersには倉庫の数が設定されています。
    これは、KMeansアルゴリズムがデータを指定されたクラスタ数に分割するために使用されます。
  • KMeans(n_clusters=n_clusters)でKMeansクラスタリングのインスタンスを作成し、fitメソッドでデータをクラスタリングします。
  • kmeans.cluster_centers_は、クラスタの重心(倉庫の位置)を表すNumPy配列として取得されます。

4. グラフ化:

1
2
3
4
5
6
7
8
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_, cmap='rainbow')
plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=200, c='black', label='Warehouses')
plt.legend()
plt.title('Warehouse Location and Customer Clustering')
plt.xlabel('X-coordinate')
plt.ylabel('Y-coordinate')
plt.grid(True)
plt.show()
  • plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_, cmap='rainbow')は、倉庫と顧客の位置情報を散布図としてプロットします。
    c=kmeans.labels_により、各データポイントのクラスタラベルを表す色が自動的に割り当てられます。
  • plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=200, c='black', label='Warehouses')は、倉庫の位置情報を「X」マークでプロットします。
  • plt.legend()で凡例を表示します。
    ここでは、「Warehouses」というラベルを使っています。
  • plt.title('Warehouse Location and Customer Clustering')plt.xlabel('X-coordinate')plt.ylabel('Y-coordinate')は、それぞれグラフのタイトルとx軸、y軸のラベルを設定します。
  • plt.grid(True)でグリッドを表示します。
  • plt.show()は、作成したグラフを表示します。

これにより、倉庫と顧客の位置情報をクラスタリングして、それぞれの位置を可視化することができます。

結果解説

上記の例題では、3つの倉庫と10人の顧客の位置情報を用いてKMeansクラスタリングを行いました。
結果として得られたグラフを解釈します。

グラフでは、データポイントが2次元空間上にプロットされており、異なる色で示されています。

ここで、色の違いはKMeansによって割り当てられたクラスタを表しています。

クラスタ数は倉庫の数に設定しましたので、3つのクラスタがあります。

また、Xマークで示されたデータポイントが各クラスタの中心点を表しています。

これは倉庫の位置を示しており、3つの倉庫がそれぞれのクラスタ内で最も重要な位置を占めていることが分かります。


結果の解釈:

1. 倉庫の位置:

Xマークで示されている3つの点が、倉庫の位置を表しています。
これらの点は、クラスタリングによってデータの中心に近い位置に配置されているため、最適な倉庫の位置となります。
これらの倉庫が、顧客への商品配送の拠点として選ばれるでしょう。

2. 顧客の位置:

グラフ上のXマーク以外のデータポイントは、顧客の位置を表しています。
これらの点は、それぞれ最も近い倉庫に配送されることになります。
異なる色のクラスタに属する顧客は、異なる倉庫に配送されることが予想されます。

この結果を元に、企業は倉庫と顧客の位置を適切に設計し、各倉庫からの最適なルートを計画することができます。

ただし、実際の物流問題ではさらに多くの要素を考慮する必要があるため、より複雑なアルゴリズムや手法を用いて最適解を求めることが一般的です。

ユーザー行動予測 scikit-learn

ユーザー行動予測

ユーザー行動予測の例題として、「オンラインショッピングサイトのユーザーが特定の商品を購入するかどうかを予測する」という問題を取り上げます。

これは二値分類の問題であり、ユーザーの属性や過去の行動履歴を元に、購入行動の有無を予測することが目標です。

ここでは、サンプルとしてランダムに生成したデータを使ってscikit-learnのロジスティック回帰モデルを使用して予測を行います。

まずは必要なライブラリをインポートし、データを生成しましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# データの生成
np.random.seed(42)
num_samples = 200
user_attributes = np.random.rand(num_samples, 2)
user_behavior = np.random.randint(0, 2, num_samples)

# データを学習用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(user_attributes, user_behavior, test_size=0.2, random_state=42)

次に、ロジスティック回帰モデルを学習させ、テストデータでの予測を行います。

1
2
3
4
5
# ロジスティック回帰モデルの学習と予測
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)

予測の性能を評価するために、正解率や混同行列を計算してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 正解率の計算
accuracy = accuracy_score(y_test, y_pred)
print("正解率:", accuracy)

# 混同行列の表示
conf_matrix = confusion_matrix(y_test, y_pred)
print("混同行列:")
print(conf_matrix)

# 分類レポートの表示
class_report = classification_report(y_test, y_pred)
print("分類レポート:")
print(class_report)

最後に、結果をグラフ化してみましょう。データ点を散布図で表示し、モデルが予測した境界線を描画します。

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
# グラフ化
plt.figure(figsize=(8, 6))
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.Paired, label="Training Data")
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.Paired, marker='x', label="Test Data")

# 境界線の描画
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

# メッシュグリッドの生成
xx = np.linspace(xlim[0], xlim[1], 100)
yy = np.linspace(ylim[0], ylim[1], 100)
XX, YY = np.meshgrid(xx, yy)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = model.decision_function(xy).reshape(XX.shape)

# 境界線を描画
ax.contour(XX, YY, Z, levels=[0], linewidths=2, colors='red')

plt.xlabel('Attribute 1')
plt.ylabel('Attribute 2')
plt.title('User Behavior Prediction')
plt.legend()
plt.show()

このコードは、ユーザー行動予測のためのロジスティック回帰モデルを使用して、属性情報を元に購入行動の有無を予測し、その結果をグラフで視覚化しています。

[実行結果]

ソースコード解説

このソースコードは、ユーザー行動予測の問題を解くために、ランダムに生成したデータを使ってロジスティック回帰モデルを学習し、その性能を評価するプログラムです。

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

1. データの生成:

ユーザー行動予測のためのデータをランダムに生成します。
np.random.rand関数を使って、2つの属性を持つ200個のサンプル (num_samples = 200) を生成し、それぞれのサンプルに対して0または1のランダムなラベルを割り当てます。user_attributesは2つの属性を持つ特徴量の行列であり、user_behaviorは0または1のラベルを持つベクトルです。

2. データの学習とテストへの分割:

train_test_split関数を使って、生成したデータを学習データ (X_train, y_train) とテストデータ (X_test, y_test) に分割します。
ここでは、全体の20%をテストデータとして使用しています。

3. ロジスティック回帰モデルの学習と予測:

LogisticRegressionクラスを用いて、ロジスティック回帰モデルを作成し、学習データを使ってモデルを学習します。
fitメソッドによりモデルが学習されます。
その後、テストデータを使ってモデルの予測を行い、予測結果をy_predに格納します。

4. 正解率の計算:

accuracy_score関数を使って、モデルの予測結果と真のラベル (y_test) を比較し、正解率を計算します。
正解率は全てのサンプルのうち、正しく予測できたサンプルの割合を示します。

5. 混同行列の表示:

confusion_matrix関数を使って、モデルの予測結果と真のラベルを元に混同行列を計算します。
混同行列は、予測がどれだけ正確であるかを評価する際に有用な情報を提供します。

6. 分類レポートの表示:

classification_report関数を使って、適合率 (precision)、再現率 (recall)、F1スコア (F1-score)、およびサポート (support) を含む分類レポートを表示します。
これらの指標は、各クラスごとにモデルの性能を評価するために使われます。

7. グラフ化:

matplotlibを使って、学習データとテストデータの散布図を表示します。
また、ロジスティック回帰モデルが予測した境界線を赤色で描画しています。
これにより、モデルがどのようにデータを分類しているかを視覚的に理解できます。

最終的に、このコードはランダムに生成したデータを使ってロジスティック回帰モデルを学習し、モデルの性能を評価するための各種指標を表示し、データの可視化を行っています。

これにより、ユーザー行動予測モデルの性能を把握することができます。

結果解説

以下にそれぞれの評価指標について詳しく説明します。

1. 正解率 (Accuracy):

正解率は、全てのサンプルのうち、正しく分類されたサンプルの割合を示します。
この場合の正解率は0.525 (または 52.5%) です。正解率が高いほど、モデルの予測精度が高いことを意味します。
ただし、この値だけでモデルの性能を判断するのは注意が必要で、他の指標と併せて評価することが重要です。

2. 混同行列 (Confusion Matrix):

混同行列は、モデルが予測したクラスと真のクラスのペアを示す行列です。
この混同行列は2x2の行列で、以下のように解釈されます:

  • 左上のセル (True Negative): 13個のサンプルがクラス0と予測され、実際にクラス0であった。
  • 右上のセル (False Positive): 11個のサンプルがクラス1と予測され、実際はクラス0であった。
  • 左下のセル (False Negative): 8個のサンプルがクラス0と予測され、実際はクラス1であった。
  • 右下のセル (True Positive): 8個のサンプルがクラス1と予測され、実際にクラス1であった。

3. 分類レポート (Classification Report):

分類レポートは、クラスごとの適合率 (precision)、再現率 (recall)、F1スコア (F1-score)、およびサポート (support) を示す表です。

  • 適合率 (Precision):
    正しく分類された陽性サンプル (True Positive) の割合を示します。
    クラス0の適合率は0.62であり、クラス1の適合率は0.42です。
    適合率が高いほど、陽性と予測されたサンプルが実際に陽性である確率が高いことを意味します。

  • 再現率 (Recall):
    実際に陽性のサンプルのうち、正しく分類された割合を示します。
    クラス0の再現率は0.54であり、クラス1の再現率は0.50です。
    再現率が高いほど、実際に陽性であるサンプルを見逃さずに予測できることを意味します。

  • F1スコア (F1-score):
    適合率と再現率の調和平均です。
    F1スコアは、適合率と再現率のバランスを取る指標として使われます。
    クラス0のF1スコアは0.58であり、クラス1のF1スコアは0.46です。

  • サポート (Support):
    各クラスに属するサンプルの数を示します。
    クラス0には24個のサンプルがあり、クラス1には16個のサンプルがあります。

総合的に見ると、このユーザー行動予測モデルは、精度やF1スコアなどの評価指標が比較的低いため、改善の余地があると言えます。

モデルの性能を向上させるためには、より適切な特徴量の選択やモデルの調整、データの前処理などが必要かもしれません。

貿易関係ネットワーク分析 scikit-learn

貿易関係ネットワーク分析

貿易関係ネットワーク分析の例題として、いくつかの国とそれらの国々間の貿易量を示す仮想的なデータを用いて、scikit-learnでネットワーク分析を行います。

ここでは、ネットワークの可視化にはNetworkXMatplotlibを使用します。

まずは以下のスクリプトを使ってデータを生成してみましょう:

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
Copy code
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

# 仮想的な貿易量のデータを作成
countries = ['USA', 'China', 'Japan', 'Germany', 'UK']
trade_data = np.array([[0, 100, 50, 80, 20],
[100, 0, 70, 40, 10],
[50, 70, 0, 60, 30],
[80, 40, 60, 0, 50],
[20, 10, 30, 50, 0]])

# ネットワークの可視化用のグラフを作成
G = nx.from_numpy_matrix(trade_data, create_using=nx.Graph())

# ノードに国名を割り当てる
node_labels = {i: countries[i] for i in range(len(countries))}

# グラフを描画
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G, seed=42) # ノードの位置を決定
nx.draw(G, pos, with_labels=True, labels=node_labels, node_size=1000, node_color='skyblue', font_size=10)
edge_labels = {(i, j): trade_data[i][j] for i in range(len(countries)) for j in range(len(countries)) if trade_data[i][j] > 0}
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8)

plt.title('Trade Relationship Network')
plt.show()

このスクリプトでは、仮想的な貿易量のデータを作成し、それをネットワークXのグラフに変換しています。

ノードは各国を表し、エッジはそれらの国々間の貿易量を示しています。

ノードの色が青く、ノード間のエッジには貿易量が表示されます。

実行すると、可視化された貿易関係のネットワークが表示されますす。

ネットワークの構造を確認し、各国の貿易関係を分析することができます。

[実行結果]

なお、この例ではデータを手動で作成していますが、実際の貿易データを用いて同様のネットワーク分析を行うことも可能です。

顧客離反予測(チャーン予測) scikit-learn

顧客離反予測(チャーン予測)

顧客離反予測(チャーン予測)の例題として、以下のようなシナリオを考えます:

あるテレコム会社があり、顧客の情報と過去の利用データが得られています。

これを使って、顧客が離反するかどうかを予測し、リテンション戦略を立てたいとします。

scikit-learnを使ってロジスティック回帰モデルを構築し、結果をグラフ化してみましょう。

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
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve

# ダミーデータを生成するための関数(仮想的なデータです)
def generate_dummy_data(n_samples=1000):
np.random.seed(42)
age = np.random.normal(40, 10, n_samples)
usage_months = np.random.randint(1, 25, n_samples)
monthly_expense = np.random.normal(100, 50, n_samples)
churn = np.random.randint(0, 2, n_samples)

data = pd.DataFrame({'Age': age, 'UsageMonths': usage_months, 'MonthlyExpense': monthly_expense, 'Churn': churn})
return data

# ダミーデータを生成
data = generate_dummy_data()

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

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

# ロジスティック回帰モデルを構築
model = LogisticRegression()
model.fit(X_train, y_train)

# テストデータを用いて予測
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1] # 予測確率を取得

# ROC曲線をプロットして結果を可視化
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = roc_auc_score(y_test, y_prob)

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='blue', lw=2, label='ROC curve (AUC = {:.2f})'.format(roc_auc))
plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()

上記のコードでは、ダミーデータを作成してロジスティック回帰モデルを構築し、ROC曲線をプロットしています。

ROC曲線はモデルの性能を評価する際によく用いられる指標で、AUC (Area Under the Curve) の値が高いほど優れた予測モデルと言えます。

[実行結果]

ソースコード解説

上記のコードは、ロジスティック回帰モデルを使用して顧客離反予測(チャーン予測)を行い、その結果をROC曲線を用いて可視化しています。

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

  1. ダミーデータを生成する関数 generate_dummy_data:

    • この関数は仮想的なデータを生成するためのもので、乱数を使って顧客の年齢 (Age)、利用期間 (UsageMonths)、月間支出 (MonthlyExpense)、および離反したかどうかを表すターゲット変数 (Churn) を作成します。
  2. ダミーデータの生成:

    • generate_dummy_data() 関数を呼び出して、ダミーデータを生成します。このデータは data という名前のPandas DataFrameに保存されます。
  3. 特徴量とターゲットの分割:

    • X = data.drop('Churn', axis=1) で特徴量 (Age, UsageMonths, MonthlyExpense) を取得します。
    • y = data['Churn'] でターゲット変数 Churn(離反したかどうかを表すラベル)を取得します。
  4. 訓練データとテストデータの分割:

    • train_test_split() を使ってデータを訓練データとテストデータに分割します。テストデータは全体の20%に設定されており、random_state=42 で乱数シードを固定して再現性を保証しています。
  5. ロジスティック回帰モデルの構築と学習:

    • LogisticRegression() を使用してロジスティック回帰モデルを初期化し、fit() メソッドで訓練データに適合させます。
  6. テストデータを用いた予測:

    • predict() メソッドを使用して、テストデータの特徴量を用いて離反の予測を行います。
    • predict_proba() メソッドを使用して、各テストサンプルがクラス1(離反)に属する確率を取得します。
  7. ROC曲線のプロットと結果の可視化:

    • roc_curve() 関数を用いて、予測確率と真のターゲット値を用いてROC曲線のデータを取得します。
    • roc_auc_score() 関数を用いて、ROC曲線の下の面積 (AUC) を計算します。
    • plt.figure() でグラフのサイズを設定し、plt.plot() を用いてROC曲線を描画します。
    • plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--') は対角線を描画し、ランダムな予測の場合の参考として用います。
    • ラベル、軸の範囲、タイトルなどのグラフの詳細設定を行います。
    • 最後に plt.show() でグラフを表示します。

結果として、ROC曲線が表示されます。

この曲線は、モデルの性能評価に使用され、AUCスコアが曲線下の面積を示します。

AUCが高いほど、モデルの性能が良いとされます。

結果解説

表示されるグラフは「Receiver Operating Characteristic (ROC) Curve(受信者動作特性曲線)」です。

ROC曲線は、二値分類モデル(ここではロジスティック回帰モデル)の性能評価に用いられるグラフで、以下の要素で構成されています:

  • X軸(横軸): False Positive Rate (FPR)

    • FPRは、実際には陰性(クラス0)であるもののうち、モデルが陽性(クラス1)と誤って予測したサンプルの割合を示します。計算式は FPR = FP / (FP + TN) であり、FPは偽陽性の数、TNは真陰性の数です。
  • Y軸(縦軸): True Positive Rate (TPR) または Recall

    • TPRは、実際には陽性(クラス1)であるもののうち、モデルが陽性と正しく予測したサンプルの割合を示します。計算式は TPR = TP / (TP + FN) であり、TPは真陽性の数、FNは偽陰性の数です。

ROC曲線の解釈:

  • 曲線の左下に近いほど、FPRが低く、真陰性率が高くなりますが、偽陽性率が高くなる傾向があります。
  • 曲線の右上に近いほど、FPRが高く、真陽性率が高くなりますが、偽陰性率が低くなる傾向があります。

AUC (Area Under the Curve):

  • ROC曲線の下の面積をAUCと呼びます。AUCは0から1の間の値を取り、モデルの性能を評価する指標です。

AUCが1に近いほど、モデルの性能が優れていると言えます。

このグラフを見ることで、モデルの性能がどれくらい優れているかが把握できます。

AUCが高いほど、モデルの予測精度が高いと言えます。ROC曲線が左上に近いほど、優れた分類モデルと言えます。

リハビリテーション支援 scikit-learn

リハビリテーション支援

リハビリテーション支援の例として、患者のリハビリテーション進捗データを使用して、適切な運動プランを提案する問題を考えます。

データには、患者の週ごとのリハビリテーションの目標と実績のデータが含まれています。

scikit-learnを使用して、患者の週ごとのリハビリテーション進捗を予測し、運動プランを提案するモデルを構築します。

まず、仮想的なデータを生成して、問題を定義します:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 仮想的なリハビリテーション進捗データの生成
np.random.seed(0)
weeks = np.arange(1, 11)
target_progress = np.random.randint(10, 50, size=len(weeks))
actual_progress = target_progress + np.random.randint(-5, 5, size=len(weeks))

# データフレームに格納
rehab_data = pd.DataFrame({'Week': weeks, 'Target Progress': target_progress, 'Actual Progress': actual_progress})

# データの表示
print(rehab_data)

データを生成したら、線形回帰を使用してリハビリテーション進捗を予測し、結果をグラフ化します:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 線形回帰モデルの構築
X = rehab_data['Week'].values.reshape(-1, 1)
y = rehab_data['Actual Progress'].values
model = LinearRegression()
model.fit(X, y)

# 予測した進捗データの生成
predicted_progress = model.predict(X)

# グラフ化
plt.scatter(weeks, actual_progress, label='Actual Progress', color='b')
plt.plot(weeks, predicted_progress, label='Predicted Progress', color='r')
plt.xlabel('Week')
plt.ylabel('Rehabilitation Progress')
plt.title('Rehabilitation Progress Prediction')
plt.legend()
plt.show()

このコードでは、線形回帰を用いて週ごとのリハビリテーション進捗を予測しています。

散布図で実績の進捗を青で、予測した進捗を赤で表示します。グラフを通じて、リハビリテーションの進捗を予測することができます。

実際のデータを使用する場合は、適切なデータセットを用意してください。

[実行結果]

ソースコード解説

このソースコードは、リハビリテーション支援の例として、患者のリハビリテーション進捗データを使用して、週ごとの実績の進捗を予測し、結果をグラフ化するものです。

以下、各部分の詳細な説明です:

1. import文:必要なライブラリをインポートしています。

  • numpynp): 数値計算のためのライブラリ。
  • pandaspd): データフレーム操作のためのライブラリ。
  • matplotlib.pyplotplt): グラフ描画のためのライブラリ。
  • LinearRegression(線形回帰モデル): scikit-learnの線形回帰モデルを使用するためのクラス。

2. データ生成:

  • np.random.seed(0): 乱数のシードを設定して再現性を持たせます。
  • weeks = np.arange(1, 11): 1から10までの週の数値を生成し、weeksに代入します。
  • target_progress = np.random.randint(10, 50, size=len(weeks)): 10から49までのランダムな整数をweeksの数だけ生成し、target_progressに代入します。
  • actual_progress = target_progress + np.random.randint(-5, 5, size=len(weeks)): target_progressに対して、-5から5までのランダムな整数を足して、actual_progressに代入します。

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

  • pd.DataFrame: weekstarget_progressactual_progressを列とするデータフレームrehab_dataを作成します。

4. データ表示:

  • print(rehab_data): rehab_dataを表示します。生成されたリハビリテーション進捗データが表示されます。

5. 線形回帰モデルの構築:

  • X = rehab_data['Week'].values.reshape(-1, 1): rehab_dataの’Week’列を入力データXとして取得し、1次元の配列から2次元の行列に変形します。
  • y = rehab_data['Actual Progress'].values: rehab_dataの’Actual Progress’列をターゲットデータyとして取得します。
  • model = LinearRegression(): 線形回帰モデルのインスタンスを作成します。
  • model.fit(X, y): モデルをデータに適合させます(トレーニング)。

6. 予測した進捗データの生成:

  • predicted_progress = model.predict(X): モデルを使用して、Xを入力として実績の進捗を予測し、predicted_progressに代入します。

7. グラフ化:

  • plt.scatter(weeks, actual_progress, label='Actual Progress', color='b'): 実際の進捗を青い散布図としてプロットします。
  • plt.plot(weeks, predicted_progress, label='Predicted Progress', color='r'): 予測した進捗を赤い線でプロットします。
  • plt.xlabel('Week'): x軸のラベルを設定します。
  • plt.ylabel('Rehabilitation Progress'): y軸のラベルを設定します。
  • plt.title('Rehabilitation Progress Prediction'): グラフのタイトルを設定します。
  • plt.legend(): 凡例を表示します。
  • plt.show(): グラフを表示します。

最終的に、実際の進捗を青い散布図で表し、線形回帰モデルによって予測された進捗を赤い線で表すグラフが描画されます。

結果解説

線形回帰モデルを使用して実績の進捗を予測し、その結果をグラフ化しました。

実際の進捗(青の散布図)と、線形回帰モデルによる予測された進捗(赤の線)が表示されます。

結果として、赤い線が青い点に近いことから、線形回帰モデルが実績の進捗をうまく予測していることが分かります。


この例では、10週間のリハビリテーション進捗データを用いて、線形回帰モデルにより次の週の進捗を予測しています。

実際のデータを使用する場合は、より多くのデータポイントを持つデータセットを使用することで、より精度の高い予測が期待できます。

また、他の機械学習アルゴリズムを試すことも検討すると良いでしょう。

レシピの評価 PyTorch

レシピの評価

PyTorchを使用してレシピの評価を行うためのサンプルコードを提供します。

ここでは、レシピの評価を予測するための単純なニューラルネットワークを訓練します。

この例では、レシピの特徴(例えば、調理時間、使用される食材の数、ステップの数など)を入力として使用し、評価(星の数)を出力として予測します。

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

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

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

1
2
3
4
5
6
7
8
9
10
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(3, 5) # 3 input features, 5 hidden nodes
self.fc2 = nn.Linear(5, 1) # 5 hidden nodes, 1 output node for rating

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

次に、訓練データとテストデータを定義します。ここでは、ダミーデータを使用します。

1
2
3
4
5
6
# Dummy data
train_features = torch.rand(100, 3) # 100 recipes, 3 features each
train_ratings = torch.randint(1, 6, (100, 1)).float() # ratings from 1 to 5

test_features = torch.rand(20, 3) # 20 recipes, 3 features each
test_ratings = torch.randint(1, 6, (20, 1)).float() # ratings from 1 to 5

次に、ネットワークを訓練します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
net = Net()
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)

# Store losses for plotting
losses = []

for epoch in range(500): # number of epochs
optimizer.zero_grad()
outputs = net(train_features)
loss = criterion(outputs, train_ratings)
loss.backward()
optimizer.step()

losses.append(loss.item())

# Plot the loss over time
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()

最後に、テストデータを使用してネットワークの性能を評価します。

1
2
3
4
5
with torch.no_grad():
predictions = net(test_features)
loss = criterion(predictions, test_ratings)

print('Test loss: ', loss.item())
[実行結果]

このコードは、レシピの評価を予測するための基本的なニューラルネットワークを訓練します。

実際の問題では、より多くの特徴量を使用し、より複雑なネットワークを訓練することがあります。

また、データの前処理や特徴量の選択、ハイパーパラメータの調整など、さまざまな手法を使用してモデルの性能を向上させることが可能です。

ソースコード解説

このコードは、PyTorchを使用して評価データを元にレシピの評価を予測するためのニューラルネットワークモデルを定義し、学習とテストを行っています。

以下では、処理の各ステップを詳しく説明します。

1. モデルの定義:

Netクラスは、3つの入力特徴を持つニューラルネットワークを定義しています。
1つ目の隠れ層には5つのノードがあります。
forwardメソッドは、入力データを順伝播させるための関数です。
1つ目の隠れ層の活性化関数にReLU(Rectified Linear Unit)を使用しています。

2. ダミーデータの作成:

ランダムな特徴量とランダムな評価を持つ100個のトレーニング用レシピデータと20個のテスト用レシピデータを作成しています。
特徴量は各レシピに対する入力データであり、評価は各レシピのターゲット(正解ラベル)です。

3. モデルの学習:

Netモデルを初期化し、平均二乗誤差(MSE)を損失関数、SGD(Stochastic Gradient Descent)をオプティマイザとして使用しています。
500エポック(学習回数)を実行し、各エポックの損失を保存しています。
モデルのパラメータはoptimizer.step()によって更新されます。

4. 損失のプロット:

学習中の損失値をプロットしています。
エポック数が増えるにつれて損失が減少することが期待されます。
損失のグラフを確認することで、学習が進行するにつれてモデルのパフォーマンスが向上しているかどうかを視覚的に確認できます。

5. テスト:

学習が完了した後、モデルを使用してテストデータを予測します。
テストデータの予測結果と実際の評価との間のMSE(平均二乗誤差)を計算しています。
MSEは予測と実際の評価の差を表す指標であり、予測精度を評価する際に一般的に使用されます。

コード全体の実行結果として、学習中の損失がグラフ化され、テストデータに対する予測誤差(MSE)が表示されます。
学習が進行するにつれて損失が減少し、テストデータに対する予測がどの程度の精度で行われるかがわかります。
また、MSEの値が小さいほど予測が正確であることを意味します。

結果解説

このコードを実行すると、以下の結果が表示されます。

1. グラフ: 損失のプロット

  • グラフが表示されます。
    x軸はエポック数を表し、y軸は損失値(MSE)を表します。
    エポック数が増えるにつれて損失がどのように減少しているかを示します。
    学習が進行するにつれて損失が減少することが期待されます。
    損失が減少し続けることで、モデルがトレーニングデータに適応していることが示されます。

2. テスト損失の値

  • 学習が完了した後、テストデータを用いてモデルの評価を行います。
    その結果として、テストデータに対する予測と実際の評価との間のMSE(平均二乗誤差)が表示されます。
    MSEは予測と実際の評価の差を表す指標であり、値が小さいほど予測が正確であることを示します。
    テスト損失の値が小さい場合は、モデルがテストデータに対してより正確な予測を行っていることを示します。

なお、具体的な数値によって結果がどのように表示されるかはデータや学習の状況により異なりますが、一般的には損失のグラフが学習回数に応じて減少し、テスト損失が小さくなることが期待されます。

これは、モデルがデータに適応し、過学習(オーバーフィッティング)を避けるように学習が進行していることを示します。

信用リスク評価 PyTorch

信用リスク評価

信用リスク評価のためのPyTorchのサンプルコードを提供します。

以下のコードは、単純なニューラルネットワークを使用して二値分類(信用リスクあり/なし)を行います。

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
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

# データの準備(仮のデータ)
# 例として、収入と借入金額を特徴量とし、信用リスクの有無をラベルとします
income = torch.tensor([100, 50, 75, 125, 80, 90, 60, 95, 120, 115], dtype=torch.float32)
debt = torch.tensor([0, 100, 50, 200, 150, 50, 100, 80, 150, 180], dtype=torch.float32)
labels = torch.tensor([0, 1, 0, 1, 1, 0, 1, 0, 1, 1], dtype=torch.float32)

# ニューラルネットワークの定義
class CreditRiskModel(nn.Module):
def __init__(self):
super(CreditRiskModel, self).__init__()
self.fc1 = nn.Linear(2, 5)
self.fc2 = nn.Linear(5, 1)
self.sigmoid = nn.Sigmoid()

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

# モデルの初期化
model = CreditRiskModel()

# 損失関数と最適化アルゴリズムの定義
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 学習ループ
losses = []
for epoch in range(100):
# フォワードプロパゲーション
outputs = model(torch.stack([income, debt], dim=1))
loss = criterion(outputs.squeeze(), labels)

# バックワードプロパゲーションとパラメータの更新
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 損失の記録
losses.append(loss.item())

# 損失のグラフ表示
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()

# 予測結果のグラフ表示
with torch.no_grad():
predictions = model(torch.stack([income, debt], dim=1)).squeeze().numpy()
plt.scatter(income.numpy(), debt.numpy(), c=predictions, cmap='coolwarm')
plt.xlabel('Income')
plt.ylabel('Debt')
plt.title('Credit Risk Evaluation')
plt.colorbar(label='Predicted Probability')
plt.show()

このコードでは、収入と借入金額を特徴量とし、信用リスクの有無をラベルとしています。

ニューラルネットワークを定義し、損失関数と最適化アルゴリズムを設定しています。

学習ループを通じてモデルをトレーニングし、損失の推移をグラフ化しています。

また、最終的な予測結果をグラフ化しています。

予測結果は、収入と借入金額の散布図として表示され、色の濃淡で予測された確率が示されます。

[実行結果]


このサンプルコードは、単純な信用リスク評価の例です。

実際の信用リスク評価には、より多くの特徴量やより複雑なモデルが必要になる場合があります。

また、データの前処理やモデルのチューニングも重要な要素です。

ご参考までに、このサンプルコードをベースにして、実際のデータセットやより複雑なモデルを使用して信用リスク評価を行うことができます。



ソースコード解説

このソースコードは、PyTorchを使用して簡単な信用リスク評価モデルを構築し、学習・評価するためのコードです。

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

1. 必要なライブラリのインポート

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

この部分では、PyTorchのモジュールとMatplotlibをインポートしています。

PyTorchはニューラルネットワークの構築と学習に使用され、Matplotlibは学習中の損失値の可視化と予測結果のグラフ表示に使用されます。

2. データの準備

1
2
3
income = torch.tensor([100, 50, 75, 125, 80, 90, 60, 95, 120, 115], dtype=torch.float32)
debt = torch.tensor([0, 100, 50, 200, 150, 50, 100, 80, 150, 180], dtype=torch.float32)
labels = torch.tensor([0, 1, 0, 1, 1, 0, 1, 0, 1, 1], dtype=torch.float32)

この部分では、学習に使用する仮のデータを定義しています。

incomeは収入を示す特徴量、debtは借入金額を示す特徴量、labelsはそれに対応する信用リスクの有無を示すラベルです。

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

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

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

この部分では、CreditRiskModelという名前のカスタムのPyTorchモデルを定義しています。

モデルは全結合層(Linear)で構成され、2つの入力ユニット(特徴量が2つ)から5つのユニットを持つ隠れ層に接続され、その後1つの出力ユニットに接続されます。

活性化関数としてReLUとシグモイド関数が使われます。

4. モデルの初期化

1
model = CreditRiskModel()

ここで、先ほど定義したCreditRiskModelのインスタンスを作成します。

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

1
2
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

損失関数としては、Binary Cross Entropy Loss(二値分類のクロスエントロピー損失)であるnn.BCELoss()が使用されます。

最適化アルゴリズムとしては、確率的勾配降下法(SGD)が使用され、学習率は0.01です。

6. 学習ループ

1
2
3
4
5
6
7
8
9
10
11
12
13
losses = []
for epoch in range(100):
# フォワードプロパゲーション
outputs = model(torch.stack([income, debt], dim=1))
loss = criterion(outputs.squeeze(), labels)

# バックワードプロパゲーションとパラメータの更新
optimizer.zero_grad()
loss.backward()
optimizer.step()

# 損失の記録
losses.append(loss.item())

ここでは、モデルを学習するためのループが100エポック(学習のイテレーション回数)で実行されます。

ループ内で行われる主なステップは次の通りです:

  • フォワードプロパゲーション:学習データをモデルに入力して予測値を計算します。
  • 損失の計算:予測値と正解ラベルとの誤差を計算します。
  • バックワードプロパゲーション:誤差を使って勾配を計算します。
  • パラメータの更新:SGDによって、モデルのパラメータを勾配に従って更新します。
  • 損失の記録:各エポックでの損失値をlossesリストに保存します。

7. 損失のグラフ表示

1
2
3
4
5
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()

この部分では、学習中の損失値の推移をグラフで表示しています。

エポック数に対する損失の変化を確認できます。

8. 予測結果のグラフ表示

1
2
3
4
5
6
7
8
with torch.no_grad():
predictions = model(torch.stack([income, debt], dim=1)).squeeze().numpy()
plt.scatter(income.numpy(), debt.numpy(), c=predictions, cmap='coolwarm')
plt.xlabel('Income')
plt.ylabel('Debt')
plt.title('Credit Risk Evaluation')
plt.colorbar(label='Predicted Probability')
plt.show()

最後に、学習済みモデルを使用して予測を行い、収入と借入金額の散布図を作成します。

ここでは、with torch.no_grad()のコンテキストマネージャを使用して、計算グラフの構築を無効にし、勾配計算を行わないようにしています。

これは、予測時には勾配情報が不要であるためです。

model(torch.stack([income, debt], dim=1))により、学習済みモデルに入力データを与えて予測値を取得しています。

squeeze()は、サイズが1の次元を削除して、1次元のテンソルに変換します。

最後に、この予測値をNumPy配列に変換してpredictionsとして保存しています。

その後、plt.scatter()を使用して収入と借入金額を散布図として表示しています。

点の色はc=predictionsによって予測された信用リスクの確率に対応しており、色は’coolwarm’カラーマップを使用して表現されます。

このように、可視化を通じて予測結果の確認と理解を行っています。


以上で、ソースコード全体の詳細な説明が終わりました。

これは簡単な2つの特徴量を持つ信用リスク評価モデルの構築と学習を行う例です。

実際のアプリケーションでは、より複雑なデータやモデルを使用することが一般的ですが、このコードは基本的な流れを示しています。

結果解説

信用リスク評価の結果を示すグラフは、収入と借入金額の2つの特徴量を使用して作成されています。

以下に、グラフの詳細な説明を提供します。

このグラフは、収入と借入金額の2つの軸を持つ散布図です。

各データポイントは、収入と借入金額の値を持ち、その色の濃淡は予測された信用リスクの確率を示しています。

具体的には、収入がx軸に表示され、借入金額がy軸に表示されます。

データポイントの色の濃淡は、予測された信用リスクの確率を示しています。

色のスケールは、予測された確率の値に基づいて設定されており、濃い色ほど高い確率を示します。


このグラフを見ることで、収入と借入金額の組み合わせが信用リスクの予測にどのように関連しているかを視覚的に理解することができます。

例えば、収入が高く、借入金額が低い場合は、低い信用リスクの確率を示す明るい色が表示されるでしょう。

逆に、収入が低く、借入金額が高い場合は、高い信用リスクの確率を示す濃い色が表示されるでしょう。

このようなグラフを使用することで、信用リスクの予測結果を直感的に理解することができます。

データポイントの分布や色の変化を観察することで、信用リスクの要因や傾向を把握することができます。

これにより、信用リスクの評価や意思決定に役立つ情報を得ることができます。

PyTorch

PyTorchを使用して医療診断支援を行うためのサンプルコードを提供します。

この例では、糖尿病の診断を行うためのシンプルなニューラルネットワークを訓練します。

また、訓練結果をグラフ化するためにmatplotlibを使用します。

1. ライブラリのインポート

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

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

このコードでは、PyTorchの他に、scikit-learnからデータセットを読み込むためにload_diabetes関数と、トレーニングデータとテストデータを分割するためにtrain_test_split関数を使用します。

また、結果を可視化するためにmatplotlibも使用しています。

2. データの準備

糖尿病データセットをロードし、訓練データとテストデータに分割します。

1
2
3
4
5
6
7
diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.2, random_state=0)

X_train = torch.tensor(X_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32)

データセットを読み込んで、トレーニングデータとテストデータに分割します。

そして、PyTorchのテンソルに変換しています。

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

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

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(10, 32)
self.fc2 = nn.Linear(32, 1)

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

model = Net()

Netという名前のクラスを定義しています。

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

入力サイズが10で、出力サイズが32の最初の層(fc1)があり、その後に32から1の出力サイズの2番目の層(fc2)が続きます。

活性化関数としてReLU関数を使用しています。

4. 損失関数とオプティマイザの設定:

損失関数と最適化手法を定義します。

1
2
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters())

損失関数には平均二乗誤差(Mean Squared Error, MSE)を使用し、オプティマイザにはAdamアルゴリズムを使用してモデルのパラメータを最適化します。

5. トレーニングとテスト:

モデルの訓練を行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
epochs = 500
train_losses, test_losses = [], []
for e in range(epochs):
optimizer.zero_grad()
output = model(X_train)
loss = criterion(output.squeeze(), y_train)
loss.backward()
optimizer.step()
train_losses.append(loss.item())

with torch.no_grad():
output = model(X_test)
loss = criterion(output.squeeze(), y_test)
test_losses.append(loss.item())

500エポックのトレーニングループがあります。

各エポックでは、まず勾配をゼロにリセットし(optimizer.zero_grad())、トレーニングデータをモデルに入力して出力を得ます。

その出力と正解ラベルとの平均二乗誤差を計算し、逆伝搬を行って勾配を計算します(loss.backward())。

その後、オプティマイザを用いてモデルのパラメータを更新します(optimizer.step())。

トレーニングおよびテストのロスはそれぞれtrain_lossestest_lossesに記録されます。

6. ロスの可視化:

最後に、訓練とテストの損失をグラフ化します。

1
2
3
4
5
plt.plot(train_losses, label='Training loss')
plt.plot(test_losses, label='Test loss')
plt.legend()
plt.grid()
plt.show()

トレーニングとテストのロスをmatplotlibを使って可視化します。

トレーニングロスは青色、テストロスはオレンジ色でプロットされます。

これにより、ニューラルネットワークモデルをトレーニングしてそのパフォーマンスを評価し、過学習などの問題を視覚的に確認することができます。

[実行結果]

結果解説

このコードによって表示されるグラフには、トレーニングロスとテストロスの履歴がプロットされています。

これらのロスはエポックごとに計算され、トレーニングとテストの進捗を示す重要な情報を提供します。


横軸はエポック数を表し、縦軸は平均二乗誤差(MSE)の値を表します。

MSEは予測値と実際の値との差の2乗の平均であり、モデルの性能を評価する指標の一つです。

MSEが小さいほど、モデルの予測が実際の値に近いことを意味します。

グラフには2つの曲線が表示されます:

1. トレーニングロス(Training loss):

この曲線は青色でプロットされています。

エポック数が増えるにつれて、トレーニングデータセットに対するモデルのロスがどのように変化しているかを示します。

トレーニングロスが減少している場合、モデルはトレーニングデータに適応しており、学習が進んでいることを示します。

2. テストロス(Test loss):

この曲線はオレンジ色でプロットされています。

エポック数が増えるにつれて、テストデータセットに対するモデルのロスがどのように変化しているかを示します。

テストロスが減少している場合、モデルはテストデータに対しても良い予測結果を出力しており、汎化性能があると言えます。


グラフを見ることで、トレーニングとテストのロスがどのように変化しているかを比較できます。

トレーニングロスとテストロスが収束している場合は、過学習が少ない良いモデルと言えます。

逆に、トレーニングロスは減少しているが、テストロスが増加している場合は、過学習が発生している可能性があります。

また、ロスが収束していない場合は、モデルのトレーニングが不十分であることを示します。

トレーニングロスとテストロスの遷移を観察することで、モデルのパフォーマンスや学習の進捗を理解し、必要に応じてハイパーパラメータの調整やモデルの改善を行うことができます。