簡體   English   中英

如何使用 python 中的人工神經網絡預測 label 的新輸入值

[英]How to predict label for new input values using artificial neural network in python

我是機器學習的新手。 我正在使用人工神經網絡制作用於多類分類的 Streamlit 應用程序。 我的問題是關於 ANN model,而不是關於 Streamlit。 我知道我可以使用 MLPClassifier,但我想構建和訓練我自己的 model。 所以,我用下面的代碼來分析下面的數據。 數據 -

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.layers import Dropout

from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import plot_roc_curve, roc_auc_score, roc_curve
from sklearn.model_selection import cross_val_score, cross_validate
from sklearn.model_selection import GridSearchCV

df=pd.read_csv("./Churn_Modelling.csv")
#Drop Unwanted features
df.drop(columns=['Surname','RowNumber','CustomerId'],inplace=True)
df.head()

#Label Encoding of Categ features
df['Geography']=df['Geography'].map({'France':0,'Spain':1,'Germany':2})
df['Gender']=df['Gender'].map({'Male':0,'Female':1})

#Input & Output selection
X=df.drop('Exited',axis=1)
Y = df['Exited']
Y = df['Exited'].map({'yes':1, 'no':2, 'maybe':3})

#train test split
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=12,stratify=Y)

#scaling 
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
Y_train = ss.fit_transform(Y_train)
X_test=ss.transform(X_test)

# build a model
#build ANN
model=Sequential()
model.add(Dense(units=30,activation='relu',input_shape=(X.shape[1],)))
model.add(Dropout(rate = 0.2))
model.add(Dense(units=18,activation='relu'))
model.add(Dropout(rate = 0.1))
model.add(Dense(units=1,activation='sigmoid'))
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
       
#create callback : -
cb=EarlyStopping(
    monitor="val_loss",  #val_loss means testing error
    min_delta=0.00001, #value of lambda 
    patience=15,
    verbose=1,
    mode="auto", #minimize loss  #maximize accuracy
    baseline=None,
    restore_best_weights=False
)

trained_model=model.fit(X_train,Y_train,epochs=10,
                        validation_data=(X_test,Y_test),
                        callbacks=cb,
                        batch_size=10
                        )

model.evaluate(X_train,Y_train)
print("Training accuracy :",model.evaluate(X_train,Y_train)[1])
print("Training loss :",model.evaluate(X_train,Y_train)[0])

model.evaluate(X_test,Y_test)
print("Testing accuracy :",model.evaluate(X_test,Y_test)[1])
print("Testing loss :",model.evaluate(X_test,Y_test)[0])


y_pred_prob=model.predict(X_test)
y_pred=np.argmax(y_pred_cv, axis=-1)

print(classification_report(Y_test,y_pred))
print(confusion_matrix(Y_test,y_pred))

plt.figure(figsize=(7,5))
sns.heatmap(confusion_matrix(Y_test,y_pred),annot=True,cmap="OrRd_r",
            fmt="d",cbar=True,
            annot_kws={"fontsize":15})
plt.xlabel("Actual Result")
plt.ylabel("Predicted Result")
plt.show()

然后,我將使用 pickle 保存 model,如下所示 -

# pickle_out = open("./my_model.pkl", mode = "wb") 
# pickle.dump(my_model, pickle_out) 
# pickle_out.close()

或如下 -

model.save('./my_model.h5')

現在,我想根據用戶提供的新輸入值(如下表所示)預測 output 變量“已存在”的 label(即“是”、“否”、“可能”等) - 用於預測輸出變量類的新輸入 .

我的問題是我應該如何保存和加載 model 然后預測“現有”變量的標簽,以便它會自動用相應的標簽填充退出列的空單元格(即“是”、“否”、“也許'等)。

我將感謝您對這篇文章的富有洞察力的評論。

訓練完 model 后,您可以簡單地運行model.predict並使用您希望預測的數據。 這個過程的棘手部分涉及確保這些數據是正確的形狀並且索引匹配。

我通常使用這個食譜:

請注意,這些特征需要與訓練 model 的形狀和順序完全相同。

to_predict = df[features]
predictions = model.predict(
    to_predict.to_numpy().reshape(-1, len(features))
)

predictions的長度應該與to_predict相同,它將是一個np.array 您可以通過使用將其返回到具有與DataFrame相同索引的to_predict

predictions = pd.DataFrame(
            predictions,
            columns="predicted_value",  # Anything you want
            index=to_predict.index,
        )

在您的情況下,這應該給出 0、1、2 的值。您需要將 map 這些值恢復為“是”、“否”、“可能”。 為避免過於復雜,您可以在這個新的map上使用DataFrame

predictions["predicted_value"] = predictions["predicted_value"].map({0: 'yes', 1: 'no', 2: 'maybe'})

現在我們需要將這些預測與原始的df合並回來:

df = df.merge(
    predictions, left_index=True, right_index=True, how="outer"
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM