NDArray标量

NDArray标量类型

  • numpy中定义了24种新python类型(NDArray标量类型)

    • 类型描述符主要基于CPython中C语言可用的类型
  • 标量具有和ndarray相同的属性和方法

    • 数组标量不可变,故属性不可设置

numpy_dtype_hierarchy

内置标量类型

Routine Desc
iinfo(int_type) 整数类型的取值范围等信息
finfo(float_type) 浮点类型的取值范围等信息

Python关联

NumPy类型 Python类型 64位NumPy定长类型 Desc
int_ 继承自int(Python2) int64
float_ 继承自float float64
complex_ 继承自complex complex128
bytes_ 继承自bytes S#"/"a#" Python字节串
unicode_ 继承自str "U#" Python字符串
void "V#" Python缓冲类型
object_ 继承自object(Python3) "O" Python对象引用
  • np.bool_类似Python中bool类型,但不继承它

    • Python中bool类型不允许被继承
    • np.bool_大小和bool类型大小不同
  • np.int_不继承自int,因为后者宽度不再固定

    • NumPy中数组没有真正np.int类型,因为宽度不再固定, 各产品
  • bytes_unicode_void是可灵活配置宽度的类型

    • 在指定长度后不能更改,赋长于指定长度的值会被截断
    • unicode_:强调内容为字符串
    • bytes_:强调内容为字节串
    • void:类型强调内容为二进制内容,但不是字节串
  • object_存储的是python对象的引用而不对象本身

    • 其中引用不必是相同的python类型
    • 兜底类型
  • Python基本类型等在NumPy命名空间下都有同名别名,如: np.unicode == np.str == str
  • NumPy数组中数据类型无法被真正设置为int类型,为保证数组 中元素宽度一致性,必然无法被设置为非定长类型

C类型关联

  • NumPy支持的原始类型和C中原始类型紧密相关
NumPy类型 C类型 64位定长别名 Desc 单字符代码 定长字符串代码
bool_ bool bool8 存储为字节的bool值 "?"
byte signed char int8 "b" "i1"
short short int16 "h" "i2"
intc int int32 "i" "i4"
int_ long int64 "l" "i8"
longlong long long "q"
ubyte unsigned char uint8 "B" "u1"
ushort unsigned short uint16 "H" "u2"
uintc unsigned int uint32 "I" "u4"
uint usigned long uint64 "L" "u8"
ulonglong unsigned long long "Q"
half float16 半精度浮点:1+5+10 "e" "f2"
single float float32 单精度浮点,通常为:1+8+23 "f4"
double double float64 双精度浮点,通常为:1+11+52 "d" "f8"
longdouble/longfloat long double float128 平台定义的扩展精度浮点 "g" "f16"
csingle float complex complex64 两个单精度浮点 "F" "c8"
cdouble/cfloat double complex complex128 两个双精度浮点 "D" "c16"
clongdouble/clongfloat long duoble complex complex256 两个扩展精度浮点 "G" "c32"
  • float complexdouble complex类型定义在complex.h
  • C中的定长类型别名定义在stdint.h

其他类型

Python类型 Desc 单字符代码 定长字符串代码
timedelta64 时间增量 "m" "m8"
datetime64 日期时间 "M" "M8"

属性、索引、方法

  • 数组标量属性基本同ndarray

  • 数组标量类似0维数组一样支持索引

    • X[()]返回副本
    • X[...]返回0维数组
    • X[<field-name>]返回对应字段的数组标量
  • 数组标量与ndarray有完全相同的方法

    • 默认行为是在内部将标量转换维等效0维数组,并调用相应 数组方法

定义数组标量类型

  • 从内置类型组合结构化类型
  • 子类化ndarray
    • 部分内部行为会由数组类型替代
  • 完全自定义数据类型,在numpy中注册
    • 只能使用numpy C-API在C中定义

数据类型相关函数

数据类型信息

Function Desc
finfo(dtype) 机器对浮点类型限制
iinfo(type) 机器对整型限制
MachAr([float_conv,int_conv]) 诊断机器参数
typename(char) 对给定数据类型字符代码的说明

数据类型测试

Function Desc
can_cast(from_,to[,casting]) 是否可以类型转换
issctype(rep) rep(不能为可转换字符串)是否表示标量数据类型
issubdtype(arg1,arg2) arg1在数据类型层次中较低(即dtypeissubclass
issubsctype(arg1,arg2) issubdtype,但支持包含dtype属性对象作为参数
issubclass_(arg1,arg2) 同内置issubclass,但参数非类时仅返回False,而不是raise TypeError
  • np.int64np.int32在层次体系中不同、且层级一致,所以 会出现issubdtype(np.int64, int) -> True,其他情况为 False

  • 通过np.can_cast函数确定safely类型转换

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def print_casting(ntypes):
    print("X")
    for char in ntypes:
    print(char, end=" ")
    print("")
    for row in ntypes:
    print(row, end=" ")
    for col in ntypes:
    print(int(np.can_cast(row, col)), end=" ")
    print("")
    print_casting(np.typecodes["All"])

数据类型确定

Function Params ReturnType ReturnDesc
min_scalar_type(a) 标量值 dtype实例 满足要求最小类型
promote_types(type1,type2) dtype等 dtype实例 可安全转换的最小类型
result_type(*array_and_dtypes) dtype等、标量值、数组 dtype实例 应用promotion rules得到类型
find_common_type(array_types,scalar_types) dtype等列表 dtype实例 综合考虑标量类型、数组类型
common_type(*arrays) 数值型数组(有dtype属性) 预定义类型 满足要求类型中、最高精度类型
maximum_sctype(t) dtype等、标量值、数组 预定义类型 满足要求类型中、最高精度类型
obj2sctype(rep[,default]) dtype等、标量值、数组 预定义类型 对象类型
sctype2char(sctype) dtype等、标量值、数组 类型字符代码 满足要求的最小类型
mintypecode(typechars[,typeset,default]) dtype等、标量值、数组 类型字符代码 typeset中选择
  • 除非标量和数组为不同体系内数据类型,否则标量不能up_cast 数组数据类型

数据类型类np.dtype

1
class dtype(obj[,align,copy])
  • numpy.dtype类描述如何解释数组项对应内存块中字节

    • 数据大小
    • 数据内存顺序:little-endianbig-endian
    • 数据类型
      • 结构化数据
        • 各字段名称
        • 各字段数据类型
        • 字段占用的内存数据块
      • 子数组
        • 形状
        • 数据类型
  • numpy.dtype实例作为参数的场合,大部分场景可用等价、 可转换为dtype实例的其他值代替

    • python、numpy中预定义的标量类型、泛型类型
    • 创建dtype实例类型的字符串、字典、列表
    • 包含dtype属性的类、实例

数据类型元素

类型类

  • NumPy内置类型

    • 24中内置数组标量类型
    • 泛型类型

      |Generic类型|转换后类型| |——-|——-| |number,inexact,floating|float_| |complexfloating|complex_| |integer,signedinteger|int_| |unsignedinteger|uint| |character|string| |generic,flexible|void|

  • python内置类型,等效于相应数组标量

    • 转换规则同NumPy内置数组标量类型
    • None:缺省值,转换为float_

      |Python内置类型|转换后类型| |——-|——-| |int|int_| |bool|bool_| |float|float_| |complex|complex_| |bytes|bytes_| |str|unicode_| |unicode|unicode_| |buffer|void| |Others|object_|

  • 带有.dtype属性的类型:直接访问、使用该属性

    • 该属性需返回可转换为dtype对象的内容

可转换类型的字符串

  • numpy.sctypeDict.keys()中字符串

  • Array-protocal类型字符串,详细参见NumPy数组标量类型

    • 首个字符指定数据类型
    • 支持指定字节数的字符可在之后指定项目占用字节数
      • 定长类型只能指定满足平台要求的字节数
      • 非定长类型可以指定任意字节数

    |代码|类型| |——-|——-| |'?'|boolean| |'b'|(signed) byte,等价于'i1'| |'B'|unsigned byte,等价于'u1'| |'i'|(signed) integer| |'u'|unsigned integer| |'f'|floating-point| |'c'|complex-floating point| |'m'|timedelta| |'M'|datetime| |'O'|(Python) objects| |'S'/'a'|zero-terminated bytes (not recommended)| |'U'|Unicode string| |'V'|raw data (void)|

结构化数据类型

Function Desc
format_parser(formats,names,titles[,aligned,byteorder]) 创建数据类型
dtype(obj[,align,copy])
  • 结构化数据类型

    • 包含一个或多个数据类型字段,每个字段有可用于访问的 名称
    • 父数据类型应有足够大小包含所有字段
    • 父数据类型几乎总是基于void类型
  • 仅包含不具名、单个基本类型时,数组结构会穿透

    • 字段不会被隐式分配名称
    • 子数组shape会被添加至数组shape

参数格式

  • 可转换数据类型的字符串指定类型、shape

    • 依次包含四个部分
      • 字段shape
      • 字节序描述符:<>|
      • 基本类型描述符
      • 数据类型占用字节数
        • 对非变长数据类型,需按特定类型设置
        • 对变长数据类型,指字段包含的数量
    • 逗号作为分隔符,分隔多个字段
    • 各字段名称只能为默认字段名称
    • 对变长类型,仅设置shape时,会将其视为bytes长度
    1
    dt = np.dtype("i4, (2,3)f8, f4")
  • 元组指定字段类型、shape

    • 元组中各元素指定各字段名、数据类型、shape: (<field_name>, <dtype>, <shape>)
      • 若名称为''空字符串,则分配标准字段名称
    • 可在列表中多个元组指定多个字段 [(<field_name>, <dtype>, <shape>),...]
    • 数据类型dtype可以嵌套其他数据类型
      • 可转换类型字符串
      • 元组/列表
    1
    2
    3
    dt = np.dtype(("U10", (2,2)))
    dt = np.dtype(("i4, (2,3)f8, f4", (2,3))
    dt = np.dtype([("big", ">i4"), ("little", "<i4")])
  • 字典元素为名称、类型、shape列表

    • 类似format_parser函数,字典各键值对分别指定名称 列表、类型列表等: {"names":...,"formats":...,"offsets":...,"titles":...,"itemsize":...}
      • "name""formats"为必须
      • "itemsize"指定总大小,必须足够大
    • 分别指定各字段:"field_1":..., "field_2":...
      • 不鼓励,容易与上一种方法冲突
    1
    2
    3
    4
    dt = np.dtype({
    "names": ['r', 'g', 'b', 'a'],
    "formats": ["u1", "u1", "u1", "u1"]
    })
  • 解释基数据类型为结构化数据类型: (<base_dtype>, <new_dtype>)

    • 此方式使得union成为可能
    1
    dt = np.dtype(("i4", [("r", "I1"), ("g", "I1"), ("b", "I1"), ("a", "I1")]))

属性

  • 描述数据类型

    |属性|描述| |——-|——-| |.type|用于实例化此数据类型的数组标量类型| |.kind|内置类型字符码| |.char|内置类型字符码| |.num|内置类型唯一编号| |.str|类型标识字符串|

  • 数据大小

    |属性|描述| |——-|——-| |.name|数据类型位宽名称| |.itemsize|元素大小|

  • 字节顺序

    |属性|描述| |——-|——-| |.byteorder|指示字节顺序|

  • 字段描述

    |属性|描述| |——-|——-| |.fields|命名字段字典| |.names|字典名称列表|

  • 数组类型(非结构化)描述

    |属性|描述| |——-|——-| |.subtype|(item_dtype,shape)| |.shape||

  • 附加信息

    |属性|描述| |——-|——-| |.hasobject|是否包含任何引用计数对象| |.flags|数据类型解释标志| |.isbuiltin|与内置数据类型相关| |.isnative|字节顺序是否为平台原生| |.descr|__array_interface__数据类型说明| |.alignment|数据类型需要对齐的字节(编译器决定)| |.base|基本元素的dtype|

方法

  • 更改字节顺序

    |方法|描述| |——-|——-| |.newbyteorder([new_order])|创建不同字节顺序数据类型|

  • Pickle协议实现

    |方法|描述| |——-|——-| |.reduce()|pickle化| |.setstate()||

Datetime

  • Numpy种时间相关数据类型
    • 支持大量时间单位
    • 基于POSIX时间存储日期时间
    • 使用64位整形存储值,也由此决定了时间跨度

np.datetime64

  • np.datetime64表示单个时刻
    • 若两个日期时间具有不同单位,可能仍然代表相同时刻
    • 从较大单位转换为较小单位是安全的投射

创建

  • 创建规则

    • 内部存储单元自动从字符串形式中选择单位
    • 接受"NAT"字符串,表示“非时间”值
    • 可以强制使用特定单位
  • 基本方法:ISO 8601格式的字符串

    1
    2
    np.datetime64("2020-05-23T14:23")
    np.datetime64("2020-05-23T14:23", "D")
  • 从字符串创建日期时间数组

    1
    2
    3
    np.array(["2020-01-23", "2020-04-23"], dtype="datetime64")
    np.array(["2020-01-23", "2020-04-23"], dtype="datetime64[D]")
    np.arange("2020-01-01", "2020-05-03", dtype="datetime64[D]")
  • np.datetime64为向后兼容,仍然支持解析时区

np.timedelta64

  • np.timedelta64:时间增量
  • np.timedelta64是对np.datetime64的补充,弥补Numpy对 物理量的支持

创建

  • 创建规则

    • 接受"NAT"字符串,表示“非时间”值数字
    • 可以强制使用特定单位
  • 直接从数字创建

    1
    np.timedelta64(100, "D")
  • 从已有np.timedelta64创建,指定单位

    • 注意,不能将月份及以上转换为日,因为不同时点进制不同
    1
    np.timedelta(a, "M")

运算

  • np.datetime64可以和np.timedelta64联合使用

    1
    2
    np.datetime64("2020-05-14") - np.datetime64("2020-01-12")
    np.datetime64("2020-05-14") + np.timedelta64(2, "D")

相关方法

Function Desc
np.busdaycalendar(weekmask,holidays) 返回存储有效工作日对象
np.busday_offset(date,offset[,roll,weekmask,holidays,busdaycal,out]) 工作日offset
np.is_busday(date[,weekmask,holidays,busdaycal,out]) 判断是否是工作日
np.busday_count(begindates,enddates[,weekmask,holidays,busdaycal,out]) 指定天数
np.datetime_as_string(arr[,unit,timezone,...]) 转换为字符串数组
np.datetime_date(dtype,/) 获取日期、时间类型步长信息
  • np.busday_offset
    • roll缺省为"raise",要求date本身为工作日

NDArray

NDArray

1
class ndarray(shape[,dtype,buffer,offset])
  • ndarray:具有相同类型、大小(固定大小)项目的多维容器

    • ndarray由计算中内存连续的一维段组成,并与将N个整数 映射到块中项的位置的索引方案相结合
    • 可以共享相同数据段,即可以是其他数据区的视图
      • 另一个ndarray
      • 实现buffer的对象
  • 属性

    • shape:指定尺寸、项目数量
    • dtypedata-type object):指定项目类型
    • strides:存储各维度步幅,用于计算连续数据段中偏移

https://www.numpy.org.cn/reference/arrays/ndarray.html/https://www.numpy.org.cn/reference/arrays/ndarray.html

Broadcast 广播规则

Broadcasting:4条广播规则用于处理不同shape的数组

  • 非维数最大者在shape前用1补足
  • 输出的shape中各维度是各输入对应维度最大值
  • 各输入的维度同输出对应维度相同、或为1
  • 输入中维度为1者,对应的(首个)数据被用于沿该轴的 所有计算 (即对应的stride0ufunc不step along该维度)
1
2
3
4
5
shape(3, 2, 2, 1) + shape(1, 3)
-> shape(3, 2, 2, 1) + shape(1, 1, 1, 3)
-> shape(3, 2, 2, 3) + shape(1, 1, 2, 3)
-> shape(3, 2, 2, 3) + shape(1, 2, 2, 3)
-> shape(3, 2, 2, 3) + shape(3, 2, 2, 3)

数组属性

内存布局

属性 描述
ndarray.flags 有关数组内存布局的信息
ndarray.shape 数组维度(元组)
ndarray.strides 遍历数组时每个维度中的字节数量(元组)
ndarray.ndim 数组维数
ndarray.data Python缓冲区对象指向数组的数据的开头
ndarray.size 数组中的元素数
ndarray.itemsize 数组元素的长度,以字节为单位
ndarray.nbytes 数组元素消耗的总字节数
ndarray.base 如果内存来自其他对象,则为基础对象

数据类型

属性 描述
ndarray.dtype 元素数据类型

其他属性

属性 描述
ndarray.T 转置
ndarray.real 实数部分
ndarray.imag 虚数部分
ndarray.flat 数组的一维迭代器

数组接口

属性 描述
__array_interface__ 数组接口python端
__array_struct__ 数组接口C语言端

ctypes外部函数接口

属性 描述
ndarray.ctypes 简化数组和ctypes模块交互的对象

np.nditer

  • ndarray对象的默认迭代器是序列类型的默认迭代器

    • 即以对象本身作为迭代器时,默认行为类似

      1
      2
      for i in range(X.shape[0]):
      pass
Routine Function Version Method Version
nditer(op[,flags,op_flags,...]) 高性能迭代器
nested_iters(op,axes[,flags,op_flags,...]) 在多组轴上嵌套创建nditer迭代器
ndenumerate(arr) (idx,val)迭代器
lib.Arrayterator(var[,buf_size]) 适合大数组的缓冲迭代
flat 返回np.flatiter迭代器
ndindex(*shape) 迭代shape对应数组的索引

np.nditer

1
2
3
4
5
6
7
8
9
10
11
class np.nditer(
op,
flags=None,
op_flags=None,
op_dtypes=None,
order='K'/'C'/'F'/'A',
casting='safe',
op_axes=None,
itershape=None,
buffersize=0
)
  • 迭代方式

    • 通过标准python接口迭代数组中各数组标量元素
    • 显式使用迭代器本身,访问其属性、方法
      • np.nditer[0]访问当前迭代的结果
      • np.iternext()获取下个迭代对象
  • 包含特殊属性、方法获取额外信息(可能需设置迭代标志)

    • 跟踪索引:获取索引np.nditer.indexnp.nditer.multi_index
    • 手动迭代np.nditer.iternext()得到下个 np.nditer对象
    • 获取操作数np.nditer.operands:迭代器关闭之后 将无法访问,需要在关闭前获得引用

https://www.numpy.org.cn/reference/arrays/nditer.html

参数

  • flags:迭代器标志

    • buffered:允许缓冲
      • 增大迭代器提供给循环内部的数据块
      • 减少开销、提升性能
    • c_index:track C顺序索引
    • f_index:track C顺序索引
    • multi_index:track 多维索引
    • common_dtype:将所有操作数转换为公共类型
      • 需设置copyingbuffered
    • copy_if_overlap:迭代器决定是否读操作数覆盖写 操作数,还是使用临时副本避免覆盖
    • delay_bufalloc:延迟缓冲区设置直至reset()函数 调用
      • 允许allocate操作数在其值被复制到缓冲区前初始化
    • external_loop:迭代一维数组而不是零维数组标量
      • 利于矢量化操作
      • 返回的循环块与迭代顺序相关
    • grow_inner:允许迭代数组大小大于缓冲区大小
      • bufferedexternal_loop均设置情况下
    • ranged
    • refs_ok:允许迭代引用类型,如object数组
    • reduce_ok:允许迭代广播后的readwrite操作数 (也即reduction操作数)
    • zerosize_ok:允许迭代大小为0
  • op_flags

    • readonly:操作数只能被读取
    • readwrite:操作数能被读写
    • writeonly:操作只能被写入
    • no_broadcast:禁止操作数被广播
    • contig:强制操作数数据连续
    • aligned:强制操作数数据对齐
    • nbo:强值操作数数据按原生字节序
    • copy:允许临时只读拷贝
    • updateifcopy:允许临时读写拷贝
    • allocate:允许数组分配若op中包含None
      • 迭代器为None分配空间,不会为非空操作数分配 空间,即使是广播后赋值空间不足
      • 操作数中opNone对应op_flags缺省为 ["allocate", "writeonly"]
    • no_subtype:阻止allocate操作数使用子类型
    • arraymask:表明对应操作数为mask数组
      • 用于从设置有writemasked标志的操作数中选择写回 部分
    • writemasked:只有arraymask操作数选择的元素被写回
    • overlap_assume_elementwise:标记操作数只能按照迭代 顺序获取
      • 允许在copy_if_overlap设置的场合,更保守的拷贝
  • op_dtypes:操作数需求的数据类型

    • 在循环内对单个值进行数据类型转换效率低
    • 迭代器以缓冲、复制整体进行类型转换提高效率
    • 需要同时设置"copy""buffered",否则因无法复制、 缓冲报错(类型不同时) (类型转换不修改原数组值,需要额外空间存储转换后值)
  • order:迭代顺序

    • C/F:C风格、Fortran风格
    • A:若所有数组均为Fortran风格则为Fortran风格,否则 为C风格
    • K:尽量贴近内存布局
    • allocate操作数的内存布局会兼容此参数设置
  • casting:指明在拷贝、缓冲时允许的数据类型转换规则 (包括读取、写回数组时可能的类型转换)

    • no:不允许任何类型转换
    • equiv:仅允许字节顺序改变
    • safe:仅允许可保证数据精度的类型转换
    • same_kind:只能允许safe或同类别类型转换
    • unsafe:允许所有类型转换
  • op_axes:设置迭代器维度到操作数维度的映射

    • 需为每个操作数设置维度映射
  • itershape:设置迭代器的shape

  • buffersize:设置缓冲区大小

    • buffered设置的情况下
    • 0表示默认大小

使用说明

  • 控制迭代顺序

    • 设置order参数
    • 缺省按照内存布局迭代
      • 提高效率
      • 适合不关心迭代顺序场合
    1
    2
    3
    4
    5
    6
    # 二者迭代顺序完全相同
    np.nditer(X, order="K")
    np.nditer(X.T)
    # 指定按C或Fortran顺序
    np.nditer(X, order="C")
    np.nditer(X, order="F")
  • 修改数组值

    • 设置writeonlyreadwrite
      • 生成可写的缓冲区数组,并在迭代完成后复制回原始 数组
      • 发出迭代结束信号,将缓冲区数据复制回原始数组
        • 支持with语句上下文管理
        • 迭代完成后手动.close()
    • 可设置allocate标志支持为空操作数分配空间

      • None参数op,其op_flags缺省设置为 ["allocate", "readwrite"]
      1
      2
      3
      with np.nditer(X, op_flags=["readwrite"]) as it:
      for x in it:
      x[...] = 0
  • 迭代一维数组而不是数组标量

    • 缺省返回最低维维度长的一维数组
    • 可以通过设置buffered扩大返回的数组长度
      • buffersize设置buffered大小,可用此参数决定 返回的数组长度
      • 返回数组长度完全由buffersize决定,与数组shape 无关
        1
        2
        3
        a = np.arange(30).reshape(5,6)
        for x in np.nditer(a, flags=["external_loop", "buffered"], buffersize=11):
        print(x, type(x))
  • 跟踪、获取索引

    1
    2
    3
    4
    it = np.nditer(a, flags=["multi_index"])
    while not it.finished:
    print(it[0], it.multi_index)
    it.iternext()
  • 以特定数据类型迭代

    • op_dtypes参数设置迭代返回的数据类型
    • 需同时设置"copy""buffered"字段
    1
    2
    for x in np.nditer(a, op_dtypes=["complex128"]):
    print(np.sqrt(x), end=" ")
  • 迭代器分配空间

    • allocate标志表示允许为操作数分配空间,即允许空 操作数
    • 若分配空间初值被使用,注意迭代前初始化 (如reduction迭代场合)
    1
    2
    3
    4
    5
    6
    7
    def square(a, ret=None):
    with np.nditer([a, ret],
    op_flags=[["readonly"], ["writeonly", "allocate"]]
    ) as it:
    for x, y in it:
    y[...] = x**2
    return ret
  • 外积(笛卡尔积)迭代

    • 设置op_axes参数指定各操作数op各维度位置、顺序

      • 迭代器负责将迭代器维度映射回各操作数维度
      • 类似于手动自由广播
      1
      2
      3
      4
      5
      6
      7
      8
      # 指定维度位置、顺序
      it = np.nditer([a,b,None], flags=["external_loop"],
      op_axes=[[0,-1,-1], [-1,0,1],None])
      # 迭代得到外积
      with it:
      for x,y,z in it:
      z[...] = x*y
      result = it.operands[2]
  • Reduction迭代

    • 触发条件:可写的操作数中元素数量小于迭代空间
      • "reduce_ok"需被设置
      • "readwrite"而不是"writeonly"被设置,即使循环 内部未读
      • 暗含"no_broadcast"必然不被设置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ret = np.array([0])
    with np.nditer([a,b], flags=["reduce_ok", "external_loop"],
    op_flags=[["readonly"], ["readwrite"]]) as it:
    for x,y in it:
    y[...] += x
    # 或者同样设置`allocate`标志,并且在迭代器内设置初始值
    np.nditer([a, None], flags=["reduce_ok", "external_loop"],
    op_flags=[["readonly"], ["readwrite", "allocate"]],
    op_axes=[None, [0,1,-1]])
    with it:
    # 设置初始值
    it.operands[1][...] = 0
    for x, y in it:
    y[...] += x
    result = it.operands[1]

nested_iters

  • nested_iters:按维度嵌套nditer

    • 迭代参数类似nditer
    1
    2
    3
    4
    5
    i, j = np.nested_iters(X, flags=["multi_index"])
    for x in i:
    print(i.multi_index)
    for y in j:
    print("", j.multi_index, y)

flat迭代器

  • X.flat:返回C-contiguous风格迭代器np.flatiter
    • 支持切片、高级索引
    • 实质上是数组的一维视图

np.ndenumerate

  • np.ndenumerate:多维索引迭代器,返回多维索引、值元组

    1
    2
    for multi_idx, val in np.ndenumerate(X):
    pass

np.broadcast

  • np.broadcast:返回(多个)数组广播结果元组的迭代器

    • 类似广播后zip,即先将数组广播,然后将广播后元素 组合成元组作为迭代器中元素
    1
    2
    for item in np.broadcast([[1,2],[3,4]], [5,6]):
    pass

Numpy Readme

常用参数说明

  • 函数书写说明同Python全局
  • 以下常用参数如不特殊注明,按照此解释

NDArray常用参数

基本数组参数

  • size=None(1)/int/Tuple[int]

  • shape=None/int/Tuple[int]

    • 含义:NDArray形状
      • int:1维时可直接用整数表示shape
      • tuple:高维至低维指定哥维度大小
        • -1:由整个size、其余维度推断该维度大小
    • 默认:None1
  • dtype=None/str/list/dict/np.dtype/...

    • 含义:指定输出数组数据类型
      • None:保证精度情况下自动选择数据类型
      • strlistdict:可转换为数据类型
      • np.dtypenp.dtype实例
    • 默认值:None,有内部操作,选择合适、不影响精度类型
  • order="K"/"C"/"F"/"A"

    • 含义:指定数组对象(输出)内存布局、迭代顺序
      • "C":C-contiguous风格,行优先
      • "F":Fortran-contiguous风格,列优先
      • "A":除非所有参数数组均为Fortran风格,否则 为C风格
      • "K":尽量贴近已有内存布局,原为”C”/“F”方式则 保持不变,否则选择较接近的风格
    • 默认值:”C”/“K”
  • casting="same_kind","no","equiv","safe","unsafe"

    • 含义:类型转换规则
      • no:不允许任何类型转换
      • equiv:仅允许字节顺序改变
      • safe:仅允许可保证数据精度的类型转换
      • same_kind:只能允许safe或同类别类型转换
      • unsafe:允许所有类型转换
    • numpy 1.10及以上版本,缺省为"same_kind"

结果参数

  • out=None/Tuple[Array]/Array

    • 含义:保存结果的变量
      • None:由函数自行分配空间
      • tuple:需要存储多个输出结果的变量元组
      • Array:仅需要保存单个输出结果的变量元组
    • 默认:None
    • 函数自行分配空间不会初始化,即若其中某些元素未被设置 值,则其值不可预测,如
      • whereTrue时,False对应元素
  • keepdims=False/True

    • 含义:是否维持原维数
      • True:保留本应被缩减的维度,并设置维度长为1
        • 保证结果和输入操作数广播兼容
      • False:不保持维数不变
    • 默认:False
  • subok=True/False

    • 含义:是否允许数组子类作为输出
      • True:允许
      • False:不允许
    • 默认:True

标记参数

  • where=True/False/Array[bool]

    • 含义:指示符合条件、需执行操作的bool map
      • True:广播为全True,所有元素
      • False:广播为全False,所有元素都不
      • Array[bool]True表示对应位置的元素满足条件 (需要和输入操作数广播兼容)
  • weekmask="1111100"/str/list

    • 含义:指示一周内工作日
      • 字符串
        • 10按顺序表示周一到周日为、非工作日
        • 空白符、驼峰分割周一至周日全称或缩写
      • 列表:01按顺序表示周一到周日为、非工作日
  • condition=Array[bool,int]

    • 含义:指示符合条件、需要执行操作的bool map
      • Array[bool]True表示对应位置的元素满足条件
      • Array[int]:根据是否为0转换为bool数组

风控规则

风控规则

  • 规则的类型
    • 条件判断:决策路径独立
    • 决策表:决策路径有交集、规律
    • 决策树:决策路径不规律、可能重复检查同一数据
  • 规则引擎:接受数据输入,解释业务规则,根据业务规则、使用 预定义语义做出业务决策

制定原则

  • 监管、公司政策类
    • 年龄准入
    • 行业准入
      • 有金融属性行业
      • 政策敏感娱乐行业
    • 地域准入
    • 场景准入
  • 风控层面
    • 黑名单类
    • 多头类:申请次数
    • 共债类:申请量
    • 反欺诈类
    • 评分拒绝类

规则发现

规则评分

  • 强弱规则

    • 强规则:可作为独立规则,直接指导决策
    • 弱规则:具有一定区分度,但不决定性
  • 弱规则可组合使用,通过评分方式衡量弱规则

    • 使用规则评分衡量规则影响力
    • 规则影响力则可以通过命中坏占比、odds变动衡量
    • 设置阈值,命中规则的评分之和超过阈值才触发报警

笛卡尔积法

  • 步骤
    • 获取变量:定义好坏,关联特征变量
    • 变量筛选:通过IV值等指标快速筛选变量
    • 指标统计:分组统计申请量、放款量、坏账量等指标
    • 透视呈现:分申请率、放款率、坏账率等指标制作交互,如列联表等
    • 规则提取:结合各维度选择满足要求的组别,提取规则逻辑
    • 规则评估:评估跨期稳定性
    • 策略上线

决策树法

  • 决策树法优势
    • 可根据划分依据自动对人群细分
  • 决策树法缺陷
    • 难以调整决策树划分结果
    • 划分结果可能缺乏业务意义
    • 可能出现过拟合现象

规则阈值设置

  • 阈值设置指标

    • Lift
    • 收益/风险比
  • 阈值设置依据

    • 对分类取值,根据 Lift 值、收益/风险比 确定是否作为规则
    • 对有序、数值取值,结合不同阈值点计算 Lift 值、收益/风险比,绘制曲线
      • 曲线平缓变化,则阈值切分收益变化稳定,阈值调整空间比较大
      • 曲线存在明显陡、缓变化,则阈值切分收益在拐点处收益较大,阈值调整空间有限

规则评价

  • 案件调查
    • 用信前报警调查
    • 逾期后调查
    • 根据不同目标,可以对不同的案件区分重点调查

线下 / 离线(标签已知)效果评估

  • 自身效果评估
    • 混淆矩阵
      • TPR/FPR
      • 准确率/误拒率
    • 提升度
      • 拒绝样本中坏样本Lift提升度
      • 通过样本中好样本Lift提升度
    • 通过率、拒绝率
    • 加权收益:好数量 好收益 + 坏数量 坏收益
  • 对比/增量效果评估:和其他数据源比较
    • 有效差异率:查得命中 / 其他通过且为坏样本
    • 无效差异率:查得命中 / 其他拒绝
  • 类似名单类数据评估

线上 / 在线(标签未知)效果评估

  • 规则报警次数、报警率

    • 规则(触发)报警次数:命中规则后账户被拒绝次数
      • 对强规则,即为规则命中次数
      • 对弱规则,小于规则命中次数
    • 规则报警率 = 规则报警次数 / 规则命中次数
    • 规则报警率低、趋势走低表明规则需修正
  • 规则调查次数、调查率

    • 规则调查次数 = 对案件调查分析时调查其次数 (短路调查)
    • 规则调查率 = 规则调查次数 / 规则报警次数
    • 调查率低则因考虑其他规则替代该规则,或or合并规则
    • 规则可以为调查提供提示,而过多不能给调查提供提示的 规则反而浪费时间
  • 规则命中次数、命中率

    • 规则命中次数 = 命中触发报警之后被认定为坏样本数
    • 规则命中率 = 规则命中次数 / 规则报警次数
  • 综合命中次数

    • 综合命中次数 = 规则命中次数 + 逾期调查认定坏样本数
    • 综合命中率 = 综合命中次数 / 规则报警次数
  • 在线效果效果是无法在体系内自评估的,必须引入外部信息,包括:人工审核、额外数据源、扩招回机制等

规则稳定性

通过率波动应对

  • 寻找通过率变动的时点
  • 计算各维度通过率波动程度PSI
    • 定位各策略节点主次影响
    • 分析主要影响策略节点规则、阈值
  • 指导决策

逾期率波动应对

  • 定位逾期率波动客群:存量客户、新增客户
    • MOD

旁路规则

Swap Set Analysis

  • 新、旧模型可用离线指标比较优劣,但最终要在业务中比较通过率、坏账率,二者正相关,swap set 则是反应模型的通过的变化
  • Swap Set Analysis 用于分析新、旧模型更替

    • 根据订单在新、旧模型的通过情况,可以分为三类
      • Swap-in Population:旧模型拒绝但新模型接受
      • Swap-out Population:旧模型接受但新模型拒绝
      • No Change:新、旧模型同时接受、拒绝
    • swap set 角度评价 “新模型优于旧模型”
      • Swap-in Population >= Swap-out Population 且坏账率不升
      • Swap-in Population = Swap-out Population 、坏账率不变,但用户响应率提升
  • 实务中,已上线的旧模型拒绝订单无法获取表现期,只能通过拒绝推断近似得到坏账率

    • 同时间窗 A/B-Test:切分流量让旧模型只打分不拒绝
    • 跨时间窗 A/B-Test:用旧模型在灰度期坏账率替代

扩召回

扩召回:独立召回之外,利用额外模型扩召回部分样本

  • 此处召回一般指通过 成熟 的规则、模型从全体中获取部分样本

    • 召回一般为历史沉淀、专家经验规则
    • 召回的理由充足,但泛化性较差
  • 扩召回和二次排序训练用的样本是相同的,但

    • 二次排序是在召回的样本基础上再次排序
      • 目标:(全局)排序能力
      • 评价标准:AUC、头部准召
    • 扩召回一般是独立于召回建立的模型
      • 目标:学习召回样本的规律,完善召回机制、补充召回样本
        • 因此,扩招回也可以用召回样本作为正样本
        • 扩召回也可用于在线验证新、旧规则的有效性
      • 评价标准:额外召回准确率(对召回样本的学习能力)
        • 事实上,若采用召回样本作为正样本,则 AUC 为 1 的扩召回是无价值的,只是复现了召回
      • 特征:可能包含一些专供于扩召回使用的特征
      • 扩召回的正样本可能还包括人工举报、隐案等

准入规则

  • 风控准入规则应为强拒绝规则
    • 不满足任何规则均会被拒绝
    • 规则无需经过复杂的规则衍生
    • 策略理念:验证借款人依法合规未被政策限制
    • 风控流程中首道防线
      • 准入策略已经趋同
      • 但对不同信贷场景仍应采取更适应业务的准入规则

基础认证模块

  • 风控基础认证模块:验证申请人真实性
    • 身份证信息验证
    • 人脸信息验证
    • 银行卡四要素验证
    • 运营商三要素验证

按数据来源分类

  • 个人信用类
    • 个人基本信息
      • 年龄准入
      • 地区准入
      • 行业准入
    • 经济能力信息
      • 月收入
      • 流水
    • 社交信息
  • 设备信息
    • 短信
    • APP安装信息
  • 外部数据源
    • 征信报告
    • 外部黑名单
  • 行为数据
    • 活动轨迹
    • 登录、注册时间
  • 评分卡规则

黑、白名单

白名单

  • 白名单:风险相对可知可控的客户构成的内部名单

    • 业务初期:通过白名单控制入口
      • 控制放量节奏
      • 降低风险
      • 通过宽松风控规则提高审批通过率
      • 通过贷前策略规则筛选白名单,协助调整贷前策略
    • 业务中期:部分客户走特殊的贷前审批流程,满足特殊审批 要求
  • 白名单筛选方式:有部分存量数据情况下

    • 联合建模:缺乏特定业务场景预测变量,与外部机构建模 补充预测变量
    • 内部数据探索:寻找与违约表现相关性较强的特征规则
      • 类似场景、产品
      • 纯粹凭借专家经验规则
    • 引入外部数据匹配

黑名单

  • 黑名单:还款能力、还款意愿不能满足正常客户标准

    • 通常多个好客户才能覆盖坏客户的本金损失
    • 通过黑名单客户全部拒绝,但是对于导流助贷机构,业务 核心是流量和客户质量,拒绝全部黑名单客群成本巨大, 可能会随机、结合评分放过部分
  • 黑名单建立

    • 建立黑名单参考维度
      • 还款表现
      • 渠道
      • 利率
      • 失信名单
    • 黑名单主体
      • 身份证
      • 手机号
      • 邮箱
      • 银行卡
      • IP

三方黑名单

  • 自建黑名单命中率不高(二次申请概率低),且需要长期 积累

  • 不同三方黑名单往往会有其侧重点

    • 团伙欺诈名单
    • 公安、司法名单
    • 被执行人名单
  • 三方黑名单效果也有好有坏,对效果较差、但通过率影响 不大黑名单也可以考虑保留

    • 黑名单一般是查得收费,外挂较多黑名单不会提升成本
    • 黑名单可视为容错机制,黑名单不一定能所有样本上 表现优秀,保留其可防止欺诈团伙等集中攻击
  • 同样值得注意的是,黑名单的质量需要考核

    • 非公信黑名单定义各家不同
    • 名单没有明确的退出机制
    • 黑名单按查得收费,有些黑名单会掺沙子
    • 有些名单提供商同时作为信贷放贷方,有动力将优质客户 截留,将其添加进名单

风险管理

互金风控

  • 互金相对传统金融风控有更多挑战

    • 模型迭代速度要求高
      • 互金市场波动剧烈
      • 长尾劣质客群更不稳定,容易导致样本波动
    • 数据源采集种类更多
      • 弱相关数据更多,处理难度更大
      • 政策合规要求,数据采集和使用更规范
  • 风控技术无关强弱,关键只在于“是否有效”

    • 时机选择
    • 制度安排及辅助
    • 背后所驱动的支撑逻辑
  • 风控领域,大数据等技术的应用场景和方向

    • 自动化,尽量减少人工干预,减少主观臆断
    • 实现“差异化”,客制化产品设计
      • 补全客户画像
      • 挖掘客户需求
    • 精准度,需要模型驱动
      • 交易成本评估
      • 差异化定价
      • 反欺诈
    • 创新型评估
      • 底层数据共享

风控策略

  • 风控策略本质是规则集的逻辑组合

    • 在贷前审批阶段减少风险事件发生
    • 挽回风险事件发生的造成的损失
    • 筛选用户:过滤高风险用户t保留低风险用户
    • 对客群分级实行个性化审批流程,提高审批效率
  • 广义看,策略也是一种模型

    • 模型通过算法挖掘数据学习规律、构造特征;而策略则是 结合具体业务场景,依赖人工经验对客群细分,如决策树、 笛卡尔积分群
    • 模型往往经过长时间稳定性验证,只有出现明显衰减时才会 触发迭代;策略上线、下线灵活,可以根据近期样本灵活 调整
    • 模型需要在策略中应用才能发挥效果

风险控制

  • 信用风险:侧重风险管理,在风险和收益之间寻求平衡,追求 利润最大化

    • 通过金融属性数据识别客户还款能力、意愿
  • 欺诈风险:侧重严防拒绝,属于欺诈必然拒绝

    • 跟进欺诈风险事件,快速响应
  • 反欺诈和信用顺序各有优劣,但是应该都做完之后得到综合授信 决策

    • 反欺诈在后:欺诈后需要人工核验,处于成本考虑后置
    • 信用在后:希望进入模型的数据更真实,否则会欺骗模型 造成错误决策

模型风险

  • 模型:应用统计、经济、金融或数学理论、技术和假设将输入 数据处理为定量估计的量化方法、系统或途径
  • 模型风险来源

    • 模型自身错误:模型设计、开发以及IT实施时发生的错误
      • 统计理论应用错误
      • 目标变量错误
      • 样本选择错误
      • 变量挑选、衍生错误
      • 算法错误
      • 在信息系统中执行与开发不一致
    • 模型被不恰当的使用
      • 模型套用
      • 市场环境、消费者行为习惯发生重大变化
  • 美国监管部门围绕“有效挑战”指导原则,建立模型风险监管体系

    • 动力:挑战者必须在组织上相对独立于模型开发者,有正向 激励挑战
    • 胜任力:挑战者具备相关专业知识和技能
    • 影响力:挑战者必须具备权威、组织内地位,来自更管理层 的承诺和支持,保障被挑战方对其意见有足够重视

风险监管体系框架

  • 第一防线
    • 模型开发者:开发、上线、使用、监控和维护模型,配合 模型验证部门的独立验证工作
    • 管理维护者
    • 使用者
  • 第二防线
    • 模型验证部门:独立验证模型
    • 模型风险监管部门:草拟、执行模型风险管理政策
  • 第三防线
    • 内部审计:评估模型风险管理是否完整、严谨、有效
  • 外部防线:政府监管
    • 美联储
    • 美国货币监理署

风险监管具体要求

Model Inventory模型清单

  • 模型状态
  • 模型目的、设计的目的产品、预期和实际使用的场景、使用限制
  • 输入数据、组件的类型和来源
  • 输出及其预期用途
  • 模型运行状态、更新时间、政策例外
  • 开发、验证负责人
  • 已完成和计划当中的验证目的
  • 有效期

Model Development模型开发

  • 明确模型目的
    • 设计、理论、逻辑的研究支持
    • 模型组件、算法的优缺点
    • 与其他理论方法的比较
  • 评估数据质量
    • 证明数据、信息适合模型
    • 替代数据需证明、记录
    • 对必要的数据跟踪分析,尤其是外部数据、新客群、 新产品
  • 测试确保符合预期
    • 准确性
    • 鲁棒性
    • 稳定性

Model Implementatioin and Model Use

  • 模型实施的需要有严谨的校验规范,保证上线模型与开发模型 一致
    • 结果(包括中间结果)一致
    • 底层数据一致
    • 计算逻辑一致
  • 模型使用可以进一步评估模型性能
    • 模型使用者反馈模型使用情况、业务契合度
    • 业务经理评估模型背后的方法、假设
    • 其他利益不相关部门建议
  • 模型的业务决策报表应清晰易懂
    • 决策者和建模者知识背景可能不同
    • 需要包含足够的输入、输出示例,充分展示模型各个维度

Model Validation

  • 模型验证须由专业、独立的模型验证团队执行
    • 有动力
    • 有胜任力
    • 有影响力
  • 验证范围须包括模型所有组件
    • 输入
    • 处理
    • 报告
  • 验证的严格性、复杂性应与以下相适应
    • 模型使用量
    • 模型复杂性
    • 模型重要性
    • 业务规模和复杂性
模型验证分类
  • Initial Validation初始验证:首次使用前的验证

    • 根据模型的缺陷选择是否接受
    • 由于其他原因无法验证,应该记录在案,并通过其他补偿性 控制减轻模型不确定性
  • On-going Validation持续验证:模型投入使用后持续进行的 验证

    • 跟踪已知问题并识别任何新的问题
    • 确保市场、产品、风险敞口、活动、客户、业务实践不会 造成新的模型问题
  • Model Review定期复查

    • 确定模型是否正常工作且现有的验证活动是否足够
验证框架要素
  • 概念健全性评估:模型设计、构造的质量

    • 审查相关文件与实践证据,确保模型设计、建造中使用的 方法、判断、变量选择有充分信息、经过仔细考虑,且与 已发表的研究和成功行业实践一致
  • 结果分析,比较模型输出与实际结果,分析模型性能

    • 各种量化、非量化的测试分析技术都有弱点,应根据模型 选择适当、一系列结果分析
    • 量化结果有助于评估判断专家判断的质量、新旧模型性能 差距
    • 结果分析应持续进行
    • 除用保留样本(训练样本时间段内)分析模型性能外,还 需要使用训练样本时间段外样本进行back-testing
  • 敏感性分析,检查模型的稳定性、鲁棒性

Model Monitoring

  • 模型监控频率应与模型性质、新数据或建模方法的可用性,涉及 的风险程度相匹配

  • 开发阶段发现的模型局限应在持续监控中定期评估

  • Processing Verification过程检验,检查所有模型组件是否 按设计运行

  • Benchmarking基准检验,与外部数据、模型进行比较

贷后管理

  • 入催:当前逾期

    • 忘记还款日逾期:轻微提醒即还款
    • 习惯性逾期:轻微提醒、人工催收提醒即还款
    • 资金困难,还款能力低:普遍回款率低
      • 多头借贷高负债:还款意愿低,需要较强催收策略
      • 暂时失去收入能力:还款意愿不差,但出催时间较久
    • 有还款能力但不还:需较强催收策略提高还款意愿
    • 欺诈:首逾,贷后没有解决办法
  • 出催:结清逾期账单

AB-Test划分客户

  • 步骤
    • 为各类客户设置有针对性的特别催收策略
    • 结合模型、规则初步初步设置筛选条件
      • 筛选出该类型客户
      • 将该类型客户分群A、B组
    • 在A组应用一般催收策略、在B组应用针对性策略,比较策略 出催效果
      • 针对性策略确定情况下,评估客户筛选条件
      • 客户筛选条件给定的条件下,评估针对性策略

M1客户

  • 对大部分公司的客群而言,M1阶段出催概率最大

    • 此阶段较为重要,可设置多个模型重点学习不同客群规律
    • 对不同客群施行不同催收策略,提高出催成功率
  • 缓催响应人群:出于遗忘造成的逾期

    • 在较短的缓催期内,简单的催收动作、或不催收即出催, 降低人力成本
      • 不催
      • 短信提醒
      • 邮件提醒
      • 机器人催收
    • 对缓冲人群内部,可以通过不断AB-Test细分缓催人群
      • 在不同时间段设置不同缓催方式
      • 为不同人群设置不同缓催方式
  • 非缓催人群

    • 按出催难易程度,区分为普通案件、专家案件(难催用户)
      • 难催客户入催早期还款概率远高于后期,在入催初期 即交由经验丰富
    • 对还款能力、还款意愿分析,应用不同话术和催收策略
      • 还款能力、还款意愿分析主要是根据特征变量设置
      • 对还款能力差而还款意愿强的客户,可通过延期等方式 提升用户体验
      • 对还款意愿弱的客户,通过催收动作提高还款意愿
    • 对催收敏感程度分析
      • 对催收动作敏感的人群,即催收动作越强,还款概率 越高,可以加强催收频率

rc_collection_m1

M2+客户

  • M2+客户催出概率较低
    • 若无特殊原因影响,发生过M2+用户需要重点关注
      • 委外处理会损失资金
      • 通过模型预测更易出催的客户,精细化人力管理
    • 为精细化催收可以构建多个阶段模型
      • 样本充足的情况下可以分别构建M2、M3模型
      • 样本不够时,则可以构建M2+模型,不断积累决策、 建模样本
    • 分析出催难易程度、催出敏感程度不同的客群,施行不同 催收策略

rc_collection_m2+

风控中数据分析

数据质量

特征数据挖掘

  • 确定分析目标
  • 假设分析
    • 对问题提出可能的假设
    • 评估假设的分析过程
  • 特征获取、关联分析
    • 找出信息片段之间直接、间接联系
    • 已知信息片段,寻找直接、间接联系的信息片段
  • 假设验证、模式归纳
    • 根据分析结论评估假设
    • 归纳规律特点

统计类特征构造

  • RFM 特征框架思想是构造统计类特征的基础

    • Recency:最近一次间隔
    • Frequency:最近一段时间次数
    • Monetary:最近一段时间金额
  • 结合业务统计、分析数据

    • 了解数据采集逻辑
    • 定义观察期有效性
      • 不同用户的数据厚薄程度(实际观察期长短)可能不同
  • 统计类特征构造方式

    • 数量统计类特征
    • 占比统计类特征
      • 去除量纲影响
      • 衡量用户行为偏好:时间偏好、类别偏好
    • 趋势统计类特征
      • 一般通过斜率衡量变化趋势
    • 稳定性衍生特征
      • 变异系数

特征变量评估

  • compliant 合规性
    • 法律允许
    • 来源可靠
  • stable 稳定性
    • 数据采集稳定性
    • 特征变量稳定性
      • 数据源采集稳定是变量稳定性的基本前提
      • 变量是模型的基础,数据不稳定必然导致模型稳定性差
  • available 可得性
    • 数据未来是否可以继续采集、计算
    • 涉及产品设计流程、用户授权协议、合规需求、模型应用环节
      • 业务流程更改导致埋点数据弃用、数据采集后移
      • RFM特征时间窗口支持
  • interpretable 可解释性
    • 数据是否具有明确、清晰的业务含义,便于理解
  • logical 逻辑性
    • 不容易绕过,逻辑上应该被采用

外部数据业务指标

  • 外部数据:三方平台根据自身业务场景所积累的数据,经脱敏 加工后对外输出,主要包括上述的信贷类数据、消费类数据
  • 性价比
    • 结合技术、业务效果、数据价格,综合计算性价比
    • 计价方式
  • 覆盖范围
    • 覆盖率
    • 查得率:能匹配用户数/总用户数

名单类数据

  • 自身效果评估
    • 混淆矩阵
      • TPRFPR
      • 准确率/误拒率
    • 提升度
      • 拒绝样本中坏样本提升度
      • 通过样本中好样本提升度
    • 通过率、拒绝率
  • 对比/增量效果评估:和其他数据源比较
    • 有效差异率:查得命中 / 其他通过且为坏样本
    • 无效差异率:查得命中 / 其他拒绝
  • 线下带标签场景的评估

数据描述

  • Exploratory Data Distribution 数据分布
    • 样本与总体分布应大致相同,则样本分布应保持稳定,因此 各特征统计值更应保持稳定
    • 按照自然月、特征维度,分析特征统计值变动
  • Missing Rate 缺失率
    • 缺失成因:随机缺失、系统性缺失
    • 缺失变动:特征缺失率持续升高,则预期未来数据采集率 下降
  • Unique Value
    • 若某固定值占比过高,则变量区别度往往很低
  • 特殊值检查
    • 缺失值如何表示
    • 零值的业务含义

稳定性

  • PSI:测试集、训练集间
    • 比较训练集、测试集变量的波动性
    • 无法反应细节原因,还需要 EDD 上分析

信息量

  • Coefficient of Variation 变异系数
    • 过小则区分度差
    • 过大可能不稳定
  • IV
    • 评估变量预测能力
    • IV值过高时注意信息泄露问题
  • RF/XGB 特征重要性
    • 适合快速筛选特征
    • 此重要性只有全局可解释性,无法对单个案例做出解释

信息重复

  • Variable Cluster 变量聚类:评估聚类意义上变量的“接近”程度
    • 层次聚类
  • Linear Correlation 线性相关性:评估变量间的线性相关性
    • Pearson Correlation Coefficient
    • 变量若通过WOE方式参与建模,则可以使用WOE值计算相关系数
  • Multicollinearity 多重共线性
    • VIF
  • 变量显著性
    • p-value
  • 建模(线性)中应该避免是参与建模的变量之间过强的线性相关,所以应该检查的是参与建模变量之间的线性相关
  • 变量衍生值、原始值相关性不一致是衍生非线性导致,不应减弱使用衍生值变量检查的合理性

样本数据质量

  • 代表性(狭义)
    • 数理统计最基本逻辑链是通过样本推断总体,因此样本对总体代表性决定推断上限
    • 根据标目标客群、好坏比例采样、赋权
      • 简单随机抽样,保持内部真实客群、好坏比例
      • 客群分层抽样,适应不同客群
      • 好坏不等比抽样,建模之后再按权重还原,充分捕捉 坏样本特征
  • 稳定性
    • 可用各 Vintage 内坏占比、lift 值、odds 等指标 PSI 衡量
    • 样本稳定性决定推断结果稳定性
    • 样本客群应该足够稳定,受节假日、周期影响小
  • 连续性
    • 样本时间连续便于建模中划分训练集、测试集(避免数据穿越)

特征分类

  • 还款能力

    • 收入:自填、三方
    • 负债:内部负债、外部负债、多头借贷
    • 学历:自填、三方
  • 还款意愿

    • 申贷行为:申贷记录、贷前贷后申贷行为变化
    • 履约行为:还款记录、逾期记录
    • 催记行为:催收记录

贷前数据

  • 主动数据/表填信息:客户主动提供
  • 被动数据:主动采集

资质、标签类数据

  • 客观数据:无第三方欺诈情况下可信

    • 性别
    • 年龄
    • 身份证号
    • 手机号
    • 手机号在多少个平台用户的通讯录中有存储
    • 手机号归属地
    • 户籍地址
    • 户籍地址是否来自非城市:除一线城市外,用身份证 地址是否包含“村”判断
    • 银行卡号
    • 银行卡发卡行
    • 签发机关
  • 主观数据:不可信,可对这部分数据做交叉验证,检查是否前后矛盾

    • 紧急联系人号码
    • 紧急联系人消息
    • 紧急联系人是否为平台用户
    • 学历
    • 工作
    • 月收入
    • 公司
    • 负债
    • 地址
    • 紧急联系人手机号归属地是否和账户手机号归属地一致
    • 手机联系人手机号归属地是否和申请人户籍地一致

信贷类数据

  • 人行征信报告
  • 三方征信数据:通过各机构贷前审批、贷后管理等记录
    • 收入数据
    • 负债数据
      • 多头负债
      • 共债
    • 多头借贷数据
    • 黑名单
    • 信用评分
    • 原始数据(极少)

生活行为类数据

  • 消费行为:资金用途,是否专款专用、不良用途
    • 信用卡、借记卡账单和流水
    • 电商消费记录数据
  • 收入能力:收入直接影响还款能力
    • 流动资产:工资、公积金
    • 固定资产
  • 出行行为数据
  • 短信通道:识别内容,提取放款、逾期、催收等特征
  • 支付通道:通过支付代扣记录,提取用户收入、支出等 现金流
  • 手机输入法:识别内容,提取全方位信息

设备行为类数据/埋点数据

  • 埋点数据量庞大而杂乱

    • 需要结合业务逻辑分析,从账户角度思考,挖掘有用的特征
  • 行为类数据为弱金融属性数据,多用于交叉验证

    • GPS与手机号归属地一致
    • IP与GPS所在城市是否一致
    • IP与手机号归属地是否一致
    • 工作时间的LBS是否与公司地址一致
    • 非工作时间的LBS是否与家庭地址一致

设备特征

  • 设备恒定特征

    • 是否root
    • 是否hook
    • 是否为实体手机
    • 是否为一键新机
    • 是否为二手手机:欺诈更倾向于使用二手手机
      • 系统文件
      • 是否恢复出厂设置
    • 品牌
    • 价格
    • 操作系统
    • 设备迁移方向
  • 设备易变特征

    • 传感器参数:在互联网反欺诈中,常用于侦测非实体手机, 而金融场景中更多是真机
      • 角度传感器
      • 压力传感器
    • 电压、电量:手机电压、电量呈上升趋势,表示账户资金 需求更急迫

行为数据

  • 活动轨迹:取决于埋点的精细程度

    • 夜间申请
    • User-agent
    • 点击次数
      • 申请前次数低于大盘:账户对产品了解,意图明显
      • 授信后点击次数过高:账户对产品有犹豫
    • 激活+粘贴
      • 正常申请流程中较少存在中途退出申请的必要
      • 而中介更可以多次切换应用,复制粘贴
    • 截图
      • 中介更有可能截图制作教程、展示流程等
    • 时间间隔:更适合作为欺诈模型参数
      • 注册到申请
      • 登录到申请
      • 各申请步骤
      • 申请到完成
      • 授信到用信
      • 上次申请与本次申请时间间隔
    • 切换设备登陆
    • 身份证提交次数
  • 内容偏好

环境信息

  • LBS信息:可以提高观察粒度保证容错率
    • GPS所在城市
    • LBS是否在非城市
    • 同LBS是否多个申请
    • LBS周围是否多个申请
  • 网络信息
    • 网络类型:Wifi/4g/3g
    • 相同Wifi MAC的申请人数
    • Wifi名称是否命中风险关键词
  • IP地址
    • 相同IP的申请人数
    • IP所在城市
    • IP是否来自数据中心

贷中、贷后指标

贷中数据维度

  • 内部信贷行为数据
    • 申贷行为
      • 历史申贷记录
      • 贷前、贷后申贷行为
    • 还款
      • 分期期数
      • 首期逾期天数
      • 当前月正常拆分扣款总次数
      • 当前3个月内还款最大金额
      • 历史最大逾期天数
      • 首次成功还款时间距离当前时间
    • 催收
      • 催收记录
    • 履约历史
      • 提前还款:资金充足、重视信用记录
      • 习惯性逾期:手头紧张、不够重视信用记录
  • 活跃行为
    • 失联
    • 用户登录
  • 账户特征
    • 授信额度使用率
    • 代偿余额

时间窗口

obeservation_and_performance

  • Observation Point观察点:账户申请的时间段,该时间段内 客户可能用于建模

    • 从风控应用角度,观察点即对账户授信审核的时点,此时 能够获得所有信息只能在观察点前的观察期
  • Observation Window观察期:构造特征的事件窗口

    • 观察期选择依赖用户数据的厚薄程度,数据越厚,可提取 信息越全面、可靠
  • Performance Window表现期:定义好坏标签的时间窗口

    • 风险需通过一定时间窗口才能表现,即信贷风险具有滞后性
    • 表现期越长
      • 信用风险暴露越彻底
      • 也意味着观察期离当前越远,用以提取样本特征的历史 数据越陈旧,建模样本和未来样本差异越大
    • 应当选择合适的表现期以覆盖足够多的坏客户

说明

  • 表现期的选择

    • 对信用卡场景的稳定客群、长期限产品,可用滚动率、账龄 分析确定表现期、好坏
    • 但对小额信贷产品,实务中一般结合产品期限,沿用常用 指标,如:表现期设置为产品期限一半
  • 建模样本窗口选择

    • 特征覆盖度:保证数据厚薄程度相同
    • 客群没有大幅变动
      • 特征
      • 标签:逾期、出催等

Month on Book/MOB:账龄

  • 统一观察点账龄:统计信息为观察点实时信息,但会导致 订单表现期不同

    • MOB0:放款日至当月月底
    • MOB1:放款后第二个完整月份
    • MOB2:放款后第三个完整月份

    mob_at_a_specified_time_point

  • 统一表现期账龄:保证订单表现期相同

    • MOB1:放款日开始30天
    • MOB2:放款日开始30天至60天

    mob_spanning_specified_time_range

逾期、不良

  • Payment Delinquency:逾期
    • First Payment Delinquency/FPDx:首期逾期(天数)
    • Current Payment Delinquency/CPDx:当前逾期
    • Historical Payment Delinquency/HPDx:历史逾期
  • Day Past Due/DPDx:逾期天数

逾期期数

  • C/M0:当前未逾期
  • M1:DPD1 - DPD30
  • M6:逾期151-180日
  • M7/Bad Debts:逾期180日以上
  • 对信用卡场景而言,M0为账单日到还款日之前,而对信贷 场景,M0没有对应时间段

逾期率

  • 两种计算口径
    • 逾期率 = 逾期订单数 / 总订单数
    • 逾期率 = 逾期订单金额 / 总订单金额
  • 逾期口径调整
    • 逾期统计时间窗口:历史、当年
    • 逾期后还上
    • 担保、代偿
    • 多期逾期是否计算剩余未还
  • 总数调整
    • 统计时间窗口:历史、当年
    • 已发放还是余额
  • 客观反映风控、资产质量的观察期选择
    • Coincidental Delinquency:固定观察时点,以截至 观察时点前逾期金额、余额计算
    • Lagged Deliquency:按照账龄分析方法,将各月份 逾期金额、金额计算真实逾期率

不良率

  • 不良率 = (次级+可疑+损失)/ 总
    • 次级、可疑、损失在银行内有明确规定,但不完全按照逾期 天数划分
    • 同体系内内比较不良可行,但和不同体系间没有可比较性

Expected Loss

  • Expected Loss预期损失

  • Probabilty of Default违约概率

    • 资产质量越差,违约概率越高
    • 可以把对应逾期状态至呆账状态,各状态间迁移率链式相乘 得到违约概率
  • Loss Given Default违约损失率:账户违约后,能够回收的 本金比例

  • Bad Debt Reserve坏账准备金/拨备

    • 把未偿清金额按照一定准备金比例储备,用于覆盖预期的 未来呆账损失
    • 应该等于预期损失

资产质量分析

  • 资产质量:根据逾期天数将资产划分为不同等级
账龄分析 滚动率分析 迁移率分析
观察点 多个观察点 单个观察点 多个观察点
观察窗口 观察点后各期 观察点前后一段期限 观察点后各期
工具 Vintage曲线 迁移矩阵 迁移率
分析要素 各观察点、各期逾期情况 各逾期状态间迁移情况 各期、各逾期状态下沉情况

Vintage Analysis

账龄分析:对不同时点资产分别跟踪,按照账龄长短对齐后对比, 分析不同时点贷款贷后质量

vintage_analysis_sample

  • 用途
    • 确定账户成熟期/稳定期
      • 以逾期率趋于稳定所需时间作为判断客户好、坏区分 所需时间
      • 辅助定义表现期/成熟期
    • 确定资产质量
      • 以曲线平缓处对应逾期率衡量资产质量
    • 分析变化规律:分析逾期率变化情况
      • 前几期逾期率上升快:短期风险未能控制,欺诈风险高
      • 曲线一直上升:信用风险识别能差
    • 分析影响因素(资产质量),指导风控策略调整
      • 风控策略收紧放松
      • 客群变化
      • 市场环境
      • 政策法规等
  • vintage起源于葡萄酒品质分析,vintage即指代葡萄酒的 批次标签,每年对各批次抽样、记录即得到vintage曲线

Roll Rate Analysis

滚动率分析:利用观察期、表现期违约程度的状态转移矩阵分析 违约程度变化情况

roll_rate_analysis_transition_matrix

  • 滚动率分析步骤

    • 准备
      • 确定数据源:一般为还款计划表
      • 定义逾期状态
    • 统计观察期:以观察点为截至时间,统计客户在观察期最长 逾期期数,并据此对用户分级C、M1、M2等
    • 统计表现期:以观察点起始,统计客户在表现期内最长逾期 数,并据此对用户分级C、M1、M2等
    • 根据以上数据绘制列联表、计算频率
    • 为排除观察点选择影响,选择多个观察点重复以上
  • 滚动率分析用途

    • 分析客户好坏程度、变化情况,确定客户好坏界限

Flow Rate Analysis

迁移率分析:利用违约程度变化计算迁移率,分析违约程度变化规律

flow_rate_analysis

  • Flow Rate迁移率:资产等级下滑的比例

    • 迁移率 = 前等级逾期金额到下一等级逾期金额的转化率
      • M0-M1 = 当月进入M1余额 / 上月末M0余额
  • 核心假设

    • 处于某一逾期状态的账户,一个月之后,必然从良为非逾期 账户,或恶化为下一级逾期账户
    • 状态不会有跃迁,所以一期仅有一组下沉迁移率
  • 迁移率分析步骤

    • 准备
      • 确定数据源:一般为还款计划表
      • 定义逾期状态
    • 计算各月份、各逾期状态之间迁移率
    • 计算不同月份平均迁移率
    • 根据平均迁移率和不良资产回收率,计算净坏账损失率
  • 作用

    • 展示账户整个生命周的变化轨迹
      • 预测未来坏账损失:各级迁移率乘积得到最终损失率
      • 计算坏账计提标准、资产拨备
    • 观察迁移率发展轨迹
      • 分析贷款催收率、催收力度
      • 监控坏账发展倾向和催收效果
    • 确定好坏客户标准
      • 即选择迁移率较高的状态作为划分点

CMD说明

CMD说明

CMD字体要求

  • CMD/Powershell对字体要求比较严格

    • 等宽字体
    • 不能为斜体字体
    • 不能有A或C负空间
    • 若是TrueType字体,则必须是FF_MODERN
    • 若不是TrueType字体,则必须是OEM_CHARSET
  • 对于CJK(亚洲字体),还有额外附加条件

    • 若不是TrueType字体,字体名必须是Terminal
    • 若是TrueType字体,必须使用亚洲语言字符集
    • 在字体元信息里声明支持CP936

特征选择

Feature Selection

特征选择:从特征集合中选择最具统计意义的特征子集

  • 特征分类

    • relevant feature:相关特征,对当前学习任务有用的属性、特征
      • 特征选择最重要的是确保不丢失重要特征
    • irrelevant feature:无关特征,对当前学习任务无用的属性、特征
    • redundant feature:冗余特征,包含的信息可以由其他特征中推演出来
      • 冗余特征通常不起作用,剔除可以减轻模型训练负担
      • 若冗余特征恰好对应完成学习任务所需要的中间概念,则是有益的,可以降低学习任务的难度
  • 特征选择会降低模型预测能力,因为被剔除特征中可能包含有效信息

    • 保留尽可能多特征,模型性能会提升,模型更复杂、计算复杂度同样提升
    • 剔除尽可能多特征,模型性能会下降,模型更简单、降低计算复杂度
  • 特征选择原因

    • 维数灾难问题:仅需要选择一部分特征构建模型,可以减轻 维数灾难问题,从此意义上特征选择和降维技术有相似动机
    • 剔除无关特征可以降低学习任务难度,简化模型、降低计算复杂度
  • 特征选择方法可以分解为

    • 特征子集搜索
    • 特征子集评价:能判断划分之间差异的机制都能作为特征子集的准则

特征选择过程

feature_selection_procedure

  • generation procedure:产生过程,搜索特征子集
  • evaluation function:评价函数,评价特征子集优劣
  • stopping criterion:停止准则,与评价函数相关的阈值,评价函数达到与阈值后可以停止搜索
  • validation procedure:验证过程,在验证数据集上验证选择特征子集的有效性

特征子集搜索

  • 遍历:从初始特征集合选择包含所有重要信息的特征子集

    • 适合没有先验(问题相关领域)知识的情况
    • 特征数量稍多会出现组合爆炸
  • 迭代:产生候选子集、评价优劣,基于评价结果产生下个候选子集

    • 不断迭代,直至无法找到更好的后续子集
    • 需要评价得子集数量较少
    • 可能无法找到最优子集

迭代搜索

  • 给定特征 $A={A_1, A_2, \cdots, A_d}$,将每个特征视为候选子集(每个子集只有一个元素),对 $d$ 个候选子集进行评价

  • 在上轮选定子集中加入特征,选择包含两个特征的最优候选子集

  • 假定在 $k+1$ 轮时,最优特征子集不如上轮最优的特征子集,则停止生成候选子集,将上轮选定特征子集作为特征选择结果

  • Forward Feature Elimination:前向特征选择,逐渐增加相关特征
  • Backward Feature Elimination:后向特征选择,从完整特征集合开始,每次尝试去掉无关特征,逐渐剔除特征
  • Bidirectional Feature Elimination:双向特征选择,结合前向、后向搜索
    • 每轮逐渐增加选定的相关特征,特征在后续迭代中确定不会被去除,同时减少无关特征

特征子集评价

特征子集评价:能判断划分之间差异的机制都能作为特征子集的选择准则

  • 方差

    • 方差越大,特征对预测值区分能力越强
  • 相关系数

    • Pearson 积矩相关系数
    • Kendell 秩相关系数
    • Spearman 秩相关系数
    • 卡方统计量
  • 距离指标

  • 划分增益

    • Gini 指数
    • IG 信息增益/互信息
    • 信息增益比
  • 排序指标

    • AUC

特征问题定位

  • 模型出现过拟合问题时,可能是特征工程步骤中出现信息泄露(数据穿越、标签入特征),一般通过单变量特征评价指标定位有问题的特征
  • 数据泄露涉及的特征的定位(经验)
    • 线性模型
      • 单变量 AUC 值:超过 0.8 则高度可疑
    • 非线性模型(树)
      • 基于信息增益的特征重要性

Filter

过滤式:对数据集进行的特征选择过程与后续学习器无关,即设计统计量过滤特征,不考虑后续学习器问题

  • 通过分析特征子集内部特点衡量特征优劣,描述自变量、目标变量的关联

  • 特点

    • 时间效率高
    • 对过拟合问题较稳健
    • 倾向于选择单个冗余特征,没有考虑特征之间相关性

单特征过滤

单特征过滤:直接选择合适特征子集评价标准处理各特征,选择满足要求特征

Relief: Relavant Features

Relief 方法:设置相关统计量度量特征重要性

  • 特征子集对应统计量中每个分量对应一个初始特征,特征子集重要性由子集中每个特征对应的相关统计量分量之和决定

  • 特征选择方法

    • 指定阈值 $k$:选择比 $k$ 大的相关统计量分量对应特征
    • 指定特征个数 $m$:选择相关统计量分量最大的 $m$ 个特征
  • 只适合二分类问题,扩展变体 Relief-F 可以处理多分类问题

Wrapper

包裹式:把最终要使用的学习器性能作为特征子集评价标准,为给定学习器选择最有利其性能、特化的特征子集

  • 优点
    • 直接针对特定学习器进行优化
    • 考虑了特征之间的关联性,通常训练效果较过滤式好
  • 缺点
    • 特征选择过程中需要多次训练学习器,计算效率较低
    • 观测数据较少时容易过拟合

Las Vegas Wrapper

LVW:在 Las Vegas Method 框架下使用随机策略进行子集搜索,以最终分类器误差作为特征子集评价标准

  • 包含停止条件控制参数T,避免每次子集评价训练特征子集开销过大
  • 若初始特征数量很多、T设置较大、每轮训练时间较长,算法执行很长时间都不会停止
    • LVM 可能无法得到解(拉斯维加斯算法本身性质)

递归特征消除法

递归特征消除法:使用基模型进行多轮训练,每轮训练消除若干权值系数的特征,再基于特征集进行下一轮训练

Stepwise变量选择

  • 前向变量选择
  • 后向变量选择
  • 前向-后向变量选择
  • 最优子集选择

Embedded

嵌入式:将特征选择、学习器训练过程融合,在同一优化过程中同时完成,即学习器训练过程中自动进行特征选择

  • 优点:兼具筛选器、封装器的优点
  • 缺点:需要明确好的选择

正则化约束

$L_1$、$L_2$ 范数:主要用于线性回归、逻辑回归、SVM 等算法

  • Ridge:$L_2$ 范数
  • Lasso:$L_1$ 范数
    • 除降低过拟合风险,还容易获得稀疏解
    • 参数 $\lambda$ 越大,稀疏性越大,被选择特征越少
  • SVM、逻辑回归
    • 超参参数范数权重越大,稀疏性越大,被选择特征越少

决策树

决策树思想:决策树自上而下选择分裂特征就是特征选择

  • 所有树结点划分属性根据先后顺序组成的集合就是选择出来的特征子集
  • 参见ml_models/unlinear_models/decision_tree

神经网络

神经网络:训练时同时处理贡献度问题,不重要特征权重被剔除

特征提取

Feature Extraction/Feature Construction

特征提取/构建:把原始数据中转换为具有物理、统计学意义特征,构建新的人工特征

  • 主观要求高

    • 对问题实际意义、相关领域有研究:思考问题形式、数据结构
    • 对数据敏感:需要观察原始数据
    • 分析能力强
  • 目的:自动构建新特征

    • 信号表示:抽取后特征尽可能丢失较少信息
    • 信号分类:抽取后特征尽可能提高分类准确率
  • 方法

    • 组合属性:混合属性创建新特征
    • 切分属性:分解、切分原有特征创建新特征,如将时间戳分割为日期、上下午
  • 特征工程和复杂模型在某些方便不冲突

    • 虽然很多复炸模型能够学习复杂规律,类似自行构造特征
    • 但是考虑到计算资源、特征数量、学习效率,人工经验构造衍生特征是必要且有益的
  • 特征选择:表示出每个特征对于模型构建的重要性
  • 特征提取:有时能发现更有意义的特征属性
  • 有时从额外划分特征构建,其相较于特征提取,需要人为的手工构建特征,偏经验、规则

通用特征提取

数值型

  • 幅度调整:提高 SGD 收敛速度
    • 归一化
    • 标准化
  • 数据变换
    • 数据标准化(参见 data_preprocessing
    • 二阶、三阶变换
  • 数据离散化:连续值分段
    • 等距切分:各类分布不均
    • 分位数切分:各类分布均匀,但异质性不均
  • 平方、开根:增加非线性化

分类型

  • one-hot 编码:赋予各特征等权
  • hash 技巧:针对文本类别数据,统计文本词表、倾向
  • 多分类转二分类:输入变量类别合并,超类
    • twoing 策略:使两个超类差异足够大的合并点(分割点)
    • ordering 策略:对有序类型,只有两个连续基类才能合并

统计型

  • 统计特征
    • 跨记录聚集:特征取值在样本全体中的情况
      • 分位线
      • 比例
      • 次序
      • count(出现次数)
      • 均值
      • 方查
    • 记录内聚合:属于同记录的同类特征统计指标
      • 均值
      • 方查
  • 时序特征
    • 视为连续型:持续时间、间隔时间
    • 视为离散值:一年中某些时间段

组合特征

  • 特征拼接:GBDT 生成特征组合路径
  • 特征冲突验证:匹配、等于、不等于
  • 关联特征:图传播
    • 依赖于内部、外部关联图数据,如:
      • 账户作为节点:已能确认正、负例样本
      • 交易、社会关系作为边
      • 交易频次、金额作为权重
    • 图传播可以考虑多次传播,即考虑前一次的传播结果中置信度较高者作为下次的起始节点
  • 特征交叉衍生:探索的范围较大,人工特征交叉衍生时建议最后考虑,根据经验:
    • 优先从单变量评价指标较好的特征开始
    • 连续特征内部可能会做交叉衍生
    • 但离散特征内部往往不做交叉衍生
      • one-hot 后特征对应维数较大
      • 单个维度信息量不多,交叉后维数爆炸,不适合某些模型,如:树模型
    • 从离散、连续特征中 分别选择 进行交叉
      • 交叉方式:连续特征为记录内聚合特征时,按离散特征分组聚合
      • 优先考虑此种交叉衍生

降维

Principal Component Analysis

PCA:主成分分析,找到数据中主成分,用主成分来表征原始数据,达到降维目的

  • 思想:通过坐标轴转换,寻找数据分布的最优子空间
    • 特征向量可以理解为坐标转换中新坐标轴方向
    • 特征值表示对应特征向量方向上方差
      • 特征值越大、方差越大、信息量越大
      • 抛弃较小方差特征
  • PCA缺陷:线性降维方法
    • KPCA:核主成分分析,核映射对PCA进行扩展
    • 流形映射降维方法:等距映射、局部线性嵌入、拉普拉斯 特征映射

步骤

  • 对样本数据进行中心化处理(和统计中处理不同)
  • 求样本协方差矩阵
  • 对协方差矩阵进行特征值分解,将特征值从大至小排列
  • 取前p个最大特征值对应特征向量作为新特征,实现降维

Linear Discriminant Analysis

LDA:线性判别分析,寻找投影方向,使得投影后样本尽可能按照 原始类别分开,即寻找可以最大化类间距离、最小化类内距离的方向

  • 相较于PCA,LDA考虑数据的类别信息,不仅仅是降维,还希望 实现“分类”

  • 优点:相较于PCA

    • LDA更适合处理带有类别信息的数据
    • 模型对噪声的稳健性更好
  • 缺点

    • 对数据分布有很强假设:各类服从正太分布、协方差相等, 实际数据可能不满足
    • 模型简单,表达能力有限,但可以通过核函数扩展LDA处理 分布比较复杂的数据
  • Fisher判别分析

Independent Component Analysis

ICA:独立成分分析,寻找线性变换$z=Wx$,使得$z$各特征分量 之间独立性最大

  • 思想
    • 假设随机信号$x$服从模型
      • $s$:未知源信号,分量相互独立
      • $A$:未知混合矩阵
    • ICA通过观察$x$估计混合矩阵$A$、源信号$s$,认为源信号 携带更多信息
  • 若原信号非高斯,则分解唯一,否则可能有无穷多分解
  • 因子分析,也称Blind Source Separation(盲源分离)

算法

  • 大多数ICA算法需要进行数据预处理:先用PCA得到主成分$Y$, 再把各个主成分各分量标准化得到$Z$满足

    • $Z$各分量不相关
    • $Z$各分量方差为1
  • FastICA算法:寻找方向$w$使得随机变量$w^T z$某种 “非高斯性”度量最大化

    • 四阶矩

图像特征提取

  • 提取边缘、尺度不变特征变换特征
  • 以下是传统的图像特征提取方法,现在应该都是CNN进行特征 提取、分类
  • 详情参见machine_learning/cv

LBP特征

  • Sobel Operator
  • Laplace Operator
  • Canny Edge Detector

基于角点

  • Moravec
  • Harris
  • GoodFeaturesToTrack
  • FAST

基于尺度空间

  • Scale-Invariant Feature Transform
  • Speeded Up Robust Feature
  • Brief
  • Oriented Brief

HOG特征

方向梯度直方图特征:通过计算、统计图像局部区域梯度方向直方图 实现特征描述

步骤

  • 归一化处理:图像转换为灰度图像,再利用伽马校正实现
    • 提高图像特征描述对光照、环境变量稳健性
    • 降低图像局部阴影、局部曝光、纹理失真
    • 尽可能抵制噪声干扰
  • 计算图像梯度
  • 统计梯度方向
  • 特征向量归一化(块内)
    • 克服光照不均匀变化及前景、背景对比差异
  • 生成特征向量

文本特征提取

  • 具体参见ml_specification/natural_language_processing/#todo

词袋模型

词袋模型:将文本以词为单位切分token化

  • 文章可以表示为稀疏长向量,向量每个维度代表一个单词

    • 针对有序语句,将单词两两相连
    • 维度权重反映单词在原文章中重要程度
      • 通常使用TF-IDF统计量表示词权重
  • TF-IDF

    • $TF(t, d)$:单词$t$在文档$d$中出现的频率
    • $IDF(t)$:逆文档频率,衡量单词对表达语义的重要性
      • 若单词在多篇文章中出现过,则可能是通用词汇,对区分 文章贡献较小,$IDF(t)$较小、权重较小

N-gram模型

N-gram模型:将连续出现的$n, n \leq N$个词组成的词组N-gram 作为单独特征放到向量中

  • 相较于词袋模型,考虑单词组合意义
  • word stemming:将不同词性单词统一为同一词干形式
    • 同一个词可能有多种词性变化,却拥有相同含义

Word-Embedding模型

词嵌入模型:将每个词都映射为低维空间上的稠密向量

  • Word2Vec:常用词嵌入模型,底层神经网络

    • Continuous Bag of Words:根据上下文词语预测当前词 生成概率
    • Skip-gram:根据当前词预测上下文中各个词的生成概率
  • 实际上直接使用矩阵作为源文本特征作为输入进行训练,难以 得到好结果,往往需要提取、构造更高层特征

参数优化

参数初始化

  • 合适参数初始化可以加速模型训练

    • 避免反向传播的梯度信息被放大、缩小
    • 导致出现梯度爆炸、消失
  • 参数初始化值满足如下条件,则训练过程中能较好防止梯度信号被放缩

    • 激活值均值为 0
    • 每层激活值方差保持一致

常数(零值)初始化

常数初始化:将所有权值初始化为常数

  • 任意常数初始化方法性能都不好,甚至无法训练

    • 反向传播算法更新参数时,各参数各维度导数一致、更新后权值一致
    • 各神经元在演化过程中对称,无法学习不同特征,退化为单神经元
  • 在激活函数选择线性激活函数时

    • 过大的初始化权重可能导致梯度爆炸
    • 过小的初始化值可能导致梯度消失

随机初始化

随机初始化:随机生成参数

  • 权重 $W$:均值 0、方差 1 的正态分布生成,并乘以较小常数(如:0.01)

    • 权值被初始化不同值,解决零值初始化存在网络退化问题
    • 但较小权值可能导致梯度弥散,无法学习
  • 偏置 $b$:初始化为 0

    • 帮助变换系统初始处于线性域,加快梯度传播

Xavier 初始化

Xavier 初始化:适合 tanh 激活函数的参数初始化方式

  • $n^{(l)}$:第 $l$ 层神经元数量

He 初始化

He 初始化:适合 ReLU 激活函数的参数初始化方式

  • 基于 Xavier 初始化在 ReLU 上的改进,实际中二者都可以使用

超参搜索

Bayesian Optimization