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

TensorFlow逻辑回归模型准确率仅65%求优化(乳腺肿瘤预测场景)

优化乳腺癌分类模型的建议

嘿,我看到你在基于威斯康星乳腺癌数据集做恶性/良性分类,目前准确率只有65%确实让人沮丧——咱们从数据预处理、模型设置到训练流程一步步优化,应该能快速提升性能!

1. 先解决数据预处理的核心问题

你的代码里完全没做特征标准化/归一化,这是逻辑回归这类基于梯度下降模型的大忌。不同特征的数值范围差异会让梯度更新不稳定,模型很难收敛到最优解。另外标签的形状也需要调整,避免计算损失时的形状不匹配问题。

修改建议:

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 加载数据后先划分训练集和测试集(必须做!不然无法评估真实泛化能力)
df = pd.read_csv(r'D:\wholedesktop\logisticReal.txt')
df.drop(['id'], axis=1, inplace=True)

# 划分特征和标签
X = df.drop(['class'], axis=1).values
y = df['class'].replace({2:0, 4:1}).values

# 划分训练集和测试集(8:2比例,stratify保证类别分布一致)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

# 特征标准化(只在训练集上拟合,避免数据泄露)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train).astype(np.float32)
X_test_scaled = scaler.transform(X_test).astype(np.float32)

# 调整标签形状为(样本数, 1),和模型输出维度匹配
y_train = y_train.reshape(-1, 1).astype(np.float32)
y_test = y_test.reshape(-1, 1).astype(np.float32)

2. 修正模型初始化与优化器选择

你当前的权重初始化用了np.random.random((9,1)),取值范围是0-1,这会导致sigmoid函数一开始就进入饱和区,梯度消失,模型无法有效学习。另外,固定学习率的梯度下降优化器容易出现训练震荡,不如自适应学习率的优化器稳定。

修改建议:

# 更合适的权重初始化:小范围正态分布,避免激活函数饱和
w = tf.Variable(tf.random.normal(shape=(9, 1), mean=0, stddev=0.01), dtype=tf.float32)
b = tf.Variable(tf.zeros(shape=(1, 1)), dtype=tf.float32)

# 替换梯度下降为Adam优化器(自适应学习率,收敛更稳定)
optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
goal = optimizer.minimize(error)

3. 改用小批量梯度下降训练

你现在用的是批量梯度下降(一次性喂入所有数据),这不仅在数据量大时效率低,还容易导致模型卡在局部最优或者震荡。小批量训练能让梯度更新更稳定,模型收敛更快。

修改训练循环:

batch_size = 32
num_batches = len(X_train_scaled) // batch_size

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    
    for epoch in range(200):  # 小批量训练不需要2000轮,200轮足够收敛
        # 每轮打乱训练数据,避免顺序影响
        idx = np.random.permutation(len(X_train_scaled))
        X_train_shuffled = X_train_scaled[idx]
        y_train_shuffled = y_train[idx]
        
        for i in range(num_batches):
            start = i * batch_size
            end = start + batch_size
            batch_x = X_train_shuffled[start:end]
            batch_y = y_train_shuffled[start:end]
            
            sess.run(goal, feed_dict={x: batch_x, y: batch_y})
        
        # 每轮打印训练和测试准确率,监控模型泛化能力
        train_acc = sess.run(accuracy, feed_dict={x: X_train_scaled, y: y_train})
        test_acc = sess.run(accuracy, feed_dict={x: X_test_scaled, y: y_test})
        print(f"Epoch {epoch+1}, Train Acc: {train_acc:.4f}, Test Acc: {test_acc:.4f}")
    
    weight = sess.run(w)
    bias = sess.run(b)
    print("Final weights:\n", weight)
    print("Final bias:\n", bias)

4. 额外提升建议

  • 增加模型复杂度:如果做完上述优化后准确率还不够(比如低于95%),可以尝试添加隐藏层,改成简单的神经网络:
    # 添加一个有16个神经元的隐藏层,用ReLU激活
    hidden = tf.layers.dense(x, 16, activation=tf.nn.relu)
    y_ = tf.layers.dense(hidden, 1, activation=None)  # 输出层不激活,交给损失函数处理
    
  • 早停机制:当测试集准确率连续多轮不再提升时提前停止训练,避免过拟合。
  • 类别不平衡检查:查看数据集里恶性/良性样本的比例,如果不平衡,可以用加权损失或者过采样/欠采样处理。

按照这些步骤修改后,你的模型准确率应该能轻松提升到90%以上,甚至接近98%(这个数据集本身是比较容易取得高准确率的)。

内容的提问来源于stack exchange,提问作者Manas Bam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:17:48