我正在尝试解决分类问题,但我不知道为什么会出现此错误:
ValueError: Input 0 of layer "sequential_9" is incompatible with the layer: expected shape=(None, 1, 13), found shape=(None, 13)
这是我的代码:
import pandas as pd
#import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import VotingClassifier
from imblearn.over_sampling import RandomOverSampler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix, classification_report
import time as t
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, LSTM, Dropout, Input
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
data = pd.read_csv('Dataset.csv')
print(data.dtypes)
X = data.drop('class', axis=1)
y = data['class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
start_time = t.time()
print("Starting oversampling process :")
# Implement oversampling to balance classes
oversample = RandomOverSampler(sampling_strategy='minority', random_state=42)
X_train, y_train = oversample.fit_resample(X_train, y_train)
print("FINAL: oversampling process. Time to done process : ",(t.time()-start_time))
def create_model():
model = Sequential()
model.add(Conv1D(32, kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)))
model.add(Conv1D(64, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
cnn_model = KerasClassifier(build_fn=create_model, epochs=20, batch_size=32, verbose=0)
cnn_model._estimator_type = "classifier"
# Define the LSTM model
def create_LSTM_model():
model = Sequential()
model.add(LSTM(128, input_shape=(1,13), return_sequences=True))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(LSTM(64))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dense(2, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
lstm_model = KerasClassifier(build_fn=create_LSTM_model, epochs=20, batch_size=32, verbose=0)
lstm_model._estimator_type = "classifier"
# define the ensemble model
voting_clf = VotingClassifier(estimators=[("CNN", cnn_model), ("LSTM", lstm_model)], voting='soft')
voting_clf.fit(X_train, y_train)
print("Evaluate the ensemble model on the test data : ")
ensemble_pred = voting_clf.predict(X_test)
ensemble_accuracy = accuracy_score(y_test, ensemble_pred)
ensemble_precision = precision_score(y_test, ensemble_pred)
ensemble_recall = recall_score(y_test, ensemble_pred)
ensemble_f1_score = f1_score(y_test, ensemble_pred)
ensemble_auc_roc = roc_auc_score(y_test, ensemble_pred)
ensemble_cm = confusion_matrix(y_test, ensemble_pred)
CR = classification_report(y_test, ensemble_pred)
总的来说,我有以下 14 个特征:
f1 int64
f2 int64
f3 int64
f4 float64
f5 int64
f6 int64
f7 float64
f8 float64
f9 int64
f10 int64
f11 int64
f12 int64
f13 int64
class int64
dtype: object
和
X_train.shape
(11725212, 13)
当我使用
input_shape=(X_train.shape[1], 1)
时它有效,但我认为这是错误的。
所以,我尝试了 input_shape=(1,13)
和 input_shape=(13,)
但仍然出现错误。
有人可以帮忙吗?谢谢