一、数据变换——多项式
sklearn.preprocessing.PolynomialFeatures类实现多项式的数据转换。
用于产生多项式,并且多项式包含的是相互影响的特征集。比如:一个输入样本是2维的。
形式如[a,b],则二阶多项式的特征集为[1,a,b,a^2,ab,b^2]。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#数据转换——多项式
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
X = np.arange(6).reshape(3,2)
print("============输入数据集==========")
print(X)
poly = PolynomialFeatures(2) #设置多项式阶数为 2
p = poly.fit_transform(X) #训练输入数据集并进行多项式转换
print("============多项式转换==========")
print(p)
poly1 = PolynomialFeatures(degree=2,interaction_only=True) # 2阶,交互关系
p1 = poly1.fit_transform(X)
print("============交互关系多项式转换==========")
print(p1)
#运行结果:
============输入数据集==========
[[0 1]
[2 3]
[4 5]]
============多项式转换==========
[[ 1. 0. 1. 0. 0. 1.]
[ 1. 2. 3. 4. 6. 9.]
[ 1. 4. 5. 16. 20. 25.]]
============交互关系多项式转换==========
[[ 1. 0. 1. 0.]
[ 1. 2. 3. 6.]
[ 1. 4. 5. 20.]]
注:上面的数组中,每一行是一个list。比如[0,1] 类似与上面的[a,b]。它的多项式输出矩阵就是[1,a,b,a^2,ab,b^2]。
所以就是下面对应的[1,0,1,0,0,1]。现在将interaction_only=True。这时就是只找交互作用的多项式输出矩阵。
例如[a,b]的多项式交互式输出[1,a,b,ab]。不存在自己与自己交互的情况如;a^2或者b^2之类的。
二、pipeline管道——并行优化
关于pipeline管道的详细介绍,见链接:https://www.cnblogs.com/midhillzhou/p/5588958.html
简介: pipeline的概念抽象出来:将一件需要重复做的事情(这里指为客户准备一份精美的食物)切割成各个不同的阶段(这里是四个阶段:盘子,薯条,豌豆,饮料),每一个阶段由独立的单元负责(四个生产者分别负责不同的环节)。所有待执行的对象依次进入作业队列(这里是所有的客户排好队依次进入服务,除了开始和结尾的一段时间,任意时刻,四个客户被同时服务)。对应到CPU中,每一条指令的执行过程可以切割成:fetch instruction、decode it、find operand、perform action、store result 5个阶段。
sklearn提供的pipeline包的使用,详见链接:https://www.cnblogs.com/jasonfreak/p/5448462.html
sklearn提供了包pipeline来完成流水线式和并行式的工作。基于流水线组合的工作需要依次进行,前一个工作的输出是后一个工作的输入;
基于并行式的工作可以同时进行,其使用同样的输入,所有工作完成后将各自的输出合并之后输出。
并行处理和流水线处理将多个特征处理工作,甚至包括模型训练工作组合成一个工作(从代码的角度来说,即将多个对象组合成了一个对象)。
并行处理使得多个特征处理工作能够并行地进行。根据对特征矩阵的读取方式不同,可分为整体并行处理和部分并行处理。
pipeline包提供了FeatureUnion类来进行整体并行处理;使用FeatureUnionExt类进行部分并行处理;
pipeline包提供了Pipeline类来进行流水线处理。流水线上除最后一个工作以外,其他都要执行fit_transform方法,
且上一个工作输出作为下一个工作的输入。最后一个工作必须实现fit方法,输入为上一个工作的输出;
但是不限定一定有transform方法,因为流水线的最后一个工作可能是训练!
核心代码如下:
from numpy import log1p
from sklearn.preprocessing import Imputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import Binarizer
from sklearn.preprocessing import MinMaxScaler
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
#新建计算缺失值的对象
step1 = ('Imputer', Imputer())
#新建将部分特征矩阵进行定性特征编码的对象
step2_1 = ('OneHotEncoder', OneHotEncoder(sparse=False))
#新建将部分特征矩阵进行对数函数转换的对象
step2_2 = ('ToLog', FunctionTransformer(log1p))
#新建将部分特征矩阵进行二值化类的对象
step2_3 = ('ToBinary', Binarizer())
#新建部分并行处理对象,返回值为每个并行工作的输出的合并
step2 = ('FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4]]))
#新建无量纲化对象
step3 = ('MinMaxScaler', MinMaxScaler())
#新建卡方校验选择特征的对象
step4 = ('SelectKBest', SelectKBest(chi2, k=3))
#新建PCA降维的对象
step5 = ('PCA', PCA(n_components=2))
#新建逻辑回归的对象,其为待训练的模型作为流水线的最后一步
step6 = ('LogisticRegression', LogisticRegression(penalty='l2'))
#新建流水线处理对象
#参数steps为需要流水线处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
pipeline = Pipeline(steps=[step1, step2, step3, step4, step5, step6])
三、分类模型评价标准
ROC曲线、AUC值、混淆矩阵、准确率、召回率
1.混淆矩阵(confusion matrix)
针对预测值和真实值之间的关系,我们可以将样本分为四个部分,分别是:
真正例(True Positive,TP):预测值和真实值都为1
假正例(False Positive,FP):预测值为1,真实值为0
真负例(True Negative,TN):预测值与真实值都为0
假负例(False Negative,FN):预测值为0,真实值为1
我们将这四种值用矩阵表示如下图:该矩阵即为混淆矩阵。
2.ROC曲线
通过混淆矩阵,我们可以得到真正例率(True Positive Rate ,TPR),也被称为召回率:
我们还可以得到假正例率(False Positive Rate , FPR):
那么只要给定一个决策边界阈值,我们可以得到一个对应的TPR和FPR值,然而,我们不从这个思路来简单的得到TPR和FPR,而是反过来得到对应的,我们检测大量的阈值,从而可以得到一个TPR-FPR的相关图:
图中的红色曲线和蓝色曲线分别表示了两个不同的分类器的TPR-FPR曲线,曲线上的任意一点都对应了一个值。
该曲线就是ROC曲线(receiver operating characteristic curve)。该曲线具有以下特征:
-
最完美的分类器(完全区分正负样例):(0,1)点,即没有FP,全是TP
-
曲线越是“凸”向左上角,说明分类器效果越好
-
随机预测会得到(0,0)和(1,1)的直线上的一个点
从图中可以看出,红色曲线所代表的分类器效果好于蓝色曲线所表示的分类器。
3.利用ROC的其他评估标准
AUC(area under thecurve),也就是ROC曲线的下夹面积,越大说明分类器越好,最大值是1,图中的蓝色条纹区域面积就是蓝色曲线对应的 AUC。
-
Precision = TP/(TP+FP)
(精确度) -
recall=TP/(TP+FN) (召回率)
-
Accuracy = (TP+FN)/(TP+FP+FN+TN)
(准确率) -
F-Meature = 2(Precision*Recall)/(Precision + Recall)