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

为何scikit-learn的LogisticRegression模型predict始终返回相同结果?

问题:LogisticRegression模型始终返回相同预测值,得分极低

我尝试用scikit-learn基于客户数据预测财务收益,输入是两个特征,目标是连续的收益值。数据集共470行,部分样本如下:

# 特征数据(前15行)
array(
    [[8662824,       34],
    [ 7978337,       25],
    [  902219,       28],
    [29890885,       64],
    [14357494,       60],
    [ 6403602,       43],
    [96538844,      372],
    [ 7675132,       67],
    [34807493,       78],
    [46215428,       75],
    [ 5437889,       20],
    [16674835,       50],
    [17382472,       20],
    [ 5437889,       20],
    [  313111,        0]])

# 目标收益(前15行)
array([2739267,   20539,   18304,   16052,   25391,   19444,   61550,
      94392,   75934,   52997,   67485,   92263,   37672, 6748523,
      20710])

我用了以下代码训练模型:

x_train, x_test, y_train, y_test = train_test_split(
    data,
    targets,
    test_size=.25,
    random_state=42
)
model = LogisticRegression(max_iter=5000)  # 设5000迭代次数,还没做特征缩放
model.fit(x_train, y_train)

# 无论输入什么,预测结果都是30000
model.predict([[50000, 50]])

终端输出显示,所有预测都返回30000,测试集得分仅0.0093:

In [134]: model.predict([[16000000, 5]])
Out[134]: array([30000])

In [135]: model.predict([[150000, 20]])
Out[135]: array([30000])

In [141]: model.score(x_test, y_test)
Out[141]: 0.009345794392523364

我认为特征和收益之间的关联应该比这个得分更高,毕竟人工能凭这些数据预测。请问哪里操作错了?


问题根源与解决方法

1. 核心错误:用分类模型做回归任务

LogisticRegression是分类模型,专门用于预测离散的类别标签,而你的任务是预测连续的财务收益值(属于回归任务)。

当你把连续的收益值喂给分类模型时,模型会把每个不同的收益值当成独立类别。但你的470个样本里,大部分收益值都是唯一的,模型只能学到训练集中出现次数最多的"类别"(也就是30000),所以无论输入什么特征,都会返回这个最频繁的类别。同时,分类模型的score()方法计算的是分类准确率——只有预测值和真实值完全相等才算正确,这在回归任务里几乎不可能,所以得分极低。

2. 次要问题:特征未做标准化

你的两个特征数值范围差异极大:第一个特征是百万/十亿级,第二个是个位数/几百级。即使换用回归模型,这种尺度差异也会导致模型训练不稳定,影响收敛速度和最终性能。

修正步骤

步骤1:换用回归模型

选择适合回归任务的模型,比如:

  • 基础线性模型:LinearRegression
  • 带正则化的线性模型:Ridge/Lasso(防止过拟合)
  • 树模型:RandomForestRegressor(能捕捉非线性关系,对特征尺度不敏感)

步骤2:对特征做标准化

用StandardScaler把特征缩放到均值为0、方差为1的范围,帮助模型更好收敛。

修正后代码示例

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import r2_score

# 1. 特征标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

# 2. 划分数据集
x_train, x_test, y_train, y_test = train_test_split(
    data_scaled,
    targets,
    test_size=.25,
    random_state=42
)

# 3. 使用线性回归模型训练
model = LinearRegression()
model.fit(x_train, y_train)

# 4. 预测(注意先对输入特征做标准化)
input_data = [[50000, 50]]
prediction = model.predict(scaler.transform(input_data))
print(f"预测收益值: {prediction}")

# 5. 评估回归模型(用R²得分,越接近1越好)
test_r2 = r2_score(y_test, model.predict(x_test))
print(f"测试集R²得分: {test_r2}")

额外说明

  • 回归模型的评估不用准确率,而是用R²、MAE(平均绝对误差)、MSE(均方误差)等指标,这些指标能更合理反映预测值和真实值的差异。
  • 如果线性模型效果不理想,可以尝试随机森林这类非线性模型,它不需要特征标准化,还能处理特征间的复杂关联,更贴合业务场景中的人工预测逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:51:37