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

自定义Hinge Loss与sklearn Hinge Loss结果差异排查求助

自定义Hinge Loss与sklearn结果差异的原因分析

你的自定义函数和调用逻辑存在多处致命错误,导致和sklearn的结果完全不符,具体问题如下:

  • 核心计算逻辑语法错误
    自定义函数里的lf = 0,1 - labels*(np.sum(feature_matrix * theta, axis = 1) + theta_0这行代码存在两个问题:一是用逗号分隔0和计算式会创建一个元组,而非逐元素计算max(0, 1 - y*(wx+b));二是缺少右括号。正确的逐元素取最大值应该用np.maximum(0, ...),而非逗号加max()。

  • 参数传递完全混乱
    调用自定义函数时的参数完全不符合逻辑:

    1. 参数顺序颠倒:第一个参数feature_matrix应该传入测试特征feat_test,你却传了labels_test;第二个参数labels应该是真实标签labels_test,你传成了预测结果y_pred。
    2. 模型参数传错:theta和theta_0应该是训练好的SVM模型的权重系数(clf.coef_)和截距(clf.intercept_),但你把随机生成的sample_weight传给了theta,还手动设theta_0=1,完全脱离了模型的实际参数。
  • sklearn的hinge_loss使用错误
    sklearn的hinge_loss函数要求第二个参数传入模型决策函数的输出值(即clf.decision_function(feat_test)),而非clf.predict()返回的分类标签。你传入分类标签的做法本身就不符合该函数的使用规范。

  • 未处理样本权重
    测试代码中给sklearn的hinge_loss传入了sample_weight,但自定义函数完全没有实现样本权重的加权平均逻辑,这也会导致结果差异。


修正后的自定义Hinge Loss函数及调用示例

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.metrics import hinge_loss
from sklearn.model_selection import train_test_split

# 修正后的自定义Hinge Loss(支持样本权重)
def hinge_loss_full(feature_matrix, labels, theta, theta_0, sample_weight=None):
    # 计算每个样本的损失项
    loss_terms = np.maximum(0, 1 - labels.flatten() * (np.dot(feature_matrix, theta.flatten()) + theta_0))
    if sample_weight is not None:
        # 加权平均损失
        return np.sum(loss_terms * sample_weight) / np.sum(sample_weight)
    else:
        # 普通平均损失
        return np.mean(loss_terms)

# 数据准备与模型训练
data = load_breast_cancer()
features = data.data
labels = data.target
# 将标签转换为Hinge Loss标准的{-1,1}格式
labels[labels == 0] = -1

feat_train, feat_test, labels_train, labels_test = train_test_split(features, labels, test_size=0.2, random_state=42)
sample_weight = np.random.rand(len(labels_test))

clf = SVC(kernel='linear', C=1.0, random_state=42)
clf.fit(feat_train, labels_train)

# sklearn标准调用(传入决策函数输出)
sklearn_loss = hinge_loss(labels_test, clf.decision_function(feat_test), sample_weight=sample_weight)
# 自定义函数正确调用
custom_loss = hinge_loss_full(feat_test, labels_test, clf.coef_, clf.intercept_, sample_weight=sample_weight)

print("sklearn Hinge loss:", sklearn_loss)
print("自定义Hinge loss:", custom_loss)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:20:27