使用CNN对12特征1000样本CSV数据集做癌症预测二分类的输入与层设置问题
结构化CSV数据基于1D CNN的二分类实现方案
常规CNN应用案例多针对2D图像或者长时序序列,你手上的12维结构化特征属于1维向量,用1D CNN就能提取特征间的局部关联,完全适配癌症二分类的场景,具体实现思路如下:
输入定义
12个特征属于1维序列结构,仅需要额外补充通道维度即可适配CNN输入要求:
- 单个样本调整后shape为
(12, 1),其中1为通道数,逻辑和图像的RGB通道一致 - 整体数据集输入shape为
(样本数, 12, 1),你的1000个样本对应shape就是(1000, 12, 1)
网络层参考实现
以下是基于Keras的可运行示例,你可以直接替换自己的数据集路径使用:
import pandas as pd import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 1. 加载并预处理数据 df = pd.read_csv("你的数据集路径.csv") X = df.drop("标签列名", axis=1).values y = df["标签列名"].values # 数据标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 调整输入shape,增加通道维度 X_reshaped = X_scaled.reshape(X_scaled.shape[0], X_scaled.shape[1], 1) # 划分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X_reshaped, y, test_size=0.2, random_state=42, stratify=y) # 2. 构建1D CNN模型 model = Sequential() # 第一层卷积:32个卷积核,核大小为2 model.add(Conv1D(filters=32, kernel_size=2, activation='relu', input_shape=(12, 1))) model.add(MaxPooling1D(pool_size=2)) model.add(Dropout(0.2)) # 第二层卷积 model.add(Conv1D(filters=64, kernel_size=2, activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(Dropout(0.2)) # 展平后接全连接层 model.add(Flatten()) model.add(Dense(32, activation='relu')) model.add(Dropout(0.3)) # 二分类输出层 model.add(Dense(1, activation='sigmoid')) # 3. 编译训练 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) history = model.fit(X_train, y_train, epochs=30, batch_size=8, validation_split=0.1) # 4. 测试集评估 test_loss, test_acc = model.evaluate(X_test, y_test) print(f"测试集准确率: {test_acc:.4f}")
小样本训练注意事项
你的样本量只有1000,训练时注意规避过拟合:
- 不要使用太复杂的网络结构,卷积层控制在2-3层即可
- 适当调高Dropout比例,也可以增加L2正则约束
- 优先做特征筛选,提前去掉无统计意义的特征减少噪音
内容的提问来源于stack exchange,提问作者Sheida Mjn
相关产品推荐
相关产品推荐

