机器学习模型

5 篇文章 0 订阅
2 篇文章 0 订阅

[Part1]模型评估指标

一、回归模型

1. 绝对误差(mean_absolute_error)

预测点与真实点之间距离之差的绝对值的平均值

'''scikit-learn实现:'''
from sklearn import metrics
absolute_error = metrics.mean_absolute_error(y_true,y_pred)

2. 均方误差(mean_squared_error)

预测点与实际点之间距离之差平方和的均值

'''scikit-learn实现:'''
from sklearn import metrics
absolute_error = metrics.mean_s_error(y_true,y_pred)

二、分类模型

1. 准确率(accuracy)

accuracy = 所有预测正确的样本数目 / 所有参加预测的样本总数目

'''scikit-learn实现:'''
from sklearn import metrics
Accuracy = metrics.accuracy_score(y_true,y_pred,normalize=True)

y_true:验证集的实际类别
y_pred:验证集的预测类别
normalize:True——输出为准确率;False——输出为验证集被正确分类的数目

2. 精度(precision)

precision = 真正为正例的样本(TP) / 所有预测为正例的样本(TP+FP)

'''scikit-learn实现:'''
from sklearn import metrics
Precision = metrics.precision_score(y_true,y_pred,average=None)

average(计算方式):None——直接返回各个类别的精度列表;binary——适用于二分类情况;macro——直接计算各个类别的精度的平均(不适用于类别不平衡时);weight——通过对每个类别的score进行加权求得;micro——在多标签问题中大类将被忽略。

3. 召回率(recall)

recall = 真的正例(TP) / 所有为正例的样本(TP+FN)

'''scikit-learn实现:'''
from sklearn import metrics
Recall= metrics.recall_score(y_true,y_pred,average=None)

4. F1值(F1 score)

一般来说,准确率和精度相互矛盾,当recall = precision时达到平衡,这一平衡点定义为F1值。
F1 = 2PR/(P+R)

'''scikit-learn实现:'''
from sklearn import metrics
F1= metrics.f1_score(y_true,y_pred,pos_label=1,average=None)

一次性计算accuracy、precision、F1、support(预测的各类别下的样本数目):

'''scikit-learn实现:'''
from sklearn import metrics
Name = ['Class 0:','Class 1:','Class 2:',...]
Classification= metrics.classification_report(y_true,y_pred,target_names=Name)

target_names:输出类别的名字
输出的行为各个类别,列为accuracy、precision、F1、support

5. ROC曲线(ROC curve)

根据预测结果(概率)对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出真正率(TP)和假正率(FP)。横坐标为FP纵坐标为TP绘制曲线,即为ROC曲线。

'''scikit-learn实现:'''
from sklearn import metrics
ROC= metrics.roc_curve(y_true,y_pred_prob,pos_label=1)

y_pred_prob:验证集样本的预测概率值
pos_label:正例的类别

6. AUC(ROC曲线下的面积)

当两条ROC曲线交叉时,取两条曲线下面面积最大者即为AUC。

'''scikit-learn实现:'''
from sklearn import metrics
AUC= metrics.roc_auc_score(y_true,y_pred_prob)

7. 混淆矩阵(confusion matrix)

用于评估分类模型好坏的工具
混淆矩阵:

类1类2类3
类14820
类25432
类31346
第一行表示类一的50个样本中48个分类正确,2个误分为类2,0个误分为类3。
'''scikit-learn实现:'''
from sklearn import metrics
Confusion= metrics.confusion_matrix(y_true,y_pred,labels=None)

labels:指定各个类别显示的名称,默认为None。

三、聚类模型

1. 外部指标(external index)

外部指标需要提供一个参考模型,现定义指标:
SS:同时属于A和A*的,对应数目记为a;
SD:属于A但不属于A*的,对应数目记为b;
DS:不属于A但属于A*的,对应数目记为c;
DD:同时不属于A和A*的。对应数目记为d;
现有5个样本{x1,x2,x3,x4,x5},其实际聚类结果为:labels_true = {0,0,1,0,1},用聚类算法预测的聚类结果为:labels_pred = {1,0,1,2,0}。现可得如下聚类结果:

样本对labels_truelabels_pred统计标签
x1,x20,01,0c
x1,x30,11,1b
x1,x40,01,2d
x1,x50,11,0d
x2,x30,10,1d
x2,x40,00,2c
x2,x50,10,0b
x3,x41,01,2d
x3,x51,11,0c
x4,x50,12,0d
  1. Jaccard系数(Jaccard Coefficient)
    J C = a a + b + c JC = {a \over {a+b+c}} JC=a+b+ca
  2. FM指数(Fowlkes and Mallows Index)
    F M I = a a + b × a a + c FMI = \sqrt{{a \over {a+b}} \times {a \over {a+c}}} FMI=a+ba×a+ca
  3. Rand指数(Rand Index)
    R I = 2 × ( a + b ) M × ( M − 1 ) RI = {2 \times (a+b) \over M \times (M-1)} RI=M×(M1)2×(a+b)
    M是样本总数, M × ( M − 1 ) 2 M \times (M-1) \over 2 2M×(M1)表示N个样本可组成的两两配对数。a:C与K中都是同类别的元素对数;b:C与K中都不是同类别的元素对数;RI取值范围 [0,1],值越大聚类结果与实际越接近。
  4. ARI指数(Adjusted Rand Index)
    调整的兰德指数,比RI具有更高的区分度,在聚类结果随机时,可使结果接近于0。
    A R I = R I − ( R I ) E m a x ( R I ) − ( R I ) E ARI = {{RI - (RI) \tiny E} \over max(RI)-(RI) \tiny E} ARI=max(RI)(RI)ERI(RI)E
    ( R I ) E (RI) \tiny E (RI)E是随机聚类时对应的兰德指数。ARI取值范围[-1,1],值越大与实际越接近。
'''scikit-learn实现:'''
from sklearn import metrics
ARI= metrics.adjusted_rand_score(labels_true,labels_pred)
  1. 标准化互信息(Normalized Mutual Information)
    一个随机变量中包含的关于另一个随机变量的信息量,或一个随机变量由于已知另一个随机变量而减少的不肯定性,用 I ( X , Y ) I(X,Y) I(X,Y)表示。
    I ( X , Y ) = ∑ x ∈ X ∑ y ∈ Y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) I(X,Y) = \sum_ {\mathclap{x \in X}} \sum_ {\mathclap{y \in Y}} p(x,y) log {p(x,y) \over p(x)p(y)} I(X,Y)=xXyYp(x,y)logp(x)p(y)p(x,y)
    互信息即为决策树中的信息增益(Information Gain),值为随机变量 Y Y Y的熵 H ( Y ) H(Y) H(Y) Y Y Y的条件熵 H ( Y ∣ X ) H(Y|X) H(YX)之差,即: I ( X , Y ) = H ( Y ) − H ( Y ∣ X ) I(X,Y) = H(Y) - H(Y|X) I(X,Y)=H(Y)H(YX)
'''scikit-learn实现:'''
from sklearn import metrics
NMI= metrics.adjusted_mutual_info_score(labels_true,labels_pred)

2. 内部指标(internal index)

内部指标不需要外部参考模型。假设数据集为 T = { x 1 , x 2 , . . . , x M } T = \{ {x \tiny 1},{x \tiny 2},...,{x \tiny M} \} T={x1,x2,...,xM},被聚类模型划分为 C = { c 1 , c 2 , . . . , c K } C = \{ {c \tiny 1},{c \tiny 2},...,{c \tiny K} \} C={c1,c2,...,cK}个簇,则定义:
a v g ( c k ) avg(c \tiny k) avg(ck):簇 c k c \tiny k ck中每对样本之间的平均距离。
d i a m ( c k ) diam(c \tiny k) diam(ck):簇 c k c \tiny k ck中距离最远的两个点之间的距离。
d m i n ( c k , c l ) {d \tiny min}({c \tiny k},{c \tiny l}) dmin(ck,cl):簇 c k c \tiny k ck和簇 c l c \tiny l cl之间最近点的距离。
d c e n ( c k , c l ) {d \tiny cen}({c \tiny k},{c \tiny l}) dcen(ck,cl):簇 c k c \tiny k ck和簇 c l c \tiny l cl中心点之间的距离。

  1. DB指数(Davies-Bouldin Index)
    D B I = 1 K ∑ k = 1 K max ⁡ k ≠ l ( a v g ( c k ) + a v g ( c l ) d c e n ( c k , c l ) ) DBI = {{1 \over K}\displaystyle\sum_{k=1}^{K} {\max_{\mathclap {k \neq l}}} \bigg({{avg({c\tiny k})+avg({c\tiny l})}\over {d\tiny cen}({c\tiny k},{c\tiny l})}}\bigg) DBI=K1k=1Kk=lmax(dcen(ck,cl)avg(ck)+avg(cl))
    DBI的值越小 ⇌ \xrightleftharpoons{} 相同簇内的样本距离越近,不同簇距离越远
  2. Dunn指数(Dunn Index)
    D I = max ⁡ k ≠ l d m i n ( c k , c l ) m a x k d i a m ( c k ) DI = {\max_{\mathclap {k \neq l}}} {{d\tiny min}({c\tiny k},{c\tiny l}) \over {max\atop k} diam({c \tiny k})} DI=k=lmaxkmaxdiam(ck)dmin(ck,cl)
    DI值越大 ⇌ \xrightleftharpoons{} 任意两个不同簇之间最近距离越大,任意簇内最远的两个点之间距离越小

3. 轮廓系数(silhouette score)

适用于训练样本类别信息未知的情况,取值范围[-1,1],对于样本集合,其轮廓系数为所有样本轮廓系数的均值。假设某样本点与其同类别点的平均距离为a,与其距离最近的非同类别点的平均距离为b,则轮廓系数:
s = b − a m a x ( a , b ) s={{b-a} \over max(a,b)} s=max(a,b)ba
s值越大 ⇌ \xrightleftharpoons{} 同类别样本点距离越近,不同类别样本点距离越远

'''scikit-learn实现:'''
from sklearn import metrics
s= metrics.silhouette_score(X,labels,metric='euclidean',sample_size=None)

X:样本特征矩阵
labels:每个样本的预测类别标签
metric:计算距离的度量方式,默认’euclidean’,欧氏距离
sample_size:设定计算轮廓系数时采用的样本数,默认 None,不进行采样

[Part2]模型复杂度度量

一、偏差与方差

现有训练集T,测试样本为x:
y y y:x的真实结果。
y ^ \hat y y^:x的观测结果。
ϵ = y − y ^ \epsilon = y-\hat y ϵ=yy^ y y y y ^ \hat y y^之间的误差。
f T ( x ) {f\tiny T}(x) fT(x):在T上学得模型f对x的预测输出。

  1. 噪声的方差为 v a r ( ϵ ) = E [ ( y − y ^ ) 2 ] var(\epsilon) = E[(y- \hat y)^2] var(ϵ)=E[(yy^)2]
  2. 模型在训练集T上预测期望: f ˉ ( x ) = E ( f T ( x ) ) \bar f(x) = E({f\tiny T}(x)) fˉ(x)=E(fT(x))
  3. 模型在训练集T上预测方差: v a r ( x ) = E [ ( f T ( x ) − f ˉ ( x ) ) 2 ] var(x) = E[({f\tiny T}(x)-\bar f(x))^2] var(x)=E[(fT(x)fˉ(x))2]
  4. 模型在训练集T上预测偏差: b i a s 2 = E [ ( y − f ˉ ( x ) ) 2 ] bias^2 = E[(y-\bar f(x))^2] bias2=E[(yfˉ(x))2]

由上可得模型在训练集T上泛化误差期望: E [ ( f T ( x ) − y ^ ) 2 ] = v a r ( x ) + b i a s 2 + v a r ( ϵ ) E[({f\tiny T}(x)-\hat y)^2] = var(x)+bias^2+var(\epsilon) E[(fT(x)y^)2]=var(x)+bias2+var(ϵ)
b i a s 2 bias^2 bias2度量了 f ˉ ( x ) \bar f(x) fˉ(x) y y y的偏离程度; v a r ( x ) var(x) var(x)度量了同样大小的训练集的变动所导致的学习性能的变化; v a r ( ϵ ) var(\epsilon) var(ϵ)当前任务下任何学习算法的期望泛化误差下限。偏差和方差一般是有冲突的,故偏差与方差加起来最优的点即对应最佳模型复杂度。

二、过拟合与正则化

1. 过拟合与欠拟合

模型对训练集数据预测很好,对测试集预测很差。过拟合——将无关特征或非必要特征作为判断的充分必要条件;欠拟合——将组粗略特征作为判断的充分必要条件。解决方式:获取额外数据进行交叉验证;重新清洗数据;加入正则化项。

2. 经验风险与结构风险

经验风险函数 ( 1 M ∑ i = 1 M L ( y i , f ( x i ; w , b ) ) ) \bigg({1\over M}\displaystyle\sum_{i=1}^{M}L({y\tiny i},f({x\tiny i};w,b))\bigg) (M1i=1ML(yi,f(xi;w,b))):一般由各种损失函数组成。
正则化函数 ( J ( w ) ) ) \big(J(w))\big) (J(w))):关于模型待求权重向量w的函数。
结构风险函数 ( m i n   1 M ∑ i = 1 M L ( y i , f ( x i ; w , b ) ) + λ J ( w ) ) \bigg(min\space{1\over M}\displaystyle\sum_{i=1}^{M}L({y\tiny i},f({x\tiny i};w,b))+\lambda J(w)\bigg) (min M1i=1ML(yi,f(xi;w,b))+λJ(w)):经验风险函数与正则化函数之和,用于选择经验风险与模型复杂度同时较小的模型。

3. 正则化

  1. L0范数:向量中非0元素的个数。使用L0范数规则化权重向量w,就是希望w中大部分元素为0,w是稀疏的,即去除没有信息的特征,对应的权重置0。L0函数是个NP问题,很难优化求解。
    ∣ ∣ w ∣ ∣ p = ( ∑ j = 1 N ∣ w j ∣ p ) 1 p {||w||\tiny p} = \big(\displaystyle\sum_{j=1}^{N}|{w\tiny j}|^p\big)^{1\over p} ∣∣w∣∣p=(j=1Nwjp)p1
  2. L1范数:向量中各个元素绝对值之和,效果:为让 w j w\tiny j wj尽量往0处靠近。
    ∣ ∣ w ∣ ∣ 1 = ∑ j = 1 N ∣ w j ∣ {||w||\tiny 1} =\displaystyle\sum_{j=1}^{N}|{w\tiny j}| ∣∣w∣∣1=j=1Nwj
    w的权重更新公式:                       w j = w j − η ( ∂ L 0 ∂ w j + s i g n ( w j ) ) \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space{w\tiny j}={w\tiny j}-\eta \big({\partial {L\tiny 0}\over \partial {w\tiny j}}+sign({w\tiny j})\big)                      wj=wjη(wjL0+sign(wj))
    w j {w\tiny j} wj等于0时, ∣ w j ∣ |{w\tiny j}| wj不可导,可规定 s i g n ( 0 ) = 0 sign(0) = 0 sign(0)=0
  3. L2范数:向量中各个元素的平方和的开方,效果: w j {w\tiny j} wj变为 ( 1 − η ) w j {(1-\eta)w\tiny j} (1η)wj,因 1 − η ≤ 1 1-\eta\leq1 1η1,故可减小 w j {w\tiny j} wj
    ∣ ∣ w ∣ ∣ 2 = ( ∑ j = 1 N ∣ w j ∣ 2 ) 1 2 {||w||\tiny 2} = \big(\displaystyle\sum_{j=1}^{N}|{w\tiny j}|^2\big)^{1\over 2} ∣∣w∣∣2=(j=1Nwj2)21
    w的权重更新公式:                                  w j = w j − η ( ∂ L 0 ∂ w j + w j ) \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space{w\tiny j}={w\tiny j}-\eta \big({\partial {L\tiny 0}\over \partial {w\tiny j}}+{w\tiny j}\big)                                 wj=wjη(wjL0+wj)

[Part3]特征工程与模型调优

一、特征工程

1. 数据清理

去除原始数据中不需要的标签数据,不同格式的数据清理方式也不同,需借助各种python库等。数据清理后可能存在部分数据缺失的情况,处理方式如下:
4. 直接删除缺失数据:适用于数据量大而缺失少的情况[data_n=data.dropna(axis=0)#删除缺失值的行]
5. 固定值填充:用某一值填充缺失值,会带来较大噪声,不适用缺失较多情况[data_n=data.fillna(0)]
6. 均值/中位数填充:较优于固定值填充[data_n=data.fillna(data.mean())]
7. 相邻值填充:较优于均值填充,但偶然性较大[data_n=data.fillna(method='pad')]
8. 模型预测填充:按某一特征是否缺失将数据集分为测试集和训练集,用训练集训练一个回归模型再对测试集进行预测,预测值替换缺失值即可。

2. 特征处理

不同模型对输入数据的类型要求可能不同,如数值型特征一般要做归一化、标准化、离散化等处理,类别性特征一般要进行one-hot编码处理。

  1. 归一化:将不同特征取值的量纲统一,归一化会改变特征取值的分布。归一化处理后的值 x ′ x\prime x
    x ′ = x − x m i n x m a x − x m i n x \prime = {x-{x\tiny min}\over {x\tiny max}-{x\tiny min}} x=xmaxxminxxmin
    x m i n {x\tiny min} xmin:原始数据中的最小值。 x m a x {x\tiny max} xmax:原始数据中的最大值。
  2. 标准化:标准化不会改变特征取值得分布。表达式为:
    x ′ = x − μ δ x \prime = {x-\mu \over \delta} x=δxμ
    μ \mu μ:某个特征的原始取值的均值。 δ \delta δ:该特征对应的标准差。
  3. 离散化:根据数据的分布情况对数据划分区间,离散化的每个区间为一个类别。
  4. one-hot编码:有些模型是无法处理类别性特征的,要将类别特征用能反映应其重要性大小的数字代替。

3.特征交互

将两个或两个以上的特征进行交互,常用的交互方式有求和、做差、相乘、取对数等。

'''scikit-learn实现:'''
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
train_matrix=X.as_matrix()				#原始特征
train_array=np.squeeze(np.asarray(train_matrix))

poly=PolynomialFeatures(2)				#交互特征
train_array2=poly.fit_transform(train_array)

train_array3=np.hstack((train_array,train_array2))	#特征拼接

二、模型选择与模型调优

1. 模型选择

模型选择的典型方式是正则化(如Part2中所述)和交叉验证,正则化是从模型的角度考虑,交叉验证是从数据层面来考虑的。在有监督学习中,将数据集按比例分为训练集和验证集两部分,对训练好的模型进行验证,选出最终较好的模型,就可用于测试集进行预测输出。另一种更为可靠的方法是S折交叉验证,具体实现如下:

  1. 数据集切分:
from sklearn.cross_validation import train_test_split
x_train,x_test,y_train,y_test = cross_validation.train_test_split(x,y,test_size=0.3)
'''x_train和x_test为训练集和验证集的样本特征,y_train和y_test为训练集和验证集的样本标签'''
  1. 交叉验证:
from sklearn.model_selection import cross_val_score
scores=model_selection.cross_val_score(clf,x,y,cv=5,scoring=None)
'''clf:指定的模型类别;x和y为原始数据中的样本特征和样本标签;cv:S折交叉验证的S值,默认为5;scoring:模型采用的评估标准,默认为None'''

2.模型调优

  1. 网络搜索寻优:一种暴力寻优方法,scikit-learn实现如下:
class sklearn.model_selection.GridSearchCV(estimator,param_grid,scoring=None,n_jobs=1,iid=true,cv=None)
'''
estimator:指定需要调优的模型
param_grid:给出学习器要优化的参数(字典形式),字典的每个键放基学习器的一个参数,字典的值用列表形式给出该参数对应的候选值
scoring:指定模型采用的评估标准
cv:S这就交叉验证的S值默认为3
iid:若为True,表示数据是独立同分布的,默认为True
n_jobs:计算机运行使用的CPU核数,默认为-1,表示所有可用的CPU核
输出参数:
grid_scores_:每个元素对应参数组合的测试得分
best_params_:最佳参数组合
best_score_:最佳学习器的评估分数
'''
  1. 随机搜索寻优:适用于参数较多情况,scikit-learn实现如下:
class sklearn.grid_search.RandomizedSearchCV(estimator,param_distributions,n_iter=10,scoring=None,cv=None,iid=True,refit=True,n_jobs=1)
'''
param_distributions:给出学习器要优化的参数(字典形式)
n_iter:参数采样的数量,默认为10
refit:默认为True,表示在参数优化后使用整个数据集来重新训练该最优的estimator
其它同网络搜索寻优。
'''

== ---------------------------------------------------------华丽的分割线---------------------------------------------------------==

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值