简介

这一节主要是为模型打补丁,在这之前笔者已经介绍并实现了几种典型的机器学习模型,比如线性回归、logistic回归、最大熵、感知机、svm等,但目前它们都有一个共性,那就是构造的损失函数对每个样本都是“一视同仁”的,即每个样本在损失函数中权重都是一样的,为了方便,可以将它们的损失函数做如下抽象:

\[L(w,x,y)=\sum_{i=1}^Nl(w,x_i,y_i)
\]

这里\(L(\cdot)\)表示整体的损失函数,\(l(w,x_i,y_i)\)表示第\(i\)个样本的损失函数,样本量为\(N\),对具体情况有:

线性回归有:

\[l(w,x_i,y_i)=(y_i-w^Tx_i)^2
\]

对logistic回归:

\[l(w,x_i,y_i)=-y_ilog\phi(x_i,w)-(1-y_i)log(1-\phi(x_i,w)),这里 \phi(x,w)=\frac{1}{1+e^{-w^Tx}}
\]

对感知机:

\[l(w,x_i,y_i)=max\{0,-y_iw^Tx_i\}
\]

对最大熵模型:

\[l(w,x_i,y_i)=\frac{exp(\sum_{j=1}^nw_jf_j(x_i,y_i))}{\sum_yexp(\sum_{j=1}^nw_jf_j(x_i,y))},这里f_j,j=1,2,..,n表示特征函数
\]

对svm:

\[l(w,x_i,y_i)=\frac{1}{2N}w^Tw+C\varepsilon_i,y_i(w^T\phi(x_i)+b)\geq 1-\varepsilon_i,\varepsilon_i\geq0
\]

代价敏感

如果对所有样本的损失函数都考虑一样的权重其实是有问题的,比如对于离群点异常点这样的数据,其实可以忽略掉其损失函数;特别地,对于类别不平衡分类问题,我们可以给少数类样本更高的权重,而对于多数类更低的权重;另外对于像adaboost这样的集成学习方法,我们可以迭代调整每个样本点的权重以组合得到一个不错的强分类器;所以在损失函数中考虑样本权重,在某些场景下其实很有必要,简单来说考虑样本权重后,损失函数可以更新如下:

\[L(w,x,y)=\sum_{i=1}^N\alpha_il(w,x_i,y_i)
\]

这里\(\alpha_i\)表示样本\(i\)的权重

代码实现

代码实现其实很easy,根据目前的情况可以分为两类:

(1)若采用的随机梯度下降,可以对每次更新时的梯度\(dw\)乘以\(\alpha_i\);

(2)若采用对偶方式求解,则对其拉格朗日乘子做调整

具体地,我们为fit函数添加一个参数sample_weight以指定每个样本的权重(对各模型的更新代码就不帖了,见ml_models),接下来我们用svm测试不平衡分类的效果

from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import numpy as np
import os
os.chdir('../')
from ml_models import utils
from ml_models.svm import SVC
%matplotlib inline
X, y = make_classification(n_samples=500, n_features=2,
n_informative=2,n_redundant=0,
n_repeated=0, n_classes=2,
n_clusters_per_class=1,weights=[0.05, 0.95],
class_sep=3,flip_y=0.05, random_state=0)
svc_without_sample_weight=SVC(kernel='rbf',gamma=2.0,tol=0.01)
svc_without_sample_weight.fit(X,y)
utils.plot_decision_function(X=X,y=y,clf=svc_without_sample_weight)

#然后我们加大少数类的权重
weights=np.where(y==0,20,1)
svc_with_sample_weight=SVC(kernel='rbf',gamma=2.0,tol=0.01)
svc_with_sample_weight.fit(X,y,sample_weight=weights)
utils.plot_decision_function(X=X,y=y,clf=svc_with_sample_weight)

《机器学习_08_代价敏感学习_添加sample_weight支持》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. matlab混合编程向导(vc,vb,.net...)

    一.matlab与vc混编  1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用:     这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2)  ...

  2. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)

    //非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...

  3. codeforce 225B Code Parsing

      Little Vitaly loves different algorithms. Today he has invented a new algorithm just for you. Vita ...

  4. Haporxy

    安装Haproxy: 下载 wget https://fossies.org/linux/misc/haproxy-1.8.3.tar.gz tar -zxf haproxy-.tar.g cd ha ...

  5. 「译」JVM是如何使用那些你从未听过的x86魔幻指令实现String.compareTo的

    原文https://jcdav.is/2016/09/01/How-the-JVM-compares-your-strings/ 魔幻的String.compareTo 我们之前可能已经见过Java的 ...

  6. C# 基础知识系列- 17 实战篇 编写一个小工具(1)

    0. 前言 这是对C# 基础系列的一个总结,现在我们利用之前学到的知识做一个小小的工具来给我们使用. 如果有看过IO篇的小伙伴,应该有印象.当时我提过一个场景描述,我们在平时使用系统的时候,经常会为了 ...

  7. js和jq的获取焦点失去焦点写法

  8. Java return 关键字

    一.基本概念 return一方面用在循环语句中来结束循环,另一方面用来终止函数的执行或者退出类的方法,并把控制权返回该方法的调用者.如果方法有返回类型,则return的返回该类型的值:如果没有返回值, ...

  9. C++中的隐式转换和explicit

    隐式转换 c++中的数据类型转换分为隐式转换和显示转换: 显示转换即使用static_cast等方法进行转换,相关内容请参考 <C++数据类型转换>: 隐式转换则是编译器完成的,如,boo ...

  10. ASP.NET Core on K8S学习之旅(12)Ingress

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...