My Neural network is perfroming regression instead of classification

Issue

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,).

Answered By – Michael Hodel

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published