LogisticRegression分类结果异常求助:模型输出不符合预期
LogisticRegression分类预测异常问题排查与解决
我尝试用LogisticRegression基于训练数据对测试集样本做分类预测,代码无报错但结果不符合预期。具体情况:
- 训练数据共375个样本,分4个类别,每个样本3个特征(可绘制3D图),其中类别2占比超50%
- 初始预测所有测试样本全被分为类别2;随机选125个样本(和测试集规模一致)做训练集,结果还是全为类别2
- 用各类别样本数量均等的训练集时,预测结果覆盖4个类别,但在线测试准确率仅26%,和随机猜测水平相当
怀疑是数据处理环节有问题,不确定是否需要对train_X、train_y、test_X做格式转换或预处理,该怎么操作?
附上相关代码:
# forming tables to push through logistic regression train_X = [] train_y = [] for i in range(len(train_table)): train_X.append( [train_table.x.iloc[i], train_table.y.iloc[i], train_table.z.iloc[i]] ) train_y.append(train_table.label.iloc[i]) test_X = [] for k in range(len(test_table)): test_X.append([test_table.x.iloc[k], test_table.y.iloc[k], test_table.z.iloc[k]]) # Trying with and without normalize clf = LogisticRegression().fit(normalize(train_X), train_y) # clf = LogisticRegression().fit(train_X, train_y) predict = clf.predict(test_X[:]) prob = clf.predict_proba(test_X[:]) results = pd.DataFrame( sort_results(test_table, predict, prob), columns=["", "timestamp", "UTC time", "label", "accuracy"], )
问题分析与处理步骤
1. 数据格式与预处理规范
- 替换手动列表构造:当前用循环生成列表的方式容易出现格式不一致,直接用Pandas内置方法转换为模型适配的NumPy数组:
train_X = train_table[['x', 'y', 'z']].values train_y = train_table['label'].values test_X = test_table[['x', 'y', 'z']].values - 归一化/标准化一致性:训练集和测试集必须用相同的预处理逻辑,不能只处理训练集。推荐用
StandardScaler实现:from sklearn.preprocessing import StandardScaler scaler = StandardScaler() # 仅在训练集上拟合,避免数据泄露 train_X_scaled = scaler.fit_transform(train_X) test_X_scaled = scaler.transform(test_X)
2. 类别不平衡问题处理
- 调整模型权重:针对类别2占比过高的情况,设置
class_weight='balanced'让模型自动给少数类别分配更高权重:clf = LogisticRegression(class_weight='balanced').fit(train_X_scaled, train_y) - 重采样优化:如果权重调整效果不佳,可对少数类别做过采样(如SMOTE算法),或对多数类别做欠采样,平衡训练集类别分布。
3. 多分类模型参数优化
- 适配多分类场景:LogisticRegression默认适配二分类,处理4分类需明确设置参数:
clf = LogisticRegression( class_weight='balanced', multi_class='multinomial', solver='lbfgs', max_iter=1000 # 增加迭代次数确保收敛 ).fit(train_X_scaled, train_y) - 交叉验证验证效果:用交叉验证评估模型泛化能力,避免单一训练集的偏差:
from sklearn.model_selection import cross_val_score scores = cross_val_score(clf, train_X_scaled, train_y, cv=5) print("交叉验证准确率均值:", scores.mean())
4. 基础数据校验
- 检查特征列
x、y、z是否存在缺失值、异常值,可通过train_table[['x','y','z']].describe()查看统计信息,必要时做填充或过滤; - 确认
train_y的类别标签格式统一(如整数或字符串),无空值或格式错误。
内容的提问来源于stack exchange,提问作者Jason Padgett
相关产品推荐
相关产品推荐

