Search code examples
pythontensorflowmachine-learningscikit-learnneural-network

My Neural network is perfroming regression instead of classification


I am working on a Data Science project which requires implementation of a neural network. The dataset I am providing for training is not sequential and has class labels. But I don't know why it is treating it as sequence of events.

I am using the following code for the model:

model = keras.Sequential([
    layers.Dense(100, activation='relu'),
    layers.Dropout(0.4),
    layers.Dense(100, activation='relu'),
    layers.Dropout(0.4),
    layers.Dense(100, activation='relu'),
    layers.Dropout(0.4),
    layers.Dense(100, activation='relu'),
    layers.Dense(6, activation='softmax')
])
model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=['accuracy']
)
model.fit(X_train, y_train,epochs=100,batch_size=2100)
y_pred=model.predict(X_test)
print(accuracy_score(y_test,y_pred))

The accuracy_score function is giving this error

Classification metrics can't handle a mix of multiclass and continuous-multioutput targets

This error messages shows when the algorithm is performing the regression. How can I solve this issue?

Edit 1

As suggested by Michael Hodel I have applied the OneHotEncoder instead of using LabelEncoder.

data['label']= ohc.fit_transform(data[['label']])

It is giving me error

sparse matrix length is ambiguous; use getnnz() or shape[0]

Edit 2

I used pd.get_dummies() instead of 'OneHotEncoder`


Solution

  • Your y_pred are floats, but accuracy_score expects integers. I'd recommend you one-hot encode your labels and use the categorical_crossentropy loss function. Then y_pred represent the class probabilities which can simply converted to predictions via y_pred.argmax(axis=1). An example with mock data:

    from sklearn.metrics import accuracy_score
    import tensorflow.keras as keras
    import tensorflow.keras.layers as layers
    import numpy as np
    
    n_classes = 6
    n_variables = 100
    n_examples = 1000
    X = np.random.normal(0, 1, (n_examples, n_variables))
    y_ = np.random.choice(n_classes, size=n_examples)
    y = np.eye(n_classes)[y_]
    
    idx = int(n_examples * 0.8)
    X_train, y_train = X[:idx], y[:idx]
    X_test, y_test = X[idx:], y[idx:]
    
    model = keras.Sequential([
        layers.Dense(100, activation='relu'),
        layers.Dropout(0.4),
        layers.Dense(100, activation='relu'),
        layers.Dropout(0.4),
        layers.Dense(100, activation='relu'),
        layers.Dropout(0.4),
        layers.Dense(100, activation='relu'),
        layers.Dense(6, activation='softmax')
    ])
    model.compile(
        optimizer="adam",
        loss="categorical_crossentropy",
        metrics=['accuracy']
    )
    model.fit(X_train, y_train,epochs=10,batch_size=100)
    y_pred=model.predict(X_test)
    print(accuracy_score(y_test.argmax(axis=1), y_pred.argmax(axis=1)))
    

    Here y_ are your classes of shape (n_examples,), and y are the one-hot encoded classes of shape (n_examples, n_classes) and model.predict(X_test) gives predicted probabilities of shape (n_examples, n_classes) and model.predict(X_test).argmax(axis=1) gives prediced classes of shape (n_examples,).