tenserflow.kerax处理NASA小行星数据集标签与模型输出异常求助
问题根因与修复方案
1. 所有问题的核心起源:标准化时包含标签列
StandardScaler是针对数值特征的缩放工具,分类标签danger不需要、也不能参与标准化,你将全量列(含标签)传入缩放逻辑,直接导致标签值被修改,后续所有标签相关的异常都来源于此。
2. 多DataFrame同步修改的原因
pandas中直接用=赋值DataFrame属于浅拷贝,df、df_scaled、df_scaled_prime三个变量指向同一块内存地址,修改任意一个的列内容,其他变量都会同步变化,如需独立副本请用.copy()方法,示例:df_scaled = df.copy()。
3. 3特征子集训练结果异常的原因
- 你在子集训练代码中完全没有执行标准化步骤,特征量级差异大导致模型无法学习有效规律
- 错误的标签判断逻辑:原始标签为布尔类型,你用
==1做判断,结合未标准化的特征,模型最终直接全部预测为正样本,才会出现TN、FN全为0的固定输出 - 你复用全量数据的标签重置逻辑无效,是因为该逻辑是基于标签被标准化后的数值做判断,子集训练时标签未被标准化,自然不生效
正确实现步骤
- 特征与标签必须拆分处理,标签全程不参与缩放、变换操作
# 通用处理逻辑(全量特征/子集特征通用) # 1. 数据拆分 df = dfprime.copy() # 深拷贝避免修改原始数据 # 全量特征列,子集训练时替换为你要的[6,7,8]列即可 feature_cols = df.columns[:-1] label_col = df.columns[-1] X = df[feature_cols] y = df[label_col].astype(bool) # 提前固定标签类型,不需要后续遍历修改 # 2. 仅对特征做标准化 ss = StandardScaler() X_scaled = ss.fit_transform(X) # 3. 拆分训练测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42) # 4. 模型训练(3特征时input shape会自动适配为(3,)) inputLayer = layers.Input(shape=(X_scaled.shape[1],)) outputLayer = layers.Dense(1,activation='sigmoid',use_bias = True)(inputLayer) perceptron = models.Model(inputLayer, outputLayer) perceptron.compile( loss='BinaryCrossentropy', optimizer = 'sgd', metrics=[ metrics.BinaryAccuracy(), metrics.TruePositives(), metrics.FalsePositives(), metrics.TrueNegatives(), metrics.FalseNegatives() ] ) history = perceptron.fit(X_train, y_train, epochs=500, batch_size=1024, shuffle=True, verbose=0) asd = perceptron.evaluate(X_test, y_test) results = perceptron.predict(X_test, verbose=0)
- 若调整后仍存在全预测为正的问题,先检查数据集正负样本比例,若正样本占比超过90%属于样本不均衡,可通过给损失函数添加
class_weight参数、正负样本重采样等方式优化。
内容的提问来源于stack exchange,提问作者Diego Pavez Verdi
相关产品推荐
相关产品推荐

