0

我正在研究 XAI 模型并根据我的数据实现一个简单的模型。训练时,损失和准确性是难的,我无法找出问题所在。

[XAI] https://github.com/EthicalML/xai/blob/master/examples/XAI%20Tabular%20Data%20Example%20Usage.ipynb

以下是我的数据,请不要包含使用列,因为这些是预测列。

    import xai.data
    import pandas as pd
    
    df = pd.read_csv('/content/heat_pipe.csv') 
    categorical_cols = ["Date", "Temperature(degree)", "Wind_speed(m/s)","Humidity(%)","day_of_the_week", "sarturday", "sunday", "public_holidays_(weekdays)","total_holidays"]

_ = xai.correlations(df, include_categorical=True, plot_type="matrix")
_ = xai.correlations(df, include_categorical=True)


proc_df = xai.normalize_numeric(df)
proc_df = xai.convert_categories(proc_df)

x = proc_df.drop("usage_(total)", axis=1)
y = proc_df["usage_(total)"]


x_train, y_train, x_test, y_test, train_idx, test_idx = \
    xai.balanced_train_test_split(
            x, y, "Date", "Temperature(degree)", "Wind_speed(m/s)","Humidity(%)", "day_of_the_week", "sarturday", "sunday", "public_holidays_(weekdays)","total_holidays",
            min_per_group=300,
            max_per_group=300,
            categorical_cols=categorical_cols)

x_train_display = df[train_idx]
x_train_display
x_test_display = df[test_idx]

print("Total number of examples: ", x_test.shape[0])

df_test = x_test_display.copy()
df_test["usage_(total)"] = y_test

型号代码

import sklearn
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, mean_squared_error, roc_curve, auc
from tensorflow.keras.layers import Input, Dense, Flatten,Concatenate, concatenate, Dropout, Lambda, Embedding
from tensorflow.keras.models import Model, Sequential

def build_model(X):
    input_els = []
    encoded_els = []
    dtypes = list(zip(X.dtypes.index, map(str, X.dtypes)))
    for k,dtype in dtypes:
        input_els.append(Input(shape=(1,)))
        if dtype == "int8":
            e = Flatten()(Embedding(X[k].max()+1, 1)(input_els[-1]))
        else:
            e = input_els[-1]
        encoded_els.append(e)
    encoded_els = concatenate(encoded_els)

    layer1 = Dropout(0.5)(Dense(100, activation="relu")(encoded_els))
    out = Dense(1, activation='sigmoid')(layer1)

    # train model
    model = Model(inputs=input_els, outputs=[out])
    model.compile(optimizer="adam", loss='categorical_crossentropy', metrics=['accuracy'])
    return model


def f_in(X, m=None):
    """Preprocess input so it can be provided to a function"""
    if m:
        return [X.iloc[:m,i] for i in range(X.shape[1])]
    else:
        return [X.iloc[:,i] for i in range(X.shape[1])]

def f_out(probs, threshold=0.5):
    """Convert probabilities into classes"""
    return list((probs >= threshold).astype(int).T[0])


model = build_model(x_train)
model.fit(f_in(x_train), y_train, epochs=50, batch_size=512)

错误

Epoch 1/50
1/1 [==============================] - 1s 713ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 2/50
1/1 [==============================] - 0s 12ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 3/50
1/1 [==============================] - 0s 15ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 4/50
1/1 [==============================] - 0s 15ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 5/50
1/1 [==============================] - 0s 15ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 6/50
1/1 [==============================] - 0s 12ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 7/50
1/1 [==============================] - 0s 15ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 8/50
1/1 [==============================] - 0s 12ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 9/50
1/1 [==============================] - 0s 13ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 10/50
1/1 [==============================] - 0s 15ms/step - loss: nan - accuracy: 0.0000e+00
Epoch 11/50
1/1 [==============================] - 0s 13ms/step - loss: nan - accuracy: 0.0000e+00
4

1 回答 1

0

对我来说,这看起来像是您的损失函数的问题。Categorical_crossentropy 通常用于多类预测。所以对我来说,这看起来不像是分类问题,更像是回归问题。这就是为什么您应该使用损失进行回归,例如mean_squared_error

model.compile(optimizer="adam", loss='mean_squared_error', metrics=['accuracy'])

另一件事可能是您的激活功能。大多数情况下,如果您尝试预测数值,则会使用线性激活函数。选择正确激活函数的有用阅读可能是this。这意味着您必须将输出层的激活函数更改为linear

于 2022-02-17T18:22:17.517 回答