ウェブサイト検索

モデル入力データを機械学習の予測と結び付ける方法


現在、scikit-learn のようなライブラリを使用すると、モデルをトレーニング データセットに適合させることが非常に簡単になります。

わずか数行のコードで、データセットにモデルを適合させて評価することができます。簡単すぎて問題になってしまいました。

同じ数行のコードが何度も繰り返されるため、実際にモデルを使用して予測を行う方法が明確ではない場合があります。または、予測が行われた場合、その予測値を実際の入力値にどのように関連付けるか。

次のような質問のメールをたくさん受け取っているので、これが事実であることはわかっています。

予測値を入力データと結び付けるにはどうすればよいですか?

これはよくある問題です。

このチュートリアルでは、予測値を機械学習モデルへの入力と関連付ける方法を学びます。

このチュートリアルを完了すると、次のことがわかります。

  • モデルをトレーニング データセットに適合させて評価する方法。
  • 適合モデルを使用して一度に 1 つずつ、バッチで予測を行う方法。
  • 予測値をモデルへの入力と結び付ける方法。

私の新しい本『Machine Learning Mastery With Python』 でプロジェクトを始めましょう。これにはステップバイステップのチュートリアルPython ソース コード ファイルが含まれています。すべての例。

始めましょう。

  • 2020 年 1 月更新: scikit-learn v0.22 API の変更点を更新しました。

チュートリアルの概要

このチュートリアルは 3 つの部分に分かれています。彼らです:

  1. トレーニング データセットを準備する
  2. モデルをトレーニング データセットに適合させる方法
  3. 予測をモデルへの入力と接続する方法

トレーニング データセットを準備する

モデルで使用できるデータセットを定義することから始めましょう。

CSV ファイルまたはメモリ内の NumPy 配列に独自のデータセットがある場合があります。

この場合、2 つの数値入力変数を使用した単純な 2 クラスまたはバイナリ分類問題を使用します。

  • 入力: 2 つの数値入力変数:
  • 出力: 0 または 1 のクラス ラベル。

make_blobs() scikit-learn 関数を使用して、1,000 個の例を含むこのデータセットを作成できます。

以下の例では、入力 (X) と出力 (y) に個別の配列を使用してデータセットを作成します。

# example of creating a test dataset
from sklearn.datasets import make_blobs
# create the inputs and outputs
X, y = make_blobs(n_samples=1000, centers=2, n_features=2, random_state=2)
# summarize the shape of the arrays
print(X.shape, y.shape)

この例を実行すると、データセットが作成され、各配列の形状が出力されます。

データセットには 1,000 個のサンプルに対して 1,000 行があることがわかります。また、入力データには 2 つの入力変数に対して 2 つの列があり、出力配列は入力データの各行のクラス ラベルの 1 つの長い配列であることがわかります。

(1000, 2) (1000,)

次に、このトレーニング データセットにモデルを当てはめます。

モデルをトレーニング データセットに適合させる方法

トレーニング データセットができたので、データにモデルを当てはめることができます。

これは、すべてのトレーニング データを学習アルゴリズムに提供し、学習アルゴリズムに、予測誤差を最小限に抑える入力と出力クラス ラベル間のマッピングを検出させることを意味します。

この場合、2 クラスの問題であるため、ロジスティック回帰分類アルゴリズムを試します。

これは、scikit-learn の LogisticRegression クラスを使用して実現できます。

まず、必要な特定の構成を使用してモデルを定義する必要があります。この場合、効率的な ‘lbfgs’ ソルバーを使用します。

次に、fit() 関数を呼び出してトレーニング データセットを渡すことにより、モデルがトレーニング データセットに適合します。

最後に、最初にモデルを使用してpredict() を呼び出してトレーニング データセットで予測を行い、次に予測を予想されるクラス ラベルと比較して精度を計算することで、モデルを評価できます。

完全な例を以下に示します。

# fit a logistic regression on the training dataset
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_blobs
from sklearn.metrics import accuracy_score
# create the inputs and outputs
X, y = make_blobs(n_samples=1000, centers=2, n_features=2, random_state=2)
# define model
model = LogisticRegression(solver='lbfgs')
# fit model
model.fit(X, y)
# make predictions
yhat = model.predict(X)
# evaluate predictions
acc = accuracy_score(y, yhat)
print(acc)

例を実行すると、モデルがトレーニング データセットに適合し、分類精度が出力されます。

この場合、モデルのトレーニング データセットに対する分類精度は 100% であることがわかります。

1.0

トレーニング データセットにモデルを適合させて評価する方法がわかったので、質問の根本に迫りましょう。

モデルの入力を出力に接続するにはどうすればよいですか?

予測をモデルへの入力と接続する方法

適合機械学習モデルは入力を受け取り、予測を行います。

これは一度に 1 行のデータである可能性があります。例えば:

  • 入力: 2.12309797 -1.41131072
  • 出力: 1

これは私たちのモデルでは簡単です。

たとえば、配列入力を使用して予測を行って 1 つの出力を取得すると、2 つが直接接続されていることがわかります。

入力は数値の配列、具体的には 1 行 2 列として定義する必要があります。これを実現するには、この例を各行の列のリストを持つ行のリストとして定義します。例えば:

...
# define input
new_input = [[2.12309797, -1.41131072]]

これをモデルへの入力として提供し、予測を行うことができます。

...
# get prediction for new input
new_output = model.predict(new_input)

これを前のセクションのモデルのフィッティングと組み合わせると、完全な例が以下にリストされます。

# make a single prediction with the model
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_blobs
# create the inputs and outputs
X, y = make_blobs(n_samples=1000, centers=2, n_features=2, random_state=2)
# define model
model = LogisticRegression(solver='lbfgs')
# fit model
model.fit(X, y)
# define input
new_input = [[2.12309797, -1.41131072]]
# get prediction for new input
new_output = model.predict(new_input)
# summarize input and output
print(new_input, new_output)

この例を実行すると、新しい入力が定義されて予測が行われ、入力と出力の両方が出力されます。

この場合、モデルは入力のクラス ラベル 1 を予測していることがわかります。

[[2.12309797, -1.41131072]] [1]

独自のアプリケーションでモデルを使用している場合、このモデルの使用法により、行われた各予測の入力と出力を直接関連付けることができます。

ラベル 0 と 1 を「スパム」や「スパムではない」などの意味のあるものに置き換える必要がある場合は、単純な if ステートメントで行うことができます。

ここまでは順調ですね。

モデルを使用して一度に複数の予測を行うとどうなりますか?

つまり、複数の行または複数のサンプルがモデルに一度に提供される場合、予測を入力にどのように関連付けるのでしょうか?

たとえば、前のセクションでモデルを評価したときと同様に、トレーニング データセット内の 1,000 個のサンプルのそれぞれについて予測を行うことができます。この場合、モデルは 1,000 個の個別の予測を行い、1,000 個の整数値の配列を返します。 1,000 入力データ行ごとに 1 つの予測。

重要なのは、出力配列内の予測の順序は、予測を行うときにモデルへの入力として提供される行の順序と一致することです。これは、インデックス 0 の入力行がインデックス 0 の予測と一致することを意味します。インデックス 1、インデックス 2、インデックス 999 まで同じことが当てはまります。

したがって、多数の入力行に対して予測を行うときに順序が維持されるという知識を備えた上で、インデックスに基づいて入力と出力を直接関連付けることができます。

例を挙げて具体的に説明してみましょう。

まず、トレーニング データセット内の入力の各行に対して予測を行うことができます。

...
# make predictions on the entire training dataset
yhat = model.predict(X)

その後、インデックスをステップ実行して、それぞれの入力と予測された出力にアクセスできます。

これは、予測を入力行に接続する方法を正確に示しています。たとえば、行 0 の入力とインデックス 0 の予測は次のようになります。

...
print(X[0], yhat[0])

この場合、最初の 10 行とその予測だけを確認します。

...
# connect predictions with outputs
for i in range(10):
	print(X[i], yhat[i])

これを結び付けて、トレーニング データの各行に対して予測を作成し、予測を入力に接続する完全な例を以下に示します。

# make a single prediction with the model
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_blobs
# create the inputs and outputs
X, y = make_blobs(n_samples=1000, centers=2, n_features=2, random_state=2)
# define model
model = LogisticRegression(solver='lbfgs')
# fit model
model.fit(X, y)
# make predictions on the entire training dataset
yhat = model.predict(X)
# connect predictions with outputs
for i in range(10):
	print(X[i], yhat[i])

この例を実行すると、モデルはトレーニング データセット内の 1,000 行に対して 1,000 回の予測を行い、入力を最初の 10 個の例の予測値に接続します。

これにより、行インデックスを介して予測を入力行に接続するための、独自の予測モデリング プロジェクトに使用および適応できるテンプレートが提供されます。

[ 1.23839154 -2.8475005 ] 1
[-1.25884111 -8.57055785] 0
[ -0.86599821 -10.50446358] 0
[ 0.59831673 -1.06451727] 1
[ 2.12309797 -1.41131072] 1
[-1.53722693 -9.61845366] 0
[ 0.92194131 -0.68709327] 1
[-1.31478732 -8.78528161] 0
[ 1.57989896 -1.462412  ] 1
[ 1.36989667 -1.3964704 ] 1

さらに読む

さらに詳しく知りたい場合は、このセクションでこのトピックに関するさらなるリソースを提供します。

投稿

  • Python での最初の機械学習プロジェクトのステップバイステップ
  • scikit-learn で予測を行う方法

API

  • sklearn.datasets.make_blobs API
  • sklearn.metrics.accuracy_score API
  • sklearn.linear_model.LogisticRegression API

まとめ

このチュートリアルでは、予測値を機械学習モデルへの入力と関連付ける方法を学びました。

具体的には、次のことを学びました。

  • モデルをトレーニング データセットに適合させて評価する方法。
  • 適合モデルを使用して、一度に 1 つずつ、バッチで予測を行う方法。
  • 予測値をモデルへの入力と結び付ける方法。

ご質問はありますか?
以下のコメント欄にご質問ください。できる限りお答えいたします。

関連記事