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

class_weight的采样值

邢寒
2023-03-14

我正在尝试在使用随机搜索CV的Scikit学习SVM分类器中使用类权重。

clf= svm.SVC(probability=True, random_state=0)
parameters = {'clf__C': scipy.stats.expon(scale=100), 'clf__gamma': scipy.stats.expon(scale=.1),
    'clf__kernel': ['rbf'], 'clf__class_weight':['balanced', None]}
search=RandomizedSearchCV(estimator=clf, param_distributions=parameters, scoring='f1_micro',
                                       cv=5, n_iter=100, random_state=0)
search.fit(features,labels)

我有四节课。现在对于class_weight,我希望四个类中的每一个都有介于0和1之间的随机值。可以用

'class_weight':[{0: w} for w in [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]]

但这仅适用于一个类,并且值是离散的,而不仅仅是在 0 和 1 之间采样。

我该如何解决这个问题?

最后但同样重要的是,如果我使用0到1之间或1到10之间的值,这有关系吗(即权重是否被重新调整)?

所有4类的权重总和是否应该总是相同的值(例如1)?

共有2个答案

阎淮晨
2023-03-14

你可以尝试列表理解,而不是冗长的解决方案。它对我有用。在随机森林中,我已经检查了随机搜索简历。

l1 = np.arange(0,1,0.01)
l2 = np.arange(0,1,0.01)
class_weight = [{0:i,1:j} for i,j in zip(l1,l2)]
鲜于海
2023-03-14

我不知道将发行版作为字典的键传递的可能性。作为对您提出的解决方法的改进,您可以使用:

from sklearn.utils.class_weight import compute_class_weight
from scipy.stats import lognorm

class_weight = compute_class_weight("balanced", np.unique(y), y)
class_weights = []
for mltp in lognorm(s = 1, loc = 1, scale = class_weight[0]).rvs(50):
    class_weights.append(dict(zip([0, 1], class_weight * [mltp, 1/mltp])))

然后,您可以将class_weights传递给随机搜索CV参数中的clf__class_weight条目。将其扩展到多类方案或使用不同的分布非常简单。请注意,您实际上采样了两次。一次来自真实分布,然后通过随机搜索CV从这个样本。如果确保在每次调用之前重新生成class_weights以适合,或者使初始示例足够大,则此解决方法应该适用于您的情况。

编辑:最好的解决方案是定义你自己的实现< code>rvs方法的类。即使不必将现有的< code>scipy.stats分发子类化为:

class ClassWeights(object):
    """
    Draw random variates for cases when parameter is a dict.
    Should be personalized as needed.
    """
    def __init__(self,y, *args, **kwargs):
        self.class_weights = compute_class_weight("balanced", np.unique(y), y)
        self._make_dists()

    def _make_dists(self):
        self.dist0 = gamma(self.class_weights[0])
        self.dist1 = gamma(self.class_weights[1])

    def rvs(self, *args, **kwargs):
        """override method for drawing random variates"""
        ret_val = { 0: self.dist0.rvs(*args, **kwargs),
                    1: self.dist1.rvs(*args, **kwargs)}
        return ret_val

回答另外两个问题:

权重可以取任何正值(包括0 ),并且它们的总和不必为1。重要的是它们的相对大小,而不是绝对大小。

 类似资料:
  • 在分布式跟踪中,数据量可能非常高,因此采样可能很重要(您通常不需要导出所有spans以获得正在发生的情况)。Spring Cloud Sleuth具有Sampler策略,您可以实现该策略来控制采样算法。采样器不会停止生成跨度(相关)ids,但是它们确实阻止了附加和导出的标签和事件。默认情况下,您将获得一个策略,如果跨度已经处于活动状态,则会继续跟踪,但新策略始终被标记为不可导出。如果您的所有应用程

  • 如果非周期马尔科夫链的状态转移矩阵P和概率分布$$pi(x)$$对于所有的i,j满足:$$pi(i)P(i,j) = pi(j)P(j,i)$$ 则称概率分布$$pi(x)$$是状态转移矩阵P的平稳分布。 在M-H采样中我们通过引入接受率使细致平稳条件满足。现在我们换一个思路。 从二维的数据分布开始,假设$$pi(x_1,x_2)$$是一个二维联合数据分布,观察第一个特征维度相同的两个点$$A(x

  • 本文向大家介绍储层采样,包括了储层采样的使用技巧和注意事项,需要的朋友参考一下 水库采样是一种随机算法。在该算法中,从具有n个不同项的列表中选择k个项。 我们可以通过创建一个数组作为大小为k的容器来解决它。然后从主列表中随机选择一个元素,然后将该项目放置在容器列表中。一次选择一项时,下次将不再选择。但是他的方法无效,我们可以通过这种方法增加复杂性。 在存储库列表中,复制列表中的前k个项目,现在从列

  • 目前 SOFATracer 提供了两种采样模式,一种是基于 BitSet 实现的基于固定采样率的采样模式;另外一种是提供给用户自定义实现采样的采样模式。下面通过案例来演示如何使用。 本示例基于 tracer-sample-with-springmvc 工程;除 application.properties 之外,其他均相同。 基于固定采样率的采样模式 在 application.propertie

  • 我想从MU、MG、PU、PG中取样70次而不替换,以创建一个矩阵(ncol=4,nrow=70),例如。 到目前为止,我有:矩阵(样本(c(“MU”,“MG”,“PU”,“PG”),70*4,F),nrow=70,byrow=TRUE),这是不正确的,因为行可能有不止一个MU,MG,PU,PG的实例。我可以用for循环或更简单的方法来完成吗?

  • 我在尝试制作Bdsk样例文件时出现了一些错误。作为Android Studio的新手,如果能让我知道如何修复这些错误,我将非常感激。 我根据以下说明使用示例源代码:要使用解决方案代码,使用名称“bdsk”和公司域名“bluetooth.com”创建一个新的Android Studio项目。创建项目后,将BDSK\app\src\main文件夹中的内容替换为Bluetooth Developer S