You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于TensorFlow提升鸢尾花(Iris)机器学习模型准确率的方法问询

鸢尾花模型优化建议(针对TensorFlow 2.0新手)

首先得夸夸你——作为Python和机器学习新手,能独立完成鸢尾花数据集的CSV解析、模型训练,还拿到90%的训练准确率和91%的验证准确率,这已经是非常棒的起步了!接下来我们看看代码里的可优化点,以及如何进一步提升模型的准确率:

一、数据处理环节的关键优化

  • 固定随机种子,保证实验可复现
    你现在用np.random.shuffle打乱数据,但每次运行的打乱结果都不一样,这会导致模型训练结果波动。建议在打乱前添加一行:

    np.random.seed(42)  # 42是常用的固定种子值,也可以选其他整数
    

    这样每次运行的数据集划分和打乱结果都一致,方便你对比不同优化方案的效果。

  • 修正标准化步骤,避免数据泄露
    你当前的做法是先对所有打乱后的数据做标准化,再划分训练/验证/测试集——这会把验证集和测试集的统计信息(比如均值、标准差)带入训练数据的标准化,属于数据泄露,会让模型的验证结果看起来更好,但实际泛化能力会打折扣。正确的做法是只基于训练数据拟合标准化器,再用它转换验证和测试数据:

    # 替换原来的preprocessing.scale代码
    scaler = preprocessing.StandardScaler()
    train_inputs = scaler.fit_transform(train_inputs)
    validation_inputs = scaler.transform(validation_inputs)
    test_inputs = scaler.transform(test_inputs)
    
  • 更严谨的数据集划分
    手动计算train_data_count = int(0.8*total_count)可能因为总数不是10的倍数,导致测试集的样本数出现偏差。可以用sklearn的train_test_split来简化划分,减少手动计算的错误:

    from sklearn.model_selection import train_test_split
    
    # 先划分训练+验证集 和 测试集
    temp_inputs, test_inputs, temp_targets, test_targets = train_test_split(
        shuffled_inputs, shuffled_targets, test_size=0.1, random_state=42
    )
    # 再从训练+验证集里划分训练集和验证集
    train_inputs, validation_inputs, train_targets, validation_targets = train_test_split(
        temp_inputs, temp_targets, test_size=1/9, random_state=42  # 1/9是因为0.1/(0.8+0.1)=1/9
    )
    

二、模型结构与训练过程优化

  • 添加Dropout层防止过拟合
    鸢尾花是非常简单的数据集,你用了两层100神经元的隐藏层,很容易出现过拟合(训练准确率高,但测试准确率低)。可以在每个Dense层后添加Dropout层,随机丢弃部分神经元,提升模型泛化能力:

    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(hidden_layer_size, input_dim=input_size, activation=tf.nn.relu))
    model.add(tf.keras.layers.Dropout(0.2))  # 丢弃20%的神经元
    model.add(tf.keras.layers.Dense(hidden_layer_size, activation=tf.nn.relu))
    model.add(tf.keras.layers.Dropout(0.2))
    model.add(tf.keras.layers.Dense(output_size, activation=tf.nn.softmax))
    
  • 使用早停(Early Stopping)自动控制训练轮次
    固定10个epochs可能要么训练不充分,要么训练过度导致过拟合。早停可以让模型在验证准确率不再提升时自动停止训练,并且恢复到最优的权重:

    # 定义早停回调
    early_stopping = tf.keras.callbacks.EarlyStopping(
        patience=3,  # 连续3轮验证准确率不提升就停止
        restore_best_weights=True,  # 恢复到准确率最高的那一轮权重
        monitor='val_accuracy'  # 监控验证准确率
    )
    # 在fit时添加回调
    model.fit(
        train_inputs, train_targets, 
        epochs=50,  # 设置一个较大的上限
        validation_data=(validation_inputs, validation_targets), 
        verbose=2,
        callbacks=[early_stopping]
    )
    
  • 调整模型复杂度
    100个神经元的隐藏层对于鸢尾花来说可能太复杂了,可以尝试调小隐藏层大小,比如16、32,看看是否能提升泛化能力。比如把hidden_layer_size = 32,简化模型结构,避免过拟合。

  • 测试不同的batch size
    当前model.fit默认用32的batch size,你可以试试更小的batch size(比如8、16),或者更大的(比如64),不同的batch size可能会影响模型的收敛速度和最终性能。

三、评估环节补充

你现在只做了训练和预测,但没有在测试集上评估模型的真实准确率。建议添加测试集评估代码,看看模型在完全未见过的数据上的表现:

test_loss, test_acc = model.evaluate(test_inputs, test_targets)
print(f"测试集准确率: {test_acc:.2f}")

总结

优先做数据标准化修正添加早停,这两个改动能有效提升模型的泛化能力;其次可以尝试调整模型复杂度和添加Dropout层,防止过拟合。这些优化后,你的模型准确率应该能进一步提升,同时也会更稳健。

内容的提问来源于stack exchange,提问作者Jaffer Sheriff

火山引擎 最新活动