学习心得:class_weight和samples_weight

     学习Logistic回归的时候,在sklearn的LogisticRegression类中,构建学习器时,有一个参数是class_weight。另外在这个类的fit方法中,有一个参数是sample_weight。对这两个参数有一些认识,写篇文章记录一下。

类权重: class_weight

     对于分类任务,当样本集中各个类的样本数相差比较大的时候,我们说样本集是不均衡的。使用不均衡的训练集进行训练,得到的模型一般对样本数较多的类预测效果较好,而样本数较少的类预测效果会比较差。因此为了提高模型性能,需要得到均衡的训练集。

  • 可以通过训练集的扩展,即样本数多的类进行抽样,和样本数少的类一起构成新的均衡的训练集。
  • 根据各个类的样本数计算class_weight,在构建学习器的时候传进去,用来影响样本在loss中的权重。

样本权重:sample_weight

     一般情况下,训练集里的所有样本我们认为权重是一样的。但是某些时候,如果样本的来源不同,某些来源可信度要低于其他的,这时候我们可以将这一部分的样本加上权重,代表它的可信度。

如何对模型训练施加影响

     在计算每个样本的预测误差的时候,会将预测误差乘以该样本的权重。而样本权重为class_weight*sample_weight。

scikit-learn中提供的库函数

sklearn.linear_model.LogisticRegression中,构建学习器时的参数说明:
学习心得:class_weight和samples_weight_第1张图片
     class_weight可以是一个字典,这是我们通过某种方式计算得到的类权重。也可以设置为’balanced’,这时会自动计算类权重。计算公式如下:

n_samples / (n_classes * np.bincount(y))
n_samples:总的样本数
n_classes:类个数
np.bincount(y):每个类的样本数

     这样得到的class_weight是一个1*n的向量,n为类的个数。每个类的类权重乘以该类的样本数,得到的是总样本数按类均分得到的数目。

你可能感兴趣的:(机器学习)