[[406559]] Python 中国語コミュニティ (ID: python-china) 一部の予測問題では、同じ入力に対して数値とクラス ラベルの両方を予測する必要があります。シンプルなアプローチは、同じデータに対して回帰予測モデルと分類予測モデルを開発し、これらのモデルを順番に使用することです。より効果的な場合が多い別のアプローチは、同じ入力から数値ラベル値とカテゴリラベル値の両方を予測できる単一のニューラル ネットワーク モデルを開発することです。これはマルチ出力モデルと呼ばれ、Keras や TensorFlow などの最新のディープラーニング ライブラリを使用して開発および評価するのが比較的簡単です。 このチュートリアルでは、回帰と分類予測を組み合わせたニューラル ネットワークを開発する方法を学びます。このチュートリアルを完了すると、次のことが分かります。 - 一部の予測問題では、各入力例に対して数値とクラス ラベル値の両方を予測する必要があります。
- 複数の出力を必要とする問題に対して、個別の回帰モデルと分類モデルを開発する方法。
- 回帰予測と分類予測の両方が可能なニューラル ネットワーク モデルを開発および評価する方法。
チュートリアルの概要このチュートリアルは、次の 3 つの部分に分かれています。 - 回帰と分類のための単一モデル
- 回帰モデルと分類モデルを分離する
アワビデータセット 回帰モデル 分類モデル 回帰と分類のための単一モデルディープラーニング ニューラル ネットワーク モデルは、回帰問題または分類問題のいずれかに対して開発するのが一般的ですが、一部の予測モデリング タスクでは、回帰予測と分類予測の両方を実行できる単一のモデルを開発する必要がある場合があります。回帰とは、与えられた入力に対して数値を予測する予測モデリングの問題を指します。分類とは、入力が与えられた場合にクラス ラベルまたはクラス ラベルの確率を予測する予測モデリングの問題を指します。 数値やカテゴリ値を予測したい場合、いくつかの問題が発生する可能性があります。この問題を解決する 1 つの方法は、必要な予測ごとに個別のモデルを開発することです。このアプローチの問題点は、別々のモデルによる予測が異なる可能性があることです。ニューラル ネットワーク モデルを使用するときに使用できるもう 1 つのアプローチは、同じ入力に対して数値出力とクラス出力の両方を個別に予測できる単一のモデルを開発することです。これはマルチ出力ニューラル ネットワーク モデルと呼ばれます。このタイプのモデルの利点は、開発および保守するモデルが 2 つではなく 1 つで済むこと、また両方の出力タイプで同時にモデルをトレーニングおよび更新することで、2 つの出力タイプ間の予測の一貫性を高めることができることです。回帰予測と分類予測の両方を実行できるマルチ出力ニューラル ネットワーク モデルを開発します。 まず、この要件を満たすデータセットを選択し、回帰予測と分類予測用の個別のモデルの開発から始めましょう。 回帰モデルと分類モデルを分離するこのセクションでは、まず、回帰予測と分類予測の両方を行う必要がある可能性のある実際のデータセットを選択し、次に予測の種類ごとに個別のモデルを開発します。 アワビデータセット「Abalone」データセットを使用します。アワビの年齢を判定するのは時間のかかる作業であり、物理的な詳細のみに基づいてアワビの年齢を判定することが望ましいです。これはアワビの物理的詳細を記述したデータセットであり、生物の年齢の代理となるアワビの年輪の数を予測する必要があります。 「年齢」は、数値 (年単位) またはカテゴリ ラベル (一般的な年単位) として予測できます。データセットは実例の一部として自動的にダウンロードされるため、ダウンロードする必要はありません。このデータセットは、必要になる可能性のある数値入力とカテゴリ入力の両方を含むデータセットの例を提供します。 まず、データセットをダウンロードして要約する例を開発しましょう。 - # アワビのデータセットを読み込んで要約する
- pandasからread_csvをインポートする
- matplotlibからpyplotをインポートする
- # データセットをロード
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'
- データフレーム= read_csv (url、ヘッダー=なし)
- # 形状を要約する
- 印刷(データフレーム.shape)
- # 最初の数行を要約する
- 印刷(データフレーム.head())
まず例を実行し、次にデータセットの形状をダウンロードして要約します。モデルのトレーニングと評価に使用できる例 (行) が 4,177 個あり、ターゲット変数を含む特徴 (列) が 9 個あることがわかります。最初の文字列値を除いて、すべての入力変数は数値変数であることがわかります。データ準備を簡素化するために、モデルから最初の列を削除し、数値入力値のモデリングに重点を置きます。 - (4177、9)
- 012345678
- 0 メートル 0.4550.3650.0950.51400.22450.10100.15015
- 1 メートル 0.3500.2650.0900.22550.09950.04850.0707
- 2F0.5300.4200.1350.67700.25650.14150.2109
- 3M 0.4400.3650.1250.51600.21550.11400.15510
- 4 私 0.3300.2550.0800.20500.08950.03950.0557
このデータは、個別の回帰および分類多層パーセプトロン (MLP) ニューラル ネットワーク モデルを開発するための基礎として使用できます。 注: このデータセットに最適なモデルを開発しようとしているわけではありません。代わりに、回帰予測と分類予測の両方を実行できるモデルを開発するという特定の手法を実証しています。 回帰モデルこのセクションでは、アワビデータセット用の回帰 MLP モデルを開発します。まず、列を入力要素と出力要素に分割し、文字列値を含む最初の列を削除する必要があります。また、ロードされたすべての列に浮動小数点型(ニューラル ネットワーク モデルで想定される)を強制し、後でモデルが認識する必要がある入力機能の数を記録します。 - # 入力変数(X)と出力変数(y)に分割
- X, y =データセット[:, 1:-1], データセット [:, -1]
- X, y = X.astype ('float'), y.astype('float')
- n_features = X .shape[1]
次に、データセットをトレーニング データセットとテスト データセットに分割します。ランダムサンプルの 67% を使用してモデルをトレーニングし、残りの 33% を使用してモデルを評価します。 - # データをトレーニングセットとテストセットに分割する
- X_train、X_test、y_train、 y_test = train_test_split (X、y、 test_size = 0.33 、 random_state = 1 )
次に、MLP ニューラル ネットワーク モデルを定義します。このモデルには 2 つの隠し層があり、最初の層には 20 個のノード、2 番目の層には 10 個のノードがあり、どちらも ReLU アクティベーションと「通常の」重み初期化 (推奨方法) を使用します。レイヤーとノードの数は任意に選択されます。出力層には、数値と線形活性化関数を予測するための単一のノードが含まれます。 - # kerasモデルを定義する
- モデル=シーケンシャル()
- model.add(Dense(20, input_dim = n_features , activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(10, activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(1, activation = 'linear' ))
確率的勾配降下法を採用した Adam の効率的なバージョンを使用して、平均二乗誤差 (MSE) 損失関数を最小化するようにモデルをトレーニングします。 - # kerasモデルをコンパイルする
- model.compile(損失= 'mse' 、オプティマイザー= 'adam' )
モデルを 150 エポックトレーニングし、32 個のサンプルのミニバッチでサンプリングします (これも任意に選択されます)。 - # データセットにkerasモデルを適合させる
- model.fit(X_train、y_train、エポック= 150 、バッチサイズ= 32 、詳細= 2 )
最後に、モデルをトレーニングした後、ホールドアウト テスト データセットで評価し、平均絶対誤差 (MAE) を報告します。 - # テストセットで評価する
- yhat =モデル.予測(X_test)
- 誤差=平均絶対誤差(y_test, yhat)
- print('MAE: %.3f'% エラー)
要約すると、以下に、回帰問題としてフレーム化されたアワビデータセットの MLP ニューラル ネットワークの完全な例を示します。 - # アワビデータセットの回帰 MLP モデル
- pandasからread_csvをインポートする
- tensorflow.keras.models から importSequential
- tensorflow.keras.layers から importDense
- sklearn.metricsからmean_absolute_errorをインポートします
- sklearn.model_selection から train_test_split をインポートします
- # データセットをロード
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'
- データフレーム= read_csv (url、ヘッダー=なし)
- データセット=データフレーム.values
- # 入力変数(X)と出力変数(y)に分割
- X, y =データセット[:, 1:-1], データセット [:, -1]
- X, y = X.astype ('float'), y.astype('float')
- n_features = X .shape[1]
- # データをトレーニングセットとテストセットに分割する
- X_train、X_test、y_train、 y_test = train_test_split (X、y、 test_size = 0.33 、 random_state = 1 )
- # kerasモデルを定義する
- モデル=シーケンシャル()
- model.add(Dense(20, input_dim = n_features , activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(10, activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(1, activation = 'linear' ))
- # kerasモデルをコンパイルする
- model.compile(損失= 'mse' 、オプティマイザー= 'adam' )
- # データセットにkerasモデルを適合させる
- model.fit(X_train、y_train、エポック= 150 、バッチサイズ= 32 、詳細= 2 )
- # テストセットで評価する
- yhat =モデル.予測(X_test)
- 誤差=平均絶対誤差(y_test,yhat)
- print('MAE: %.3f'% エラー)
例を実行すると、データセットが準備され、モデルが適合され、モデル エラーの推定値が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。 この場合、モデルの誤差は約 1.5 であることがわかります。 - エポック145/150
- 88/88- 0s- 損失: 4.6130
- エポック146/150
- 88/88- 0s- 損失: 4.6182
- エポック147/150
- 88/88- 0s- 損失: 4.6277
- エポック148/150
- 88/88- 0s- 損失: 4.6437
- エポック149/150
- 88/88- 0s- 損失: 4.6166
- エポック150/150
- 88/88- 0s- 損失: 4.6132
- 前兆: 1.554
ここまでは順調ですね。次に、同様の分類モデルの開発を見てみましょう。 分類モデルアワビのデータセットは、各「リング」整数が個別のクラス ラベルとして扱われる分類問題として表現できます。この例とモデルは上記の回帰例と非常に似ていますが、いくつか重要な変更点があります。これには、各「リング」値に、0 から始まり、「クラス」の合計数から 1 を引いた数で終わる個別の整数を最初に割り当てる必要があります。これは LabelEncoder を使用して実現できます。また、後でモデルに必要となる、一意にエンコードされたクラス値の合計数として、クラスの合計数を記録することもできます。 - # 文字列を整数にエンコードする
- y =ラベルエンコーダー().fit_transform(y)
- n_class =長さ(ユニーク(y))
前と同じようにデータをトレーニング セットとテスト セットに分割した後、モデルを定義し、モデルの出力数をクラス数と同じになるように変更し、マルチクラス分類で一般的なソフトマックス活性化関数を使用できます。 - # kerasモデルを定義する
- モデル=シーケンシャル()
- model.add(Dense(20, input_dim = n_features , activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(10, activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(n_class, activation = 'softmax' ))
クラスラベルを整数値としてエンコードしたと仮定すると、整数エンコードされたクラスラベルを持つマルチクラス分類タスクに適したスパースカテゴリクロスエントロピー損失関数を最小化することでモデルを適合させることができる。 - # kerasモデルをコンパイルする
- model.compile(損失= 'sparse_categorical_crossentropy' 、オプティマイザー= 'adam' )
前と同じようにトレーニング データセットにモデルを適合させた後、保持されたテスト セットで分類精度を計算することでモデルのパフォーマンスを評価できます。 - # テストセットで評価する
- yhat =モデル.予測(X_test)
- yhat = argmax (yhat,軸=-1).astype('int')
- acc =精度スコア(y_test,yhat)
- print('精度: %.3f' % acc)
以上のことを踏まえて、以下に、分類問題として分類されるアワビデータセットの MLP ニューラル ネットワークの完全な例を示します。 - # アワビデータセットの分類 MLP モデル
- numpyからuniqueをインポート
- numpyからargmaxをインポート
- pandasからread_csvをインポートする
- tensorflow.keras.models から importSequential
- tensorflow.keras.layers から importDense
- sklearn.metricsからaccuracy_scoreをインポートする
- sklearn.model_selection から train_test_split をインポートします
- sklearn.preprocessing から LabelEncoder をインポートします
- # データセットをロード
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'
- データフレーム= read_csv (url、ヘッダー=なし)
- データセット=データフレーム.values
- # 入力変数(X)と出力変数(y)に分割
- X, y =データセット[:, 1:-1], データセット [:, -1]
- X, y = X.astype ('float'), y.astype('float')
- n_features = X .shape[1]
- # 文字列を整数にエンコードする
- y =ラベルエンコーダー().fit_transform(y)
- n_class =長さ(ユニーク(y))
- # データをトレーニングセットとテストセットに分割する
- X_train、X_test、y_train、 y_test = train_test_split (X、y、 test_size = 0.33 、 random_state = 1 )
- # kerasモデルを定義する
- モデル=シーケンシャル()
- model.add(Dense(20, input_dim = n_features , activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(10, activation = 'relu' , kernel_initializer = 'he_normal' ))
- model.add(Dense(n_class, activation = 'softmax' ))
- # kerasモデルをコンパイルする
- model.compile(損失= 'sparse_categorical_crossentropy' 、オプティマイザー= 'adam' )
- # データセットにkerasモデルを適合させる
- model.fit(X_train、y_train、エポック= 150 、バッチサイズ= 32 、詳細= 2 )
- # テストセットで評価する
- yhat =モデル.予測(X_test)
- yhat = argmax (yhat,軸=-1).astype('int')
- acc =精度スコア(y_test,yhat)
- print('精度: %.3f' % acc)
例を実行すると、データセットが準備され、モデルが適合され、モデル エラーの推定値が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。 この場合、モデルの精度は約 27% であることがわかります。 - エポック145/150
- 88/88- 0s- 損失: 1.9271
- エポック146/150
- 88/88- 0s- 損失: 1.9265
- エポック147/150
- 88/88- 0s- 損失: 1.9265
- エポック148/150
- 88/88- 0s- 損失: 1.9271
- エポック149/150
- 88/88- 0s- 損失: 1.9262
- エポック150/150
- 88/88- 0s- 損失: 1.9260
- 精度: 0.274
ここまでは順調ですね。次に、回帰予測と分類予測の両方を実行できる複合モデルの開発について見てみましょう。 回帰モデルと分類モデルを組み合わせる このセクションでは、単一の入力に対して回帰予測と分類予測の両方を実行できる単一の MLP ニューラル ネットワーク モデルを開発します。これはマルチ出力モデルと呼ばれ、関数型 Keras API を使用して開発できます。 まず、データセットを準備する必要があります。以前と同じように分類用のデータセットを準備できますが、エンコードされたターゲット変数を元のターゲット変数値と区別するために別の名前で保存する必要があります。 - # 文字列を整数にエンコードする
- y_class =ラベルエンコーダー().fit_transform(y)
- n_class =長さ(ユニーク(y_class))
次に、入力、生の出力、エンコードされた出力変数をトレーニング セットとテスト セットに分割できます。 - # データをトレーニングセットとテストセットに分割する
- X_train、X_test、y_train、y_test、y_train_class、 y_test_class = train_test_split (X、y、y_class、 test_size = 0.33 、 random_state = 1 )
次に、機能 API を使用してモデルを定義します。このモデルは、スタンドアロン モデルと同じ数の入力を受け取り、同じ方法で構成された 2 つの隠し層を使用します。 - # 入力
- 可視=入力(形状=(n_features,))
- hidden1 =密(20、アクティベーション= 'relu' 、 kernel_initializer = 'he_normal' )(表示)
- hidden2 =密(10、アクティベーション= 'relu' 、 kernel_initializer = 'he_normal' )(hidden1)
次に、モデルの 2 番目の隠し層に接続する 2 つの個別の出力層を定義できます。 1 つ目は、単一のノードと線形活性化関数を持つ回帰出力層です。 - # 回帰出力
- out_reg =密(1、活性化= '線形' )(hidden2)
2 番目は分類出力層で、予測するクラスごとに 1 つのノードがあり、ソフトマックス活性化関数を使用します。 - # 分類出力
- out_clas =密(n_class、活性化= 'softmax' )(hidden2)
次に、1 つの入力層と 2 つの出力層を持つモデルを定義できます。 - # モデルを定義する
- model =モデル(入力=可視、出力=[out_reg、out_clas])
2 つの出力層が与えられた場合、最初の (回帰) 出力層の平均二乗誤差損失と、2 番目の (分類) 出力層に対するスパース カテゴリ クロス エントロピーという 2 つの損失関数を使用してモデルをコンパイルできます。 - # kerasモデルをコンパイルする
- model.compile(損失=['mse','sparse_categorical_crossentropy'],オプティマイザー= 'adam' )
参考用にモデルの図を作成することもできます。これには、pydot と pygraphviz がインストールされている必要があります。これが問題になる場合は、この行と plot_model() 関数のインポート ステートメントをコメント アウトできます。 - # モデルのグラフをプロットする
- plot_model(モデル、 to_file = 'model.png' 、 show_shapes = True )
モデルが予測を行うたびに、2 つの値が予測されます。同様に、モデルをトレーニングする場合、サンプルごとに出力ごとに 1 つのターゲット変数が必要になります。このようにして、モデルをトレーニングし、モデルの各出力に回帰ターゲットと分類ターゲットのデータを慎重に提供することができます。 - # モデルのグラフをプロットする
- plot_model(モデル、 to_file = 'model.png' 、 show_shapes = True )
適合モデルは、保持されたテスト セット内の各例に対して回帰予測と分類予測を行うことができます。 - # テストセットで予測を行う
- yhat1、 yhat2 =モデル予測(X_test)
最初の配列は、平均絶対誤差による回帰予測を評価するために使用できます。 - # 回帰モデルの誤差を計算する
- 誤差=平均絶対誤差(y_test,yhat1)
- print('MAE: %.3f'% エラー)
2 番目の配列は、分類精度を使用して分類予測を評価するために使用できます。 - # 分類モデルの精度を評価する
- yhat2 = argmax (yhat2,軸=-1).astype('int')
- acc =精度スコア(y_test_class,yhat2)
- print('精度: %.3f' % acc)
それでおしまい。これらすべてをまとめると、以下はアワビのデータセットに対するコンバイナ回帰と分類予測のためのマルチ出力モデルのトレーニングと評価の完全な例です。 - # アワビデータセットの回帰と分類の予測を組み合わせた mlp
- numpyからuniqueをインポート
- numpyからargmaxをインポート
- pandasからread_csvをインポートする
- sklearn.metricsからmean_absolute_errorをインポートします
- sklearn.metricsからaccuracy_scoreをインポートする
- sklearn.model_selection から train_test_split をインポートします
- sklearn.preprocessing から LabelEncoder をインポートします
- tensorflow.keras.models から importModel
- tensorflow.keras.layersからインポート入力
- tensorflow.keras.layers から importDense
- tensorflow.keras.utilsからplot_modelをインポートします
- # データセットをロード
- url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'
- データフレーム= read_csv (url、ヘッダー=なし)
- データセット=データフレーム.values
- # 入力変数(X)と出力変数(y)に分割
- X, y =データセット[:, 1:-1], データセット [:, -1]
- X, y = X.astype ('float'), y.astype('float')
- n_features = X .shape[1]
- # 文字列を整数にエンコードする
- y_class =ラベルエンコーダー().fit_transform(y)
- n_class =長さ(ユニーク(y_class))
- # データをトレーニングセットとテストセットに分割する
- X_train、X_test、y_train、y_test、y_train_class、 y_test_class = train_test_split (X、y、y_class、 test_size = 0.33 、 random_state = 1 )
- # 入力
- 可視=入力(形状=(n_features,))
- hidden1 =密(20、アクティベーション= 'relu' 、 kernel_initializer = 'he_normal' )(表示)
- hidden2 =密(10、アクティベーション= 'relu' 、 kernel_initializer = 'he_normal' )(hidden1)
- # 回帰出力
- out_reg =密(1、活性化= '線形' )(hidden2)
- # 分類出力
- out_clas =密(n_class、活性化= 'softmax' )(hidden2)
- # モデルを定義する
- model =モデル(入力=可視、出力=[out_reg、out_clas])
- # kerasモデルをコンパイルする
- model.compile(損失=['mse','sparse_categorical_crossentropy'],オプティマイザー= 'adam' )
- # モデルのグラフをプロットする
- plot_model(モデル、 to_file = 'model.png' 、 show_shapes = True )
- # データセットにkerasモデルを適合させる
- model.fit(X_train、[y_train、y_train_class]、エポック= 150 、バッチサイズ= 32 、詳細= 2 )
- # テストセットで予測を行う
- yhat1、 yhat2 =モデル予測(X_test)
- # 回帰モデルの誤差を計算する
- 誤差=平均絶対誤差(y_test,yhat1)
- print('MAE: %.3f'% エラー)
- # 分類モデルの精度を評価する
- yhat2 = argmax (yhat2,軸=-1).astype('int')
- acc =精度スコア(y_test_class,yhat2)
- print('精度: %.3f' % acc)
例を実行すると、データセットが準備され、モデルが適合され、モデル エラーの推定値が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。 マルチ出力モデル図が作成され、モデルの 2 番目の隠し層に接続された回帰 (左) および分類 (右) 出力層が明確に表示されます。 この場合、モデルは約 1.495 の妥当な誤差と、以前と同様の約 25.6% の精度の両方を達成していることがわかります。 - エポック145/150
- 88/88- 0s- 損失: 6.5707- 高密度2損失: 4.5396- 高密度3損失: 2.0311
- エポック146/150
- 88/88- 0s- 損失: 6.5753- 高密度2損失: 4.5466- 高密度3損失: 2.0287
- エポック147/150
- 88/88- 0s- 損失: 6.5970- 高密度2損失: 4.5723- 高密度3損失: 2.0247
- エポック148/150
- 88/88- 0s- 損失: 6.5640- 高密度2損失: 4.5389- 高密度3損失: 2.0251
- エポック149/150
- 88/88- 0s- 損失: 6.6053- 高密度2損失: 4.5827- 高密度3損失: 2.0226
- エポック150/150
- 88/88- 0s- 損失: 6.5754- 高密度2損失: 4.5524- 高密度3損失: 2.0230
- 前兆: 1.495
- 精度: 0.256
|