基于TensorFlow提升鸢尾花(Iris)机器学习模型准确率的方法问询
首先得夸夸你——作为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




