已完成鸢尾花数据集逻辑回归,如何用参数权重构建测试数据评分公式?
手动实现逻辑回归预测(无需predict函数)
没问题!我来带你一步步实现不用predict函数,直接用模型参数计算预测结果的方法,完全贴合你用鸢尾花数据集训练的逻辑回归场景~
第一步:先补全完整的训练流程
首先把你没写完的训练代码补全,确保我们有训练好的模型和预处理好的测试数据:
from sklearn import datasets from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split # 加载数据集 iris = datasets.load_iris() X = iris.data y = iris.target # 拆分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 数据标准化(注意:测试集要用训练集的scaler拟合结果!) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 训练逻辑回归模型(默认是多分类的multinomial模式,用softmax) model = LogisticRegression() model.fit(X_train_scaled, y_train)
第二步:提取模型核心参数
训练好的模型会输出两个关键参数:
model.coef_:形状为(n_classes, n_features),每个类别对应一组特征权重model.intercept_:形状为(n_classes,),每个类别的截距项
你可以先打印看看参数:
print("权重矩阵(coef_):\n", model.coef_) print("截距项(intercept_):\n", model.intercept_)
第三步:手动计算预测结果
因为鸢尾花是3分类任务,sklearn默认用Softmax回归(属于多分类逻辑回归),所以我们分两步计算:
1. 计算每个类别的线性得分(Logits)
对于每个标准化后的测试样本x,每个类别k的线性得分公式是:
z_k = x · coef_[k].T + intercept_[k]
用矩阵运算可以一次性计算所有测试样本的所有类别得分:
import numpy as np # 计算所有测试样本的类别得分:形状为(n_samples, n_classes) logits = np.dot(X_test_scaled, model.coef_.T) + model.intercept_
2. 用Softmax转换为类别概率
Softmax函数会把每个样本的logits转换成0-1之间的概率,所有类别概率之和为1:
# 实现softmax函数(防止数值溢出的优化版) def softmax(logits): # 先减去每个样本的最大logit,避免指数运算溢出 exp_logits = np.exp(logits - np.max(logits, axis=1, keepdims=True)) return exp_logits / np.sum(exp_logits, axis=1, keepdims=True) # 计算概率 probabilities = softmax(logits)
3. 得到最终预测类别
取每个样本概率最大的类别索引,就是预测结果:
# 手动预测结果 manual_predictions = np.argmax(probabilities, axis=1) # 和sklearn的predict结果对比,验证正确性 sklearn_predictions = model.predict(X_test_scaled) print("手动预测和sklearn预测是否一致:", np.array_equal(manual_predictions, sklearn_predictions))
补充:如果是二分类任务
如果是二分类场景,逻辑回归用的是Sigmoid函数,公式会更简单:
- 计算线性得分:
z = x · coef_.T + intercept_ - 转换为概率:
prob = 1 / (1 + np.exp(-z)) - 预测类别:
np.where(prob >= 0.5, 1, 0)
关键注意事项
- 必须用训练集的标准化参数处理测试集:绝对不能对测试集重新
fit,否则会引入数据泄露,导致结果错误 - 多分类和二分类的区别:sklearn的
LogisticRegression当multi_class="multinomial"时用Softmax,multi_class="ovr"时是一对多的二分类逻辑回归,手动计算时要对应调整
内容的提问来源于stack exchange,提问作者Kumar AK
相关产品推荐
相关产品推荐

