为何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
相关产品推荐
相关产品推荐

