当我将惩罚更改为 L1 时,为啥我的 linearSVC 会失败?

Posted

技术标签:

【中文标题】当我将惩罚更改为 L1 时,为啥我的 linearSVC 会失败?【英文标题】:Why does my linearSVC fail when I change the penalty to L1?当我将惩罚更改为 L1 时,为什么我的 linearSVC 会失败? 【发布时间】:2021-10-11 10:26:28 【问题描述】:

我正在尝试按照 Hyun 等人的论文中提出的方法从 scikit-learn 构建线性 SVC 模型。 (来源:https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1007608#sec010)。论文中写道:

SVM 是在 scikit-learn 中实现的,使用按类频率加权的平方铰链损失来解决类不平衡问题。包含 L1 正则化以强制特征选择的稀疏性

我尝试使用以下代码自己实现:

import numpy as np
from sklearn.model_selection import RepeatedStratifiedKFold, cross_val_score
from sklearn.metrics import accuracy_score
import pandas as pd
from sklearn.svm import LinearSVC
from numpy import mean, std

model = LinearSVC(penalty="l1", class_weight='balanced', loss='squared_hinge')
cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=5, random_state=127)
n_scores = cross_val_score(model, X_data, Y_data, scoring="accuracy", cv=cv, n_jobs=-1)

其中涉及的X数据是基因存在/不存在的二进制矩阵; y 数据是二元表型分类器(抗性 = 1,易感 = 0)。很遗憾,我无法授予对数据集的访问权限。

但是,在返回我的结果 (n_scores) 后,所有值都是“nan”。当我再次执行相同的任务但将惩罚设置为 l2 时,我会得到准确度分数。

发生了什么?为什么它不起作用?

【问题讨论】:

cross_val_score有一个参数error_score;将其设置为 "raise" 并将生成的回溯编辑到您的问题中。 @BenReiniger 感谢您的评论。我这样做并确定应将双重参数设置为false。我还要感谢我联系过的论文的作者。他们还向我推荐了这个例子:scikit-learn.org/stable/auto_examples/svm/plot_svm_scale_c.html 【参考方案1】:

Dual 必须设置为 False。示例:https://scikit-learn.org/stable/auto_examples/svm/plot_svm_scale_c.html

【讨论】:

以上是关于当我将惩罚更改为 L1 时,为啥我的 linearSVC 会失败?的主要内容,如果未能解决你的问题,请参考以下文章

当我将滚动方向从垂直更改为水平时,为啥集合视图会崩溃?

sklearn中是不是有设置惩罚阈值的参数?

在我的Spring Boot项目中,当我将文件目录更改为src / main / resources时发生了FileNotFoundException

为啥我的电子表格以 .xlsx 扩展名保存,但在我将其更改为 .xls 之前不会发生?

为啥当我添加一个选择选项来选择表单字段时不会更改为有效?

当我将 viewpager 与 Indicator Android 一起使用时,将背景状态栏更改为背景 viewpager?