我有一个数据集,分为 10 个不同的 .csv 文件。分别导入每个后,我使用 concat 将它们合并为一个。这会将每列转换为数据类型“object”。结果,当我使用 Keras model .fit 运行模型时,出现错误:ValueError: Failed to conversion a NumPy array to a Tensor (Unsupported object type int)。
对一个 .csv 文件运行完全相同的代码,这意味着无需连接,工作正常。
df1 = pd.read_csv("CSE-CIC-IDS2018/02-14-2018.csv", low_memory=False, nrows=10000)
df2 = pd.read_csv("CSE-CIC-IDS2018/02-15-2018.csv", low_memory=False, nrows=10000)
df3 = pd.read_csv("CSE-CIC-IDS2018/02-16-2018.csv", low_memory=False, nrows=10000)
df = pd.concat([df1,df2,df3])
df.drop(columns=['Timestamp','Flow ID', 'Src IP', 'Src Port', 'Dst IP'], inplace=True)
df.head()
Dst Port Protocol Flow Duration Tot Fwd Pkts Tot Bwd Pkts TotLen Fwd Pkts TotLen Bwd Pkts Fwd Pkt Len Max Fwd Pkt Len Min Fwd Pkt Len Mean ... Fwd Seg Size Min Active Mean Active Std Active Max Active Min Idle Mean Idle Std Idle Max Idle Min Label
0 0 0 112641719 3 0 0 0 0 0 0.0 ... 0 0 0 0 0 56320859.5 139.300036 56320958 56320761 Benign
1 0 0 112641466 3 0 0 0 0 0 0.0 ... 0 0 0 0 0 56320733.0 114.551299 56320814 56320652 Benign
2 0 0 112638623 3 0 0 0 0 0 0.0 ... 0 0 0 0 0 56319311.5 301.934596 56319525 56319098 Benign
3 22 6 6453966 15 10 1239 2273 744 0 82.6 ... 32 0 0 0 0 0.0 0.0 0 0 Benign
4 22 6 8804066 14 11 1143 2209 744 0 81.642857 ... 32 0 0 0 0 0.0 0.0 0 0 Benign
x = df.drop(["Label", axis=1)
y = df["Label"].apply(lambda x:0 if x=="Benign" else 1)
x_train, x_remaining, y_train, y_remaining = train_test_split(x,y, train_size=0.60, random_state=4)
x_val, x_test, y_val, y_test = train_test_split(x_remaining, y_remaining, test_size=0.5, random_state=4)
#Model
model = Sequential()
model.add(Dense(16, activation="relu"))#, input_dim=len(x_train.columns)))
model.add(Dense(32, activation="relu"))
model.add(Dense(units=1, activation="sigmoid"))
#model.add(Dense(1, activation="softmax"))
#Compiler
model.compile(loss="binary_crossentropy", optimizer="Adam", metrics="accuracy")
model.fit(x_train, y_train, epochs=10, batch_size=512)
ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 int)。
您的其中一列不是数字。使用
x.select_dtypes
显示它们。
# Good case because x does not contain object columns
>>> x.select_dtypes(include='object').columns
Index([], dtype='object')
# Bad case because the list is not empty
>>> x.select_dtypes(include='object').columns
Index(['Protocol'], dtype='object')
如您所见,
Protocol
列有问题,因为它应该是数字。现在您知道了列名称,可以进行调试。尝试使用下面的代码来显示坏行。
>>> x.loc[pd.to_numeric(x['Protocol'], errors='coerce').isna(), 'Protocol']
3 tcp
Name: Protocol, dtype: object
例如,您可以删除第 3 行并将该列转换为整数:
x = x.drop(3).astype({'Protocol': int})
但是,为了确保具有唯一索引并确定坏行,请使用
ignore_index=True
作为 pd.concat
的参数:
df = pd.concat([df1, df2, df3], ignore_index=True)