ユーザー行動予測 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スコアなどの評価指標が比較的低いため、改善の余地があると言えます。

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