成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python中組合分類和回歸的神經網絡模型

開發 后端 深度學習
在本教程中,您將發現如何開發用于組合回歸和分類預測的神經網絡。

[[406559]]

Python中文社區 (ID:python-china)

 某些預測問題需要為同一輸入預測數字值和類別標簽。一種簡單的方法是在同一數據上開發回歸和分類預測模型,然后依次使用這些模型。另一種通常更有效的方法是開發單個神經網絡模型,該模型可以根據同一輸入預測數字和類別標簽值。這被稱為多輸出模型,使用現代深度學習庫(例如Keras和TensorFlow)可以相對容易地開發和評估。

在本教程中,您將發現如何開發用于組合回歸和分類預測的神經網絡。完成本教程后,您將知道:

  •  一些預測問題需要為每個輸入示例預測數字和類別標簽值。
  •  如何針對需要多個輸出的問題開發單獨的回歸和分類模型。
  •  如何開發和評估能夠同時進行回歸和分類預測的神經網絡模型。

教程概述

本教程分為三個部分:他們是:

  •  回歸和分類的單一模型
  •  單獨的回歸和分類模型

          鮑魚數據集

          回歸模型

          分類模型

  •  組合回歸和分類模型

回歸和分類的單一模型

開發用于回歸或分類問題的深度學習神經網絡模型是很常見的,但是在某些預測建模任務上,我們可能希望開發一個可以進行回歸和分類預測的單一模型。回歸是指涉及預測給定輸入的數值的預測建模問題。分類是指預測建模問題,涉及預測給定輸入的類別標簽或類別標簽的概率。

我們可能要預測數值和分類值時可能會有一些問題。解決此問題的一種方法是為每個所需的預測開發一個單獨的模型。這種方法的問題在于,由單獨的模型做出的預測可能會有所不同。使用神經網絡模型時可以使用的另一種方法是開發單個模型,該模型能夠對相同輸入的數字和類輸出進行單獨的預測。這稱為多輸出神經網絡模型。這種類型的模型的好處在于,我們有一個模型可以開發和維護,而不是兩個模型,并且同時在兩種輸出類型上訓練和更新模型可以在兩種輸出類型之間的預測中提供更大的一致性。我們將開發一個能夠同時進行回歸和分類預測的多輸出神經網絡模型。

首先,讓我們選擇一個滿足此要求的數據集,并從為回歸和分類預測開發單獨的模型開始。

單獨的回歸和分類模型

在本節中,我們將從選擇一個實際數據集開始,在該數據集中我們可能需要同時進行回歸和分類預測,然后針對每種類型的預測開發單獨的模型。

鮑魚數據集

我們將使用“鮑魚”數據集。確定鮑魚的年齡是一項耗時的工作,并且希望僅根據物理細節來確定鮑魚的年齡。這是一個描述鮑魚物理細節的數據集,需要預測鮑魚的環數,這是該生物年齡的代名詞。

“年齡”既可以預測為數值(以年為單位),也可以預測為類別標簽(按年為普通年)。無需下載數據集,因為我們將作為工作示例的一部分自動下載它。數據集提供了一個數據集示例,我們可能需要輸入的數值和分類。

首先,讓我們開發一個示例來下載和匯總數據集。   

  1. # load and summarize the abalone dataset  
  2.    from pandas import read_csv  
  3.    from matplotlib import pyplot  
  4.    # load dataset  
  5.    url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'  
  6.    dataframe = read_csv(url, header=None 
  7.    # summarize shape  
  8.    print(dataframe.shape)  
  9.    # summarize first few lines  
  10.    print(dataframe.head()) 

首先運行示例,然后下載并匯總數據集的形狀。我們可以看到有4,177個示例(行)可用于訓練和評估模型,還有9個要素(列)包括目標變量。我們可以看到,除了第一個字符串值之外,所有輸入變量都是數字變量。為了簡化數據準備,我們將從模型中刪除第一列,并著重于對數字輸入值進行建模。 

  1. (4177, 9)  
  2.   012345678  
  3.   0  M  0.4550.3650.0950.51400.22450.10100.15015  
  4.   1  M  0.3500.2650.0900.22550.09950.04850.0707  
  5.   2  F  0.5300.4200.1350.67700.25650.14150.2109  
  6.   3  M  0.4400.3650.1250.51600.21550.11400.15510  
  7.   4  I  0.3300.2550.0800.20500.08950.03950.0557 

我們可以將數據用作開發單獨的回歸和分類多層感知器(MLP)神經網絡模型的基礎。

注意:我們并未嘗試為此數據集開發最佳模型;相反,我們正在展示一種特定的技術:開發可以進行回歸和分類預測的模型。

回歸模型

在本節中,我們將為鮑魚數據集開發回歸MLP模型。首先,我們必須將各列分為輸入和輸出元素,并刪除包含字符串值的第一列。我們還將強制所有加載的列都具有浮點類型(由神經網絡模型期望)并記錄輸入特征的數量,稍后模型需要知道這些特征。 

  1. # split into input (X) and output (y) variables  
  2. X, y = dataset[:, 1:-1], dataset[:, -1]  
  3. X, y = X.astype('float'), y.astype('float')  
  4. n_features = X.shape[1] 

接下來,我們可以將數據集拆分為訓練和測試數據集。我們將使用67%的隨機樣本來訓練模型,而剩余的33%則用于評估模型。 

  1. # split data into train and test sets  
  2. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1

然后,我們可以定義一個MLP神經網絡模型。該模型將具有兩個隱藏層,第一個具有20個節點,第二個具有10個節點,都使用ReLU激活和“正常”權重初始化(一種好的做法)。層數和節點數是任意選擇的。輸出層將具有用于預測數值和線性激活函數的單個節點。 

  1. # define the keras model  
  2.  model = Sequential()  
  3.  model.add(Dense(20, input_dim=n_featuresactivation='relu'kernel_initializer='he_normal'))  
  4.  model.add(Dense(10, activation='relu'kernel_initializer='he_normal'))  
  5.  model.add(Dense(1, activation='linear')) 

使用隨機梯度下降的有效Adam版本,將訓練模型以最小化均方誤差(MSE)損失函數。 

  1. # compile the keras model  
  2. model.compile(loss='mse'optimizer='adam'

我們將訓練150個紀元的模型,并以32個樣本的小批量為樣本,再次任意選擇。 

  1. # fit the keras model on the dataset  
  2. model.fit(X_train, y_train, epochs=150batch_size=32verbose=2

最后,在訓練完模型后,我們將在保持測試數據集上對其進行評估,并報告平均絕對誤差(MAE)。 

  1. # evaluate on test set  
  2. yhat = model.predict(X_test)  
  3. error = mean_absolute_error(y_test, yhat) 
  4. print('MAE: %.3f'% error) 

綜上所述,下面列出了以回歸問題為框架的鮑魚數據集的MLP神經網絡的完整示例。 

  1. # regression mlp model for the abalone dataset  
  2. from pandas import read_csv  
  3. from tensorflow.keras.models importSequential  
  4. from tensorflow.keras.layers importDense  
  5. from sklearn.metrics import mean_absolute_error  
  6. from sklearn.model_selection import train_test_split  
  7. # load dataset  
  8. url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'  
  9. dataframe = read_csv(url, header=None 
  10. dataset = dataframe.values  
  11. # split into input (X) and output (y) variables  
  12. X, y = dataset[:, 1:-1], dataset[:, -1]  
  13. X, y = X.astype('float'), y.astype('float')  
  14. n_features = X.shape[1]  
  15. # split data into train and test sets  
  16. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1 
  17. # define the keras model  
  18. model = Sequential()  
  19. model.add(Dense(20, input_dim=n_featuresactivation='relu'kernel_initializer='he_normal'))  
  20. model.add(Dense(10, activation='relu'kernel_initializer='he_normal'))  
  21. model.add(Dense(1, activation='linear'))  
  22. # compile the keras model 
  23. model.compile(loss='mse'optimizer='adam'
  24. # fit the keras model on the dataset  
  25. model.fit(X_train, y_train, epochs=150batch_size=32verbose=2 
  26. # evaluate on test set  
  27. yhat = model.predict(X_test)  
  28. error = mean_absolute_error(y_test, yhat)  
  29. print('MAE: %.3f'% error) 

運行示例將準備數據集,擬合模型并報告模型誤差的估計值。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到該模型實現了約1.5 的誤差。 

  1. Epoch145/150  
  2.  88/88- 0s- loss: 4.6130  
  3.  Epoch146/150  
  4.  88/88- 0s- loss: 4.6182  
  5.  Epoch147/150  
  6.  88/88- 0s- loss: 4.6277  
  7.  Epoch148/150  
  8.  88/88- 0s- loss: 4.6437  
  9.  Epoch149/150  
  10.  88/88- 0s- loss: 4.6166  
  11.  Epoch150/150 
  12.  88/88- 0s- loss: 4.6132  
  13.  MAE: 1.554 

到目前為止,一切都很好。接下來,讓我們看一下開發類似的分類模型。

分類模型

鮑魚數據集可以歸類為一個分類問題,其中每個“環”整數都被當作一個單獨的類標簽。該示例和模型與上述回歸示例非常相似,但有一些重要的變化。這要求首先為每個“ ring”值分配一個單獨的整數,從0開始,以“ class”總數減1結束。這可以使用LabelEncoder實現。我們還可以將類的總數記錄為唯一編碼的類值的總數,稍后模型會需要。 

  1. # encode strings to integer  
  2. y = LabelEncoder().fit_transform(y)  
  3. n_class = len(unique(y)) 

將數據像以前一樣分為訓練集和測試集后,我們可以定義模型并將模型的輸出數更改為等于類數,并使用對于多類分類通用的softmax激活函數。 

  1. # define the keras model  
  2. model = Sequential()  
  3. model.add(Dense(20, input_dim=n_featuresactivation='relu'kernel_initializer='he_normal'))  
  4. model.add(Dense(10, activation='relu'kernel_initializer='he_normal'))  
  5. model.add(Dense(n_class, activation='softmax')) 

假設我們已將類別標簽編碼為整數值,則可以通過最小化適用于具有整數編碼類別標簽的多類別分類任務的稀疏類別交叉熵損失函數來擬合模型 

  1. # compile the keras model  
  2.   model.compile(loss='sparse_categorical_crossentropy'optimizer='adam'

在像以前一樣將模型擬合到訓練數據集上之后,我們可以通過計算保留測試集上的分類準確性來評估模型的性能。 

  1. # evaluate on test set  
  2. yhat = model.predict(X_test)  
  3. yhat = argmax(yhat, axis=-1).astype('int')  
  4. acc = accuracy_score(y_test, yhat)  
  5. print('Accuracy: %.3f'% acc) 

綜上所述,下面列出了針對鮑魚數據集的MLP神經網絡的完整示例,該示例被歸類為分類問題。 

  1. # classification mlp model for the abalone dataset  
  2.  from numpy import unique  
  3.  from numpy import argmax  
  4.  from pandas import read_csv  
  5.  from tensorflow.keras.models importSequential 
  6.  from tensorflow.keras.layers importDense  
  7.  from sklearn.metrics import accuracy_score  
  8.  from sklearn.model_selection import train_test_split  
  9.  from sklearn.preprocessing importLabelEncoder  
  10.  # load dataset  
  11.  url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'  
  12.  dataframe = read_csv(url, header=None 
  13.  dataset = dataframe.values  
  14.  # split into input (X) and output (y) variables  
  15.  X, y = dataset[:, 1:-1], dataset[:, -1]  
  16.  X, y = X.astype('float'), y.astype('float')  
  17.  n_features = X.shape[1]  
  18.  # encode strings to integer  
  19.  y = LabelEncoder().fit_transform(y)  
  20.  n_class = len(unique(y))  
  21.  # split data into train and test sets  
  22.  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1 
  23.  # define the keras model  
  24.  model = Sequential()  
  25.  model.add(Dense(20, input_dim=n_featuresactivation='relu'kernel_initializer='he_normal'))  
  26.  model.add(Dense(10, activation='relu'kernel_initializer='he_normal'))  
  27.  model.add(Dense(n_class, activation='softmax'))  
  28.  # compile the keras model  
  29.  model.compile(loss='sparse_categorical_crossentropy'optimizer='adam' 
  30.  # fit the keras model on the dataset  
  31.  model.fit(X_train, y_train, epochs=150batch_size=32verbose=2 
  32.  # evaluate on test set  
  33.  yhat = model.predict(X_test)  
  34.  yhat = argmax(yhat, axis=-1).astype('int')  
  35.  acc = accuracy_score(y_test, yhat)  
  36.  print('Accuracy: %.3f'% acc) 

運行示例將準備數據集,擬合模型并報告模型誤差的估計值。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

在這種情況下,我們可以看到該模型的準確度約為27%。 

  1. Epoch145/150  
  2.  88/88- 0s- loss: 1.9271  
  3.  Epoch146/150  
  4.  88/88- 0s- loss: 1.9265  
  5.  Epoch147/150  
  6.  88/88- 0s- loss: 1.9265  
  7.  Epoch148/150  
  8.  88/88- 0s- loss: 1.9271 
  9.  Epoch149/150  
  10.  88/88- 0s- loss: 1.9262 
  11.  Epoch150/150  
  12.  88/88- 0s- loss: 1.9260  
  13.  Accuracy: 0.274 

到目前為止,一切都很好。接下來,讓我們看一下開發一種能夠同時進行回歸和分類預測的組合模型。

組合回歸和分類模型

在本節中,我們可以開發一個單一的MLP神經網絡模型,該模型可以對單個輸入進行回歸和分類預測。這稱為多輸出模型,可以使用功能性Keras API進行開發。

首先,必須準備數據集。盡管我們應該使用單獨的名稱保存編碼后的目標變量以將其與原始目標變量值區分開,但是我們可以像以前一樣為分類準備數據集。 

  1. # encode strings to integer  
  2. y_class = LabelEncoder().fit_transform(y)  
  3. n_class = len(unique(y_class)) 

然后,我們可以將輸入,原始輸出和編碼后的輸出變量拆分為訓練集和測試集。 

  1. # split data into train and test sets  
  2. 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定義模型。該模型采用與獨立模型相同的輸入數量,并使用以相同方式配置的兩個隱藏層 

  1. # input  
  2.  visible = Input(shape=(n_features,))  
  3.  hidden1 = Dense(20, activation='relu'kernel_initializer='he_normal')(visible)  
  4.  hidden2 = Dense(10, activation='relu'kernel_initializer='he_normal')(hidden1) 

然后,我們可以定義兩個單獨的輸出層,它們連接到模型的第二個隱藏層。

第一個是具有單個節點和線性激活函數的回歸輸出層。 

  1. # regression output  
  2. out_reg = Dense(1, activation='linear')(hidden2) 

第二個是分類輸出層,對于每個要預測的類都有一個節點,并使用softmax激活函數。 

  1. # classification output  
  2. out_clas = Dense(n_class, activation='softmax')(hidden2) 

然后,我們可以使用一個輸入層和兩個輸出層定義模型。 

  1. # define model  
  2. model = Model(inputs=visibleoutputs=[out_reg, out_clas]) 

給定兩個輸出層,我們可以使用兩個損失函數來編譯模型,第一個(回歸)輸出層的均方誤差損失和第二個(分類)輸出層的稀疏分類交叉熵。 

  1. # compile the keras model  
  2. model.compile(loss=['mse','sparse_categorical_crossentropy'], optimizer='adam'

我們還可以創建模型圖以供參考。這需要安裝pydot和pygraphviz。如果存在問題,則可以注釋掉該行以及 plot_model()函數的import語句。 

  1. # plot graph of model  
  2. plot_model(model, to_file='model.png'show_shapes=True

每次模型進行預測時,它將預測兩個值。同樣,訓練模型時,每個輸出每個樣本將需要一個目標變量。這樣,我們可以訓練模型,并仔細地向模型的每個輸出提供回歸目標和分類目標數據。 

  1. # plot graph of model  
  2. plot_model(model, to_file='model.png'show_shapes=True

然后,擬合模型可以對保留測試集中的每個示例進行回歸和分類預測。 

  1. # make predictions on test set  
  2. yhat1, yhat2 = model.predict(X_test) 

第一個數組可用于通過平均絕對誤差評估回歸預測。 

  1. # calculate error for regression model  
  2. error = mean_absolute_error(y_test, yhat1) 
  3.  print('MAE: %.3f'% error) 

第二個數組可用于通過分類準確性評估分類預測。 

  1. # evaluate accuracy for classification model  
  2. yhat2 = argmax(yhat2, axis=-1).astype('int')  
  3. acc = accuracy_score(y_test_class, yhat2) 
  4.  print('Accuracy: %.3f'% acc) 

就是這樣。結合在一起,下面列出了訓練和評估用于鮑魚數據集上的組合器回歸和分類預測的多輸出模型的完整示例。 

  1. # mlp for combined regression and classification predictions on the abalone dataset  
  2.   from numpy import unique  
  3.   from numpy import argmax  
  4.   from pandas import read_csv  
  5.   from sklearn.metrics import mean_absolute_error  
  6.   from sklearn.metrics import accuracy_score  
  7.   from sklearn.model_selection import train_test_split  
  8.   from sklearn.preprocessing importLabelEncoder  
  9.   from tensorflow.keras.models importModel  
  10.   from tensorflow.keras.layers importInput  
  11.   from tensorflow.keras.layers importDense  
  12.   from tensorflow.keras.utils import plot_model  
  13.   # load dataset 
  14.    url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/abalone.csv'  
  15.   dataframe = read_csv(url, header=None 
  16.   dataset = dataframe.values  
  17.   # split into input (X) and output (y) variables  
  18.   X, y = dataset[:, 1:-1], dataset[:, -1]  
  19.   X, y = X.astype('float'), y.astype('float')  
  20.   n_features = X.shape[1]  
  21.   # encode strings to integer  
  22.   y_class = LabelEncoder().fit_transform(y)  
  23.   n_class = len(unique(y_class))  
  24.   # split data into train and test sets  
  25.   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
  26.    # input  
  27.   visible = Input(shape=(n_features,))  
  28.   hidden1 = Dense(20, activation='relu'kernel_initializer='he_normal')(visible)  
  29.   hidden2 = Dense(10, activation='relu'kernel_initializer='he_normal')(hidden1)  
  30.   # regression output  
  31.   out_reg = Dense(1, activation='linear')(hidden2)  
  32.   # classification output  
  33.   out_clas = Dense(n_class, activation='softmax')(hidden2)  
  34.   # define model  
  35.   model = Model(inputs=visibleoutputs=[out_reg, out_clas])  
  36.   # compile the keras model  
  37.   model.compile(loss=['mse','sparse_categorical_crossentropy'], optimizer='adam' 
  38.   # plot graph of model  
  39.   plot_model(model, to_file='model.png'show_shapes=True 
  40.   # fit the keras model on the dataset  
  41.   model.fit(X_train, [y_train,y_train_class], epochs=150batch_size=32verbose=2 
  42.   # make predictions on test set  
  43.   yhat1, yhat2 = model.predict(X_test)  
  44.   # calculate error for regression model  
  45.   error = mean_absolute_error(y_test, yhat1)  
  46.   print('MAE: %.3f'% error)  
  47.   # evaluate accuracy for classification model  
  48.   yhat2 = argmax(yhat2, axis=-1).astype('int')  
  49.   acc = accuracy_score(y_test_class, yhat2)  
  50.   print('Accuracy: %.3f'% acc) 

運行示例將準備數據集,擬合模型并報告模型誤差的估計值。

注意:由于算法或評估程序的隨機性,或者數值精度的差異,您的結果可能會有所不同。考慮運行該示例幾次并比較平均結果。

創建了多輸出模型圖,清楚地顯示了連接到模型第二個隱藏層的回歸(左)和分類(右)輸出層。

在這種情況下,我們可以看到該模型既實現了約1.495 的合理誤差,又實現了與之前相似的約25.6%的精度。   

  1. Epoch145/150  
  2.    88/88- 0s- loss: 6.5707- dense_2_loss: 4.5396- dense_3_loss: 2.0311  
  3.    Epoch146/150  
  4.    88/88- 0s- loss: 6.5753- dense_2_loss: 4.5466- dense_3_loss: 2.0287  
  5.    Epoch147/150 
  6.    88/88- 0s- loss: 6.5970- dense_2_loss: 4.5723- dense_3_loss: 2.0247  
  7.    Epoch148/150  
  8.    88/88- 0s- loss: 6.5640- dense_2_loss: 4.5389- dense_3_loss: 2.0251  
  9.    Epoch149/150  
  10.    88/88- 0s- loss: 6.6053- dense_2_loss: 4.5827- dense_3_loss: 2.0226  
  11.    Epoch150/150  
  12.    88/88- 0s- loss: 6.5754- dense_2_loss: 4.5524- dense_3_loss: 2.0230  
  13.    MAE: 1.495  
  14.    Accuracy: 0.256  
責任編輯:龐桂玉 來源: Python中文社區
相關推薦

2024-01-01 15:37:59

機器學習神經網絡

2024-07-10 11:09:35

2022-06-16 10:29:33

神經網絡圖像分類算法

2017-08-04 14:23:04

機器學習神經網絡TensorFlow

2019-01-05 08:40:17

VGG神經網絡

2023-06-18 23:00:39

神經網絡損失函數隨機變量

2017-08-25 14:23:44

TensorFlow神經網絡文本分類

2025-02-19 15:12:17

神經網絡PyTorch大模型

2023-11-14 16:29:14

深度學習

2018-07-03 16:10:04

神經網絡生物神經網絡人工神經網絡

2018-02-27 09:32:13

神經網絡自然語言初探

2019-05-07 19:12:28

機器學習神經網絡Python

2020-04-20 13:45:32

神經網絡模型代碼

2023-02-28 08:00:00

深度學習神經網絡人工智能

2018-02-02 17:08:48

機器學習算法決策樹

2017-08-28 21:31:37

TensorFlow深度學習神經網絡

2025-03-31 08:50:00

模型量化神經網絡AI

2025-02-24 08:00:00

機器學習ML架構

2023-09-17 23:09:24

Transforme深度學習

2018-02-05 08:58:36

Python神經網絡識別圖像
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区在线 | 亚洲电影一区二区三区 | 欧美精品三区 | 免费的av网站| 国产精品久久久久久久岛一牛影视 | 中文字幕一区在线观看视频 | 亚洲人成在线观看 | 精品视频www | 最新黄色在线观看 | 天天搞天天操 | 一级片在线观看视频 | 国产精品美女久久久久久不卡 | 亚洲国产高清在线 | 91精品国产91久久久久青草 | 北条麻妃一区二区三区在线观看 | av中文字幕在线 | 亚洲综合一区二区三区 | 久久久久se | 亚洲精品久久 | 黄色国产在线播放 | 成人福利视频网站 | 国产精品一级在线观看 | 夜夜草导航 | 一区二区三区视频在线免费观看 | 亚洲a人| 污视频免费在线观看 | 男女网站免费观看 | 香蕉久久网 | 日本午夜免费福利视频 | 操操日 | 国产亚洲成av人在线观看导航 | 久久精品69| 亚洲毛片在线观看 | 亚洲啪啪 | 久久久国产精品视频 | 日韩av一区二区在线观看 | 一区二区三区欧美在线观看 | 欧美三区| 欧美综合一区二区 | 欧美日韩国产精品一区 | 欧美一二区 |