1. 配列の繰り返しで行列を作成したい

配列の繰り返しで行列を作成したい

やりたいことをは明確だけどすぐに方法が思いつきませんでした。

それで、調べた方法を共有します。

使用するのはnumpy.tileです。

文章だけではやりたいことが伝わっていないかもしれないので具体例で説明します。

example.py
import numpy as np


a = np.array([1, 2, 3])
M = np.tile(a, (4, 1))

print(a)
print(M)

配列a=[1, 2, 3]を用意します。

そして配列aを4回繰り返して行列を作成しています。

出力結果は下記となります。

Terminal_Output
In [5]: print(a)
[1 2 3]

In [6]: print(M)
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [1 2 3]]

2. 実際のモデル構築時の使用例

前項のような自作のデータではなく実際の分析データを使用した実例を紹介します。

データ加工ではnumpyでデータ操作するのが少し面倒だったのでpandasも使用しています。

手順
  1. 分析データの作成: X, y = fetch_covtype(return_X_y=True)

  2. yの各クラスの比率構成を計算 :means = pd.Series(y).value_counts(normalize=True, sort=False).to_numpy()

  3. 上記の繰り返しで作成した予測値の行列を作成: pred_by_means = np.tile(means,(y.shape[0], 1))

  4. 精度(log_loss)を確認 : print(log_loss(y, pred_by_means))

example.py
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_covtype
from sklearn.metrics import log_loss

X, y = fetch_covtype(return_X_y=True)
means = pd.Series(y).value_counts(normalize=True, sort=False).to_numpy()
pred_by_means = np.tile(means,(y.shape[0], 1))

print(log_loss(y, pred_by_means))
結果
In [36]: print(log_loss(y, pred_by_means))
1.2051605280621949

各クラスの構成比率で予測した場合のベンチマーク精度を計算できました。

ベンチマークスコアは1.205160です

3. まとめ

np.tileは地味なので馴染みがなかったのですが明確な使いどころがありました。

何かしら参考になったのなら幸いです。

今回は以上です。