ディープラーニングによるマルチラベル分類

ツイートシェアシェア

最終更新日2020年8月31日

マルチラベル分類では、ゼロ以上のクラスラベルを予測します。

クラスラベルが相互に排他的である通常の分類タスクとは異なり、マルチラベル分類には、相互に非排他的な複数のクラスまたは”ラベル”の予測を”

ディープラーニングニューラルネットワークは、マルチラベル分類問題をネイティブにサポートするアルゴリズムの例です。 複数ラベル分類タスクのニューラルネットワークモデルは、Keras deep learningライブラリを使用して簡単に定義および評価できます。

このチュートリアルでは、マルチラベル分類のための深い学習モデルを開発する方法を発見します。

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

  • マルチラベル分類は、ゼロ以上の相互に非排他的なクラスラベルを予測することを含む予測モデリングタスクです。
  • ニューラルネットワークモデルは、マルチラベル分類タスク用に設定できます。
  • マルチラベル分類のためのニューラルネットワークを評価し、新しいデータの予測を行う方法。

始めましょう。

ディープラーニングによるマルチラベル分類

ディープラーニングによるマルチラベル分類
写真:Trevor Marron、some rights reserved。

チュートリアルの概要

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

  • マルチラベル分類
  • マルチラベル分類
  • マルチラベル分類

マルチラベル分類

分類は、いくつかの入力が与えられたクラスラベルを出力する予測モデリング問題です

数値。

通常、分類タスクには単一のラベルを予測することが含まれます。 あるいは、2つ以上のクラスラベルの尤度を予測することもあります。 このような場合、クラスは相互に排他的であり、分類タスクは入力が一つのクラスにのみ属していることを前提としています。

一部の分類タスクでは、複数のクラスラベルを予測する必要があります。 これは、クラスラベルまたはクラスメンバーシップが相互に排他的ではないことを意味します。 これらのタスクは、複数のラベル分類、または略して複数のラベル分類と呼ばれます。

マルチラベル分類では、入力サンプルごとに出力としてゼロ以上のラベルが必要であり、出力は同時に必要です。 出力ラベルは入力の関数であると仮定します。

scikit-learnライブラリのmake_multilabel_classification()関数を使用して、合成マルチラベル分類データセットを作成できます。

私たちのデータセットには、10個の入力フィーチャを持つ1,000個のサンプルがあります。 データセットには、各サンプルに対して3つのクラスラベル出力があり、各クラスには1つまたは2つの値(0または1、例:存在または存在しない)があ

合成マルチラベル分類データセットの作成と要約の完全な例を以下に示します。

1
2
3
4
5
6
7
8
9

# sklearnからのマルチラベル分類タスク
の例。データセットのインポートmake_multilabel_classification
#define dataset
X,y=make_multilabel_classification(n_samples=1000,n_features=10,n_classes=3,n_labels=2,random_state=1)
# 集計データセット図形
print(X.shape,y.形状)
#最初のいくつかの例を要約
範囲内のiのための(10):
print(X,y)

この例を実行すると、データセットが作成され、入力要素と出力要素の形状が要約されます。

予想通り、1,000個のサンプルがあり、それぞれに10個の入力フィーチャと3個の出力フィーチャがあることがわかります。

入力と出力の最初の10行が要約されており、このデータセットのすべての入力が数値であり、出力クラスラベルには3つのクラスラベルごとに0ま

1
2
3
4
5
6
7
8
9
10
11
12

(1000, 10) (1000, 3)

次に、マルチラベル分類タスクのニューラルネットワークモデルを開発する方法を見てみましょう。

複数ラベルのニューラルネットワーク

一部の機械学習アルゴリズムは、マルチラベル分類をネイティブにサポートしています。

ニューラルネットワークモデルは、マルチラベル分類をサポートするように構成することができ、分類タスクの詳細に応じて適切に実行できます。

マルチラベル分類は、問題にあるターゲットラベルの数を出力層のノード数として指定するだけで、ニューラルネットワークで直接サポートできます。 たとえば、3つの出力ラベル(クラス)を持つタスクでは、出力層に3つのノードを持つニューラルネットワーク出力層が必要になります。

出力層の各ノードはシグモイド活性化を使用する必要があります。 これにより、ラベルのクラスメンバーシップの確率が予測され、0から1の間の値が予測されます。 最後に、このモデルはバイナリのクロスエントロピー損失関数に適合する必要があります。

要約すると、マルチラベル分類のためのニューラルネットワークモデルを設定するには、詳細は次のとおりです:

  • 出力レイヤー内のノードの数は、ラベルの数と一致します。
  • 出力層の各ノードのシグモイド活性化。
  • バイナリクロスエントロピー損失関数。

Keras deep learningライブラリを使用してこれを実証できます。

前のセクションで定義したマルチラベル分類タスクの多層パーセプトロン(MLP)モデルを定義します。

各サンプルには10個の入力と3個の出力があるため、ネットワークには、最初の隠れ層の”input_dim”引数で指定された10個の入力と出力層の3個のノードを必

隠れ層で人気のあるReLU活性化機能を使用します。 隠された層には、いくつかの試行錯誤の後に選択された20個のノードがあります。 バイナリクロスエントロピー損失と確率的勾配降下のAdamバージョンを使用してモデルを近似します。

マルチラベル分類タスクのネットワークの定義を以下に示します。

1
2
3
4
5

# モデル
model=Sequential()
モデルを定義します。add(Dense(20,input_dim=n_inputs,kernel_initializer=’he_uniform’,activation=’relu’))
モデル。add(Dense(n_outputs,activation=’sigmoid’))
モデル。compile(loss=’binary_crossentropy’,optimizer=’adam’)

したがって、入力変数と出力変数の数が引数として提供されるモデルを定義して返す関数を作成することができます。

1
2
3
4
5
6
7

# モデル
def get_model(n_inputs,n_outputs):
model=Sequential()
モデルを取得します。add(Dense(20,input_dim=n_inputs,kernel_initializer=’he_uniform’,activation=’relu’))
モデル。add(Dense(n_outputs,activation=’sigmoid’))
モデル。compile(loss=’binary_crossentropy’,optimizer=’adam’)
モデルを返す

マルチラベル分類のMLPを定義する方法に慣れたので、このモデルをどのように評価できるかを見てみましょう。

マルチラベル分類のためのニューラルネットワーク

データセットが小さい場合は、同じデータセットでニューラルネットワークモデルを繰り返し評価し、繰り返し

これは、学習アルゴリズムの確率的性質のためです。

さらに、新しいデータの予測を行うときに、データセットの列車/テスト分割の代わりにk分割交差検証を使用して、モデルのパフォーマンスの公平な推定値 繰り返しになりますが、あまりにも多くのデータがない場合にのみ、プロセスを合理的な時間で完了できます。

これを考慮して、10回の折畳と3回の繰り返しを持つ繰り返しk折畳交差検証を使用して、多出力回帰タスクのMLPモデルを評価します。

MLPモデルはデフォルトで各クラスラベルの確率を予測します。 これは、各サンプルの3つの確率を予測することを意味します。 これらは、値を0または1のいずれかに丸めることによって、鮮明なクラスラベルに変換できます。 次に、鮮明なクラスラベルの分類精度を計算することができます。

1
2
3
4
5
6
7

#テストセット
yhat=モデルで予測を行います。predict(X_Test)
#確率をクラスラベル
yhat=yhatに丸めます。round()
#精度を計算
acc=accuracy_score(y_test,yhat)

スコアは収集され、すべての反復および交差検証折畳みにわたる平均および標準偏差を報告することによって要約することができる。

以下のevaluate_model()関数は、データセットを取得し、モデルを評価し、評価スコアのリスト、この場合は精度スコアを返します。

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

# 反復k分割交差検証を使用してモデルを評価する
def evaluate_model(X,y):
results=list()
n_inputs,n_outputs=X.shape,y.shape
#評価手順の定義
cv=RepeatedKFold(n_splits=10,n_repeats=3,random_state=1)
# cvのtrain_ix、test_ixの折り畳み
を列挙します。split(X):
#データの準備
X_Train,X_Test=X,X
y_train,y_test=y,y
#モデルの定義
model=get_model(n_inputs,n_outputs)
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
fit(X_train,y_train,verbose=0,エポック=100)
# テストセット
yhat=modelで予測を行います。predict(X_Test)
#確率をクラスラベル
yhat=yhatに丸めます。round()
#精度を計算
acc=accuracy_score(y_test,yhat)
#結果を保存
print(‘>%.3f’%acc)
結果。append(acc)
結果を返す

次に、データセットをロードしてモデルを評価し、平均パフォーマンスを報告できます。

これをまとめると、完全な例が以下にリストされています。

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

# マルチラベル分類のためのmlp
numpyからインポート平均
numpyからインポートstd
sklearnから。データセットは、sklearnからmake_multilabel_classification
をインポートします。model_selection kerasからRepeatedKFold
をインポートします。モデルはKerasから順次
をインポートします。レイヤーはsklearnからDense
をインポートします。metrics import accuracy_score
#データセットを取得する
def get_dataset():
X,y=make_multilabel_classification(n_samples=1000,n_features=10,n_classes=3,n_labels=2,random_state=1)
return X
#モデルを取得するdef get_model(n_inputs,n_outputs):
model=sequential()
モデル。add(Dense(20,input_dim=n_inputs,kernel_initializer=’he_uniform’,activation=’relu’))
モデル。add(Dense(n_outputs,activation=’sigmoid’))
モデル。compile(loss=’binary_crossentropy’,optimizer=’adam’)
returnモデル
#繰り返しk分割交差検証を使用してモデルを評価する
def evaluate_model(X,y):
results=list()
n_inputs,n_outputs=X.shape,y…..形状
#評価手順の定義
cv=RepeatedKFold(n_splits=10,n_repeats=3,random_state=1)
# cvのtrain_ix、test_ixの折り畳み
を列挙します。split(X):
#データの準備
X_Train,X_Test=X,X
y_train,y_test=y,y
#モデルの定義
model=get_model(n_inputs,n_outputs)
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
#モデルのフィット
fit(X_train,y_train,verbose=0,エポック=100)
# テストセット
yhat=modelで予測を行います。predict(X_Test)
#確率をクラスラベル
yhat=yhatに丸めます。round()
#精度を計算
acc=accuracy_score(y_test,yhat)
#結果を保存
print(‘>%.3f’%acc)
結果。append(acc)
return results
#データセットを読み込む
X,y=get_dataset()
#モデルを評価する
results=evaluate_model(X,y)
#パフォーマンスを要約する
print(‘Accuracy:%。3階(%.3f)’%(mean(results),std(results),std(results))))

この例を実行すると、各折畳と各繰り返しの分類精度が報告され、評価の進行状況がわかります。

注:アルゴリズムまたは評価手順の確率的性質、または数値精度の違いにより、結果は異なる場合があります。 この例を数回実行し、平均結果を比較することを検討してください。

最後に、平均と標準偏差の精度が報告されます。 この場合、モデルは約81.2%の精度を達成することが示されています。

このコードは、独自のマルチラベル分類タスクでMLPモデルを評価するためのテンプレートとして使用できます。 モデル内のノードとレイヤーの数は、データセットの複雑さに合わせて簡単に調整することができます。

1
2
3
4
5
6
7

>0.780
>0.820
>0.790
>0.810
>0.840
正確さ:0。812 (0.032)

モデル構成が選択されると、それを使用して、利用可能なすべてのデータに最終的なモデルを適合させ、新しいデータの予測を行うことができます。

次の例では、最初にマルチラベル分類データセット全体にMLPモデルを当てはめ、次に保存されたモデルに対してpredict()関数を呼び出して新しいデータ行の予

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

# 予測にmlpを使用する numpyからのマルチラベル分類
sklearnからasarray
をインポートします。データセットは、kerasからmake_multilabel_classification
をインポートします。モデルはKerasから順次
をインポートします。レイヤーインポートDense
#データセットを取得def get_dataset():
X,y=make_multilabel_classification(n_samples=1000,n_features=10,n_classes=3,n_labels=2,random_state=1)
return X,y
#モデルを取得するdef get_model(n_inputs,n_outputs):
model=sequential()
モデル。add(Dense(20,input_dim=n_inputs,kernel_initializer=’he_uniform’,activation=’relu’))
モデル。add(Dense(n_outputs,activation=’sigmoid’))
モデル。compile(loss=’binary_crossentropy’,optimizer=’adam’)
return model
#データセットをロード
X,y=get_dataset()
n_inputs,n_outputs=X.shape,y.shape
#モデルを取得
#データセットをロード
X,y=get_dataset()
n_inputs,n_outputs=X.shape,y.shape
#get model
#すべてのデータ
モデルにモデルを適合させます。fit(X,y,verbose=0,エポックス=100)
# 新しいデータ
row=
newX=asarray()
yhat=モデルの予測を行います。予測(newX)
print(‘予測:%s’%yhat)

この例を実行すると、モデルが適合し、新しい行の予測が作成されます。 予想どおり、予測には、マルチラベル分類タスクに必要な3つの出力変数、つまり各クラスラベルの確率が含まれています。

1
予測される:

続きを読む

このセクションでは、より深く行くために探している場合は、トピックに関するより多くのリソースを提供します。

  • マルチラベル分類、ウィキペディア。
  • ——-make_multilabel_classification API。
  • model_selection.を使っていますが、これは

概要

このチュートリアルでは、マルチラベル分類のための深い学習モデルを開発する方法を発見しました。

具体的には、あなたが学んだ:

  • マルチラベル分類は、ゼロ以上の相互に非排他的なクラスラベルを予測することを含む予測モデリングタスクです。
  • ニューラルネットワークモデルは、マルチラベル分類タスク用に設定できます。
  • マルチラベル分類のためのニューラルネットワークを評価し、新しいデータの予測を行う方法。

何か質問はありますか?
以下のコメントであなたの質問をして、私は答えるために最善を尽くします。

Pythonでディープラーニングプロジェクトを開発!

Pythonを使ったディープラーニング

数分でネットワークを開発できればどうなりますか

。..Python

のほんの数行で、私の新しい電子ブックでどのように発見してください:
Python

を使用した深層学習は、
多層知覚、畳み込みネット、再帰ニューラルネットなどのトピックに関するエンドツーエンドのプロジェクトをカバーしています。..

最後にディープラーニングを
あなた自身のプロジェクトにもたらす

学者をスキップします。 ちょうど結果。

中身を見る

ツイートシェアシェア



+