You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras CNN中的标签预处理问题:多分类恶意软件数据集求助

针对恶意软件多分类任务的CNN完整实现方案

嘿,我看了你给出的数据集情况和没写完的CNN代码片段,这里帮你补全并梳理整个多分类任务的完整实现流程,适配你的9类别小数据集👇

1. 补全并优化数据预处理

首先你的数据读取和拆分部分没写完,我们先把这部分完善,同时处理多分类的标签编码问题:

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical

# 读取数据集
dataset = pd.read_csv('train.csv')
X = dataset.iloc[:, 0:270].values  # 提取270个特征列
y = dataset.iloc[:, 270].values    # 提取类别标签列

# 类别编码:先把字符串标签转成数值,再转成独热编码(适配多分类)
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)
y_onehot = to_categorical(y_encoded, num_classes=9)  # 指定9个类别

# 划分训练集和测试集(按8:2拆分)
X_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)

# 特征标准化(关键步骤!如果特征数值差异大,能大幅提升模型收敛速度)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 重塑数据格式:CNN需要输入为(样本数, 特征长度, 通道数),这里用一维CNN,通道数设为1
X_train_cnn = X_train_scaled.reshape(X_train_scaled.shape[0], 270, 1)
X_test_cnn = X_test_scaled.reshape(X_test_scaled.shape[0], 270, 1)

小提示:如果你的类别标签已经是数值型,可以跳过LabelEncoder,直接用to_categorical转换

2. 构建轻量化CNN模型

考虑到你的数据集只有600个样本,模型不能太复杂(否则容易过拟合),这里设计一个轻量的一维CNN:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping

# 初始化Sequential模型
model = Sequential()

# 第一层卷积:提取局部特征
model.add(Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(270, 1)))
# 池化层:降维减少参数,缓解过拟合
model.add(MaxPooling1D(pool_size=2))

# 第二层卷积:进一步提取高阶特征
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))

# 展平层:将二维特征映射转为一维,连接全连接层
model.add(Flatten())

# 全连接层:学习全局特征
model.add(Dense(128, activation='relu'))
# Dropout层:随机丢弃部分神经元,防止过拟合
model.add(Dropout(0.5))

# 输出层:9个类别,用softmax激活输出概率分布
model.add(Dense(9, activation='softmax'))

# 编译模型:多分类用categorical_crossentropy损失,优化器选Adam
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 查看模型结构
model.summary()

3. 训练模型(带早停机制防过拟合)

为了避免模型在小数据集上过拟合,我们加入早停回调函数,当验证集损失连续3轮不下降时停止训练,并恢复最优权重:

# 早停回调
early_stop = EarlyStopping(monitor='val_loss', patience=3, restore_best_weights=True)

# 开始训练
history = model.fit(
    X_train_cnn, y_train,
    epochs=30,  # 设足够大的epochs,早停会自动终止
    batch_size=16,
    validation_split=0.1,  # 用训练集的10%做验证
    callbacks=[early_stop]
)

4. 模型评估与预测

训练完成后,我们在测试集上评估模型性能,并做预测:

# 在测试集上评估
test_loss, test_acc = model.evaluate(X_test_cnn, y_test)
print(f"测试集准确率: {test_acc:.4f}")

# 生成预测结果
predictions = model.predict(X_test_cnn)
# 将独热编码的预测结果转回原始类别标签
predicted_labels = label_encoder.inverse_transform(np.argmax(predictions, axis=1))
true_labels = label_encoder.inverse_transform(np.argmax(y_test, axis=1))

# 可以打印前10个预测和真实标签对比
for pred, true in zip(predicted_labels[:10], true_labels[:10]):
    print(f"预测类别: {pred}, 真实类别: {true}")

额外优化建议

  • 数据增强:因为数据集太小,可以对特征做小幅随机扰动(比如加少量高斯噪声)来扩充样本
  • 模型轻量化:如果还是过拟合,可以减少卷积层的filters数量,或者缩小全连接层的神经元数
  • 交叉验证:用K折交叉验证代替简单的train_test_split,能更可靠地评估模型性能

内容的提问来源于stack exchange,提问作者M Haris Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:24:06