当前位置: 首页 > 知识库问答 >
问题:

学习。当使用具有小平衡数据集的GridSearchCV时,SVC返回完全不同的预测(模型)

郑嘉年
2023-03-14

当利用sk学。GridSearchCV通过skLearning。SVC(概率=True)当训练数据小而平衡(vs.小而不平衡)时,将返回完全不同的预测/模型。考虑这个例子:

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn import svm, datasets
iris = datasets.load_iris()
# Take the first two features. We could avoid this by using a two-dim dataset
X = iris.data[:, :2]
y = iris.target

index = [0,1,2,3,51,52,53,54]
index_unequal = [0,1,2,3,51,52,53,54,55]
new_predictions = [5, 6, 7, 56, 57, 58]
pred_mat, pred_y = X[new_predictions], y[new_predictions]
c_s = [0.01, 0.1, 1.0, 10.0, 100.0]
gamma = [1e-4, 1e-3, 1e-2, 1e-1, 1, 10]
svc_params = [{'kernel': ['rbf'], 'gamma': gamma, 'C': c_s},
              {'kernel': ['linear'], 'C': c_s}]
mat, ye = X[index], y[index]
mat_unequal, y_unequal = X[index_unequal], y[index_unequal]

balanced = GridSearchCV(SVC(probability=True), svc_params, cv=4).fit(mat, ye)
unbalanced = GridSearchCV(SVC(probability=True), svc_params, cv=4).fit(mat_unequal, y_unequal)

print(balanced.predict_proba(pred_mat))
print(unbalanced.predict_proba(pred_mat))

在平衡数据上训练的模型返回所有新数据的概率0.5,而使用不平衡数据训练的模型返回通常预期的结果。我知道本例中使用的训练数据很小,但差异只有1,我很好奇,到底是什么机制被改变,从而给出了完全不同的模型/概率。

更新#1在深入了解这一点并考虑到Vivek下面的回应后(感谢真正伟大的链接!),理解预测predict_proba之间的区别是成功的一半。我可以为GridSearch选择一个优化概率而不是决策函数的评分函数(例如,将评分='neg_log_loss'添加到我的GridSearchCV调用)。这将在两个模型之间提供更好的结果。然而,我仍然对上述问题的结果感到好奇。如果您深入研究这两个模型之间的差异,唯一的两个差异是额外的数据和交叉验证生成器(即StratifiedKFold上的cv属性)选择分配数据的方式。例如,考虑这些分层的k-折叠指标:

balanced_cv_iter = [(np.array([1, 2, 3, 5, 6, 7]), np.array([0, 4])),
            (np.array([0, 2, 3, 4, 6, 7]), np.array([1, 5])),
            (np.array([0, 1, 3, 4, 5, 7]), np.array([2, 6])),
            (np.array([0, 1, 2, 4, 5, 6]), np.array([3, 7]))]

unbalanced_cv_iter = [(np.array([1, 2, 3, 6, 7, 8]), np.array([0, 4, 5])),
              (np.array([0, 2, 3, 4, 5, 7, 8]), np.array([1, 6])),
              (np.array([0, 1, 3, 4, 5, 6, 8]), np.array([2, 7])),
              (np.array([0, 1, 2, 4, 5, 6, 7]), np.array([3, 8]))]

balanced_cv_iter_new = [(np.array([1, 2, 3, 5, 6]), np.array([0, 4, 7])),
            (np.array([0, 2, 3, 4, 6, 7, 1]), np.array([5])),
            (np.array([0, 1, 3, 4, 5, 7, 2]), np.array([6])),
            (np.array([0, 1, 2, 4, 5, 6]), np.array([3, 7]))]

balanced_cv_iterbalanced_cv_iter是上述代码生成的两个潜在列表,与两个模型的培训/测试数据相关。然而,如果我们通过使训练/测试具有奇数个元素(不平衡训练/测试集)来改变balanced\u cv\u iter,那么我们可以得到balanced\u cv\u iter\u new。这样做将导致平衡模型和非平衡模型之间的预测相似。我想这里的教训是针对模型的预期用途进行优化(即选择与模型用途一致的评分函数)?然而,如果有任何关于GridSearch为什么选择具有超参数的SVM估计器的其他想法/意见,从而在不平衡框架下产生更好的概率模型,我想知道。

共有1个答案

齐嘉庆
2023-03-14

你看错了。这与GridSearchCV无关。但是用svm。

您知道,您正试图在SVC上使用predict_proba(),已知SVC有令人困惑的输出,这些输出可能与predict()函数的实际输出不匹配。

我运行你的代码有一个小变化:

print(balanced.predict(pred_mat))
print(unbalanced.predict(pred_mat))

输出为:

[0 0 0 1 0 1]
[0 0 0 1 1 1]

如你所见,这两种情况没有太大不同。在这两个输出中,我能想到的唯一差异来源是,在第二种情况下,您有1个关于第二类的额外数据,这有助于比第一种情况更好地识别它。您可以通过更改类的示例来验证这一点。

至于为什么predict_proba给出这样的结果,请看看:

>

  • Scikit-在留档中学习关于它的澄清

    这是一位scikit开发人员关于StackOverflow的回答

    这是另一位scikit开发人员对差异的出色解释。(请务必阅读评论)

  •  类似资料:
    • 问题内容: 我正在尝试在非常不平衡的数据集上使用LightGBM建立分类器。不平衡率,即: 我使用的参数和训练代码如下所示。 我运行简历来获得最好的模型和最好的回合。我的简历获得了0.994 AUC,并且在验证集中获得了类似的分数。 但是,当我在测试集上进行预测时,我得到的结果非常糟糕。我相信火车是完美采样的。 需要调整哪些参数?问题的原因是什么?我是否应该对数据集重新采样以减少最高等级? 问题答

    • 我正在开发一个应用程序,它将生成一些图表,我正在使用chartjs来绘制它们。 我面临的问题是:图表将用动态数据生成。应用程序最多可以生成9个数据集,很少会有相同的大小。当数据集大小不匹配时,如何使图表提前或填充值? 我在stackoverflow甚至在chartjs github页面上看到了一些例子,但它们对我不起作用。 这是我目前所拥有的一个示例:https://jsfidle.net/cam

    • 我想写一些java代码使用Spring引导消耗JSON数据从一个特定的endpoint。然而,对于每个请求,响应可能返回不同的数据字段。 等等 下面是我当前的代码,它处理第一个案例。我可以写另一个Rates.java来满足第二个案例等等,但是我希望有一个Rates.java文件来处理所有可能的案例。 LiveData。JAVA 费率。JAVA 消费Rest.java(主)

    • 我正在使用scikit-learn 0.14的GridSearchCV,但总是得到以下警告: /Library/Frameworks/epd 64 . framework/Versions/7.2/lib/python 2.7/site-packages/sk learn/grid _ search . py:706:deprecation warning:忽略GridSearchCV的附加参数!

    • 实际上,我正在使用DynamoDBmapper查询我的dynamo表。为此,我创建了两个类,映射程序使用它们转换表返回的查询。见下文 ame.java java 然后我在HashKey上查询我的表,如下所示 对于GSI,我会这样做 一切都很好,但是对于名为typos的字段,我得到了两个查询之间的差异。对于customer_id,我获得如下完整元素 但对于同一个用户,但使用他的GSI,我得到如下结果

    • 问题内容: 我正在尝试为我的大型不平衡数据集创建N个平衡随机子样本。有没有一种方法可以简单地通过scikit-learn / pandas来做到这一点,或者我必须自己实现它?任何指向此功能的代码的指针? 这些子样本应该是随机的,并且在我将每个样本送入非常大的分类器集合中的各个分类器时可以重叠。 在Weka中,有一个名为spreadsubsample的工具,在sklearn中是否有等效工具? htt