自定义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()。参数传递完全混乱
调用自定义函数时的参数完全不符合逻辑:- 参数顺序颠倒:第一个参数
feature_matrix应该传入测试特征feat_test,你却传了labels_test;第二个参数labels应该是真实标签labels_test,你传成了预测结果y_pred。 - 模型参数传错:
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
相关产品推荐
相关产品推荐

