Code war of Angel


  • Home

  • Archives

Flask vs Django

Posted on 2019-06-18 | In Python

两个框架同样都是Python web framework。

  1. 项目规模

    • Flask是一个面向简单需求小型应用的“微框架(microframework)”。
    • Django更多面向大型应用。
  2. SQL ORM

    • FLASK 不包含ORM,流行选用SQLAlchemy
    • Django包含ORM
  3. bootstrapping

    • Flask没有,分离使用blurprint
    • Django有,内置在django-admin中.
      1
      django-admin startproject hello_django
  4. 易用性

    • Flask只要几行代码就能跑起一个demo,同样如果要扩展功能就要自己加库,更加灵活。
    • Django的demo 用脚手架生成也就好几个文件,setting更是多,但是基本功能都都自带,可以开箱即用。

项目流程规范

Posted on 2019-06-17 | In 项目管理

项目管理流程

代码管理规范:

  1. 从master拉开发分支,上线后合并开发分支进master。
  2. 功能迭代分支在features/下,修复分支在bugfix/下
  3. 分支命名 branch_[功能描述]_[版本号]_[开发名字]
  4. Commit 内容尽量描述该次修改内容。
  5. 合并master时,先把master合并进开发分支,解决冲突后,使用merge request提交合并。

上线规范:

  1. 上线前应通知所有须知人员(包括leader、测试、pm),确认上线风险后进行。
  2. 所有上线代码禁止未经测试自行上线,如确认不需要测试部门介入,应有充分自测、pm自测、leader同意后上线。
  3. 禁止删除线上数据(无论你是否有权限)。
  4. 所有线上变更必须邮件通知所有须知人员。内容包括但不限于:变更内容、影响范围、变更时间。

测试规范:

  1. 进行测试前,开发应认真审阅测试用例,确保测试覆盖所有功能点。
  2. 测试时使用开发分支(自行合并master分支),上线完毕后才能合并进master分支。禁止使用master分支测试。
  3. 测试过程中,所有问题应记录bugzila,修复后进行确认。

朴素贝叶斯

Posted on 2019-06-04 | In 机器学习
  1. 朴素贝叶斯是一个不建模的算法。是一种直接衡量标签和特征之间的概率关系的有监督算法,它既可以做回归也可以分类,不过多是用于分类之中。朴素贝叶斯的算法根源就是基于概率论和数理统计的贝叶斯理论。
  2. 假设特征之间是有条件独立的,可以解决众多问题,也简化了很多计算过程,这是朴素贝叶斯被称为”朴素“的理由。因此,贝叶斯在特征之间有较多相关性的数据集上表现不佳,而现实中的数据多多少少都会有一些相关性。

  3. in sklearn

类 含义
naive_bayes.BernoulliNB 伯努利分布下的朴素贝叶斯
naive_bayes.GaussianNB 高斯分布下的朴素贝叶斯
naive_bayes.MultinomialNB 多项式分布下的朴素贝叶斯
naive_bayes.ComplementNB 补充朴素贝叶斯
linear_model.BayesianRidge 贝叶斯岭回归,在参数估计过程中使用贝叶斯回归技术来包括正则化参数
  1. 高斯朴素贝叶斯
    naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09)
    高斯朴素贝叶斯,通过假设P(Xi|Y)是服从高斯分布(也就是正态分布),来估计每个特征下每个类别上的条件概率。
    参数:
    • prior:表示类的先验概率。如果指定,则不根据数据调整先验,如果不指定,则自行根据数据 计算先验概率
    • var_smoothing: 在估计方差时,为了追求估计的稳定性,将所有特征的方差中最大的方差以某个比例(var_smoothing)添加到估计的方差中。
      1
      2
      3
      4
      from sklearn.naive_bayes import GaussianNB
      gnb = GaussianNB().fit(X_train,y_train)
      acc_score = gnb.score(X_test,y_test) #查看分数
      y_pred = gnb.predict(X_test) #查看预测的概率结果

支持向量机SVM

Posted on 2019-05-29 | In 机器学习
  1. 支持向量机算法功能
功能
有监督学习 线性二分类与多分类(Linear Support Vector Classification)
非线性二分类与多分类(Support Vector Classification, SVC)
普通连续型变量的回归(Support Vector Regression) 概率型连续变量的回归(Bayesian SVM)
无监督学习 支持向量聚类(Support Vector Clustering,SVC) 异常值检测(One-class SVM)
半监督学习 转导支持向量机(Transductive Support Vector Machines,TSVM)

从分类效力来讲,SVM在无论线性还是非线性分类中,都是明星般的存在。

  1. 支持向量机的分类方法,是在这组分布中找出一个超平面作为决策边界,使模型在数据上的分类误差尽量接近于小,尤其是在未知数据集上的分类误差(泛化误差)尽量小。决策边界一侧的所有点在分类为属于一个类,而另一侧的所有点分类属于另一个类。如果我们能够找出决策边界, 分类问题就可以变成探讨每个样本对于决策边界而言的相对位置,因此,支持向量机,就是通过找出边际最大的决策边界,来对数据进行分类的分类器。

  2. in sklearn
    image.png

svm.SVC(C=1.0,kernel=’rbf’,degree=3,gamma=’auto_deprecated’,coef0=0.0,shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=’ovr’, random_state=None)

参数

- kernel
    - linear
    - poly
    - sigmoid
    - rbf (good)
- degree
- gamma

image.png
image.png

1
2
from sklearn.svm import SVC
clf = SVC(kernel = "linear").fit(X,y)
  1. 核函数
    也叫做“核技巧”(Kernel Trick),是一种能够使用数据原始空间中的向量计算来表示 升维后的空间中的点积结果的数学方式。 这个原始空间中的点积函数就被叫做“核函数”(Kernel Function)。
    第一,有了核函数之后,我们无需去担心函数究竟应该是什么样,因为非线性SVM中的核函数都是正定核函数 (positive definite kernel functions),他们都满足美世定律(Mercer’s theorem),确保了高维空间中任意两个向量 的点积一定可以被低维空间中的这两个向量的某种计算来表示(多数时候是点积的某种变换)。
    第二,使用核函数计算低维度中的向量关系比计算原本的要简单太多了。
    第三,因为计算是在原始空间中进行,所以避免了维度诅咒的问题。

聚类算法

Posted on 2019-05-29 | In 机器学习
  1. 聚类算法又叫做“无监督分类”,其目的是将数据划分成有意义或有用的组(或簇)。这种划分可以基于我们的业务 需求或建模需求来完成,也可以单纯地帮助我们探索数据的自然结构和分布。
  2. in sklearn
    image.png

  3. KMeans聚类算法
    KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。
    簇中所有数据的均值通常被称为这个簇的“质心”(centroids)。在一个二维平面中,一簇数据点的质心的 横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高维空间。
    流程:

    - 随机抽取K个样本作为最初的质心
    - 开始循环:
    - 将每个样本点分配到离他们最近的质心,生成K个簇
    - 对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心
    - 当质心的位置不再发生变化,迭代停止,聚类完成
    
  4. 簇内平方和(Inertia):
    Total Inertia越小,代表每个簇内样本越相似,聚类的效果就越好。因此 KMeans追求的是,求解能够让Inertia最小化的质心。
    Inertia是基于欧几里得距离的计算公式得到的。
    簇内平方和/整体平方和是KMeans的损失函数。

  5. cluster.KMeans (n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from sklearn.cluster import KMeans
    n_clusters = 3
    # kmean不需要建立模型或者预测数据,因此只要fit就可以查看结果
    cluster = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
    # 查看聚好的类别,每个样本对应的类
    y_pred = cluster.labels_
    # 查看质心
    centroid = cluster.cluster_centers_
    # 查看总距离平方和
    inertia = cluster.inertia_

    参数:

    - n_clusters:分的类数
    
  6. 模型评估指标
    通过衡量簇内差异来衡量聚类的效果,可以通过轮廓系数来判断。

    • 样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离
    • 样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中得所有点之间的平均距离
      单个样本的轮廓系统为:s = (b-a) / max(b,a)
      轮廓系数范围是(-1,1),其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数为0时,则代表两个簇中的样本相 似度一致,两个簇本应该是一个簇。
      缺点:再凸型函数表现虚高
      1
      2
      3
      4
      from sklearn.metrics import silhouette_score
      from sklearn.metrics import silhouette_samples
      silhouette_score(X,cluster_.labels_) #总数
      silhouette_samples(X,y_pred) #每个样本

线性回归

Posted on 2019-05-28 | In 机器学习
  1. 回归是一种应用广泛的预测建模技术,这种技术的核心在于预测的结果是连续型变量。
  2. 线性回归是机器学习中最简单的回归算法,多元线性回归指的就是一个样本有多个特征的线性回归问题。对于一个 有 个特征的样本 而言,它的回归结果可以写作一个几乎人人熟悉的方程: y = w0+w1x1+w2x2+w3x3…..+wnxn
    预测函数的本质就是我们需要构建的模型,而构造预测函数的核心就是找出模型的参数向量。通过最小化损失函数或损失函数的某种变化来将求解参数向量,以此将单纯的求解问题转化为一个最优化问题。在多元线性回归中,我们的损失函数如下定义:
    image.png
    在这个平方结果下,我们的y和y^分别是我们的真实标签和预测值,也就是说,这个损失函数实在计算我们的真实标 签和预测值之间的距离。因此,我们认为这个损失函数衡量了我们构造的模型的预测结果和真实标签的差异,因此我们固然希望我们的预测结果和真实值差异越小越好。所以我们的求解目标就可以转化成RSS残差平方和:
    image.png

  3. 最小二乘法:通过最小化真实值和预测值之间的RSS来求解参数的方法。
    image.png

  4. linear_model.LinearRegression (fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)
    参数:

    • fit_intercept:是否计算此模型的截距,默认True
    • normalize: 当fit_intercept设置为False时,将忽略此参数。如果为True,则特征矩阵X在进入回归之前 将会被减去均值(中心化)并除以L2范式(缩放)。如果你希望进行标准化,请在fit数据 之前使用preprocessing模块中的标准化专用类StandardScaler。默认False
    • copy_X: 默认为True 如果为真,将在X.copy()上进行操作,否则的话原本的特征矩阵X可能被线性回归影响并覆盖。
    • n_jobs: 整数或者None,默认为None 用于计算的作业数。只在多标签的回归和数据量足够大的时候才生效。
      属性:
    • coef_:线性回归方程中估计出的系数
    • intercept_: 线性回归中的截距
      1
      2
      3
      from sklearn.linear_model import LinearRegression as LR
      reg = LR().fit(Xtrain, Ytrain)
      yhat = reg.predict(Xtest)
  5. 评估

    1. 是否预测了正确的值
      均方误差MSE:均方误差,本质是在RSS的基础上除以了样本总量,得到了每个样本量上的平均误差。
      image.png

      1
      2
      from sklearn.metrics import mean_squared_error as MSE
      MSE(y_true,y_predict)

      再sklearn中,均方误差是个负数,代表一种损失。

    2. 是否拟合到了足够的信息

      • R^2和
      • 可解释性方差分数(explained_variance_score,EVS)
        image.png
        两者都衡量 1 - 我们的模型没有捕获到的信息 量占真实标签中所带的信息量的比例,所以,两者都是越接近1越好。
        注意方法参数传入的顺序。

        1
        2
        3
        4
        5
        from sklearn.metrics import r2_score r2_score(yhat,Ytest)
        r2 = reg.score(Xtest,Ytest)

        from sklearn.metrics import explained_variance_score as EVS
        EVS(Ytest,yhat)

        R^2的值可能是个负数。证明模型拟合得非常糟糕

逻辑回归

Posted on 2019-05-27 | In 机器学习
  1. 逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回 归变化而来的,一种广泛使用于分类问题中的广义回归算法。
  2. 线性回归的任务,就是构造一个预测函数 来映射输入的特征矩阵x和标签值y的线性关系,而构造预测函数的核心 就是找出模型的参数
    image.png
    通过引入联系函数(link function),将线性回归方程z变换为g(z),并且令g(z)的值 分布在(0,1)之间,且当g(z)接近0时样本的标签为类别0,当g(z)接近1时样本的标签为类别1,这样就得到了一个分 类模型。而这个联系函数对于逻辑回归来说,就是Sigmoid函数:
    image.png

Sigmoid函数是一个S型的函数,当自变量z趋近正无穷时,因变量g(z)趋近于1,而当z趋近负无穷时,g(z)趋近于0,它能够将任何实数映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函数。 因为这个性质,Sigmoid函数也被当作是归一化的一种方法,是属于数据预处理中的“缩放”功能,可以将数据压缩到[0,1]之内。区别在于,MinMaxScaler归一化之后,是可以取到0和1的(最大值归一化后就是1,最小值归一化后就是0),但Sigmoid函数只是无限趋近于0和1。

g(z)的形似几率取对数的本质其实就是我们的线性回归z,我们实际上是在对线性回归模型的预测结果取 对数几率来让其的结果无限逼近0和1。因此,其对应的模型被称为”对数几率回归“(logistic Regression),也就是逻辑回归。

  1. 优点:

    • 逻辑回归对线性关系的拟合效果好。
    • 逻辑回归计算快
    • 逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字
  2. image.png

linear_model.LogisticRegression (penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’warn’, max_iter=100, multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None)

1
2
3
from sklearn.linear_model import LogisticRegression as LR
lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)

参数:

- penalty: "l1"/"l2",指定使用哪一种正则化方式,不填写默认"l2"。 注意,若选择"l1"正则化,参数solver仅能够使用”liblinear",若使用“l2”正则化,参数solver中 所有的求解方式都可以使用。
- C: C正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认一倍正则项。 C越小,对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越来越小。
- max_iter: 算法收敛最大迭代次数,int类型,默认为10。仅在正则化优化算法为newton-cg, sag和lbfgs才有用,算法收敛的最大迭代次数。
- solver: 优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是: 
    - liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
    - lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    - newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    - sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
    - saga:线性收敛的随机优化算法的的变重。
  1. ”损失函数“作为评估指标,来衡量参数的优劣,即这一组参数能否使模型在训练集上表现优异。即是说,我们在求解参数时,追求损失函数最小,让模型在训练数据上的拟合效果最优,即预测准确率尽量靠近100%。对逻辑回归中过拟合的控制,通过正则化实现。

  2. 正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项,分别通过在损失函数后加上参数向 量 的L1范式和L2范式的倍数来实现。这个增加的范式,被称为“正则项”,也被称为”惩罚项”。损失函数改变,基 于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。其中L1范数表现为参数向量中 的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值。

image.png

L1正则化和L2正则化虽然都可以控制过拟合,但它们的效果并不相同。当正则化强度逐渐增大(即C逐渐变小), 参数 的取值会逐渐变小,但L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0。

参考:
LogisticRegression - 参数说明

降维算法

Posted on 2019-05-27 | In 机器学习
  1. 降维算法中的”降维“,指的是降低特征矩阵中特征的数量。
  2. in sklearn
    image.png

  3. PCA使用的信息量衡量指标,就是样本方差,又称可解释性方差,方差越大,特征所带的信息量越多。
    image.png
    Var代表一个特征的方差,n代表样本量,xi代表一个特征中的每个样本取值,xhat代表这一列样本的均值。

    • 为什么方差的分母是n-1?
  4. 矩阵分解:让数据能够被压缩到少数特征上并且总信息量不损失太多的技术。PCA和SVD是两种不同的降维算法,只是两种算法中矩阵分解的方法不同,信息量的衡量指标不同罢了。降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征 向量被认为信息量很少,这些信息很可能就是噪音。

    • PCA使用方差作为信息量的衡量指标,并且特征值分解来找出空间V。
    • SVD使用奇异值分解来找出空间V
  5. 降维与特征工程的区别:

    • 特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,我们依然知道这个特征在原数据的哪个位置,代表着原数据上的什么含义。
    • 降维算法,是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓降维算法们都建立了怎样 的新特征向量,新特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。降维算法因此是特征创造(feature creation,或feature construction)的一种。
    • 可以想见,PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,我们使用特征选择。
  6. sklearn.decomposition.PCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from sklearn.decomposition import PCA
    #调用PCA
    pca = PCA(n_components=2) pca = pca.fit(X)
    X_dr = pca.transform(X)
    # 属性explained_variance,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
    pca.explained_variance_
    # 属性explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比
    # 又叫做可解释方差贡献率
    pca.explained_variance_ratio_
    # 降维后的总方差为原来方差的百分比
    pca.explained_variance_ratio_.sum()

    参数:

    • n_components: n_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数。
    • svd_solver: 奇异值分解器。sklearn将降 维流程拆成了两部分:一部分是计算特征空间V,由奇异值分解完成,另一部分是映射数据和求解新特征矩阵,由主成分分析完成,实现了用SVD的性质减少计算量,却让信息量的评估指标是方差,具体流程如下图:
    • random_state
      接口:
    • inverse_transform
  7. 选择最好的n_components:

    • 方法一:累积可解释方差贡献率曲线,选择拐点作为最优参数值

      1
      2
      3
      4
      5
      6
      import numpy as np
      pca_line = PCA().fit(X) plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
      plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
      plt.xlabel("number of components after dimension reduction")
      plt.ylabel("cumulative explained variance")
      plt.show()
    • 方法二:最大似然估计自选超参数法

      1
      pca_mle = PCA(n_components="mle")
    • 方法三:按信息量占比选超参数
      输入[0,1]之间的浮点数,并且让参数svd_solver ==’full’,表示希望降维后的总解释性方差占比大于n_components 指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留97%的信息量,就可以输入 n_components = 0.97,PCA会自动选出能够让保留的信息量超过97%的特征数量。

      1
      pca_f = PCA(n_components=0.97,svd_solver="full")

特征工程_embedded嵌入法与包装法

Posted on 2019-05-27 | In 机器学习

嵌入法

  1. 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行。在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小选择特征。并且,由于考虑特征对模型的贡献,因此无关的特征(需要相关性过滤的特征)和无区分度的特征(需要方差过滤的特征)都会因为缺乏对模型的贡献而被删除掉,可谓是过滤法的进化版。
    image.png

  2. sklearn.feature_selection.SelectFromModel (estimator, threshold=None, prefit=False, norm_order=1,
    max_features=None)

    • estimator        
      使用的模型评估器,只要是带feature_importances_或者coef_属性,或带有l1和l2惩罚项的模型都可以使用
    • threshold
      特征重要性的阈值,重要性低于这个阈值的特征都将被删除
    • prefit
      默认False,判断是否将实例化后的模型直接传递给构造函数。如果为True,则必须直接调用fit和transform,不能使用fit_transform,并且SelectFromModel不能与cross_val_score,GridSearchCV和克隆估计器的类似实用程序一起使用。
    • norm_order
      k可输入非零整数,正无穷,负无穷,默认值为1
      在评估器的coef_属性高于一维的情况下,用于过滤低于阈值的系数的向量的范数的阶数
    • max_features
      在阈值设定下,要选择的最大特征数。要禁用阈值并仅根据max_features选择,请设置threshold = -np.inf

      随机森林中的应用:

      1
      2
      3
      4
      5
      from sklearn.feature_selection import SelectFromModel
      from sklearn.ensemble import RandomForestClassifier as RFC
      RFC_ = RFC(n_estimators =10,random_state=0)
      X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y)
      # 可以使用学习曲线确认threshold最佳值
  3. 在嵌入法下,我们很容易就能够实现特征选择的目标:减少计算量,提升模型表现。因此,比起要思考很多统计量的过滤法来说,嵌入法可能是更有效的一种方法。然而,在算法本身很复杂的时候,过滤法的计算远远比嵌入法要快,所以大型数据中,我们还是会优先考虑过滤法。

参考:
特征选择-嵌入

包装法

包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。

  1. 递归特征消除法
    递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
    1
    2
    3
    4
    5
    6
    7
    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LogisticRegression

    #递归特征消除法,返回特征选择后的数据
    #参数estimator为基模型
    #参数n_features_to_select为选择的特征个数
    RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data,iris.target)

特征工程_Filter过滤法

Posted on 2019-05-24 | In 机器学习
  1. 流程

    • 特征提取
    • 特征创造
    • 特征选择:过滤->嵌入/包装/降维
  2. Filter过滤法

    1. 方差过滤
      这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。所以无论接下来的特征工程要做什么,都要优先消除方差为0的特征。

      1
      2
      3
      from sklearn.feature_selection import VarianceThreshold
      selector = VarianceThreshold(threshold=0) #阈值,抛弃所有低于阈值的特征
      X_var0 = selector.fit_transform(X)

      影响:最近邻算法KNN,单棵决策树,支持向量机SVM,神经网络,回归算法,都需要遍历特征或升维来进行运算,所以他们本身的运算量就很大,需要的时间就很长,因此方差过滤这样的特征选择对他们来说就尤为重要。但对于不需要遍历特征的算法,比如随机森林,它随机选取特征进行分枝,本身运算就非常快速,因此特征选择对它来说效果平平。

    2. 相关性过滤

      1. 卡方过滤

        • 卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。
        • 卡方检验类feature_selection.chi2计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest这个可以输入”评分标准“来选出前K个分数最高的特征的类。

          1
          2
          3
          4
          from sklearn.feature_selection import SelectKBest
          from sklearn.feature_selection import chi2
          #假设需要300个特征
          X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)
        • 定义超参数K的值

          • 学习曲线
          • 看p值选择K
            卡方检验的本质是推测两组数据之间的差异,其检验的原假设是”两组数据是相互独立的”。卡方检验返回卡方值和P值两个统计量,其中卡方值很难界定有效的范围,而p值,我们一般使用0.01或0.05作为显著性水平

            • P<=0.05/0.01: 拒绝原假设,接受备择假设
            • p>0.05/0.01 : 接受原假设

              从特征工程的角度,我们希望选取卡方值很大,p值小于0.05的特征,即和标签是相关联的特征。

              1
              2
              3
              4
              chivalue, pvalues_chi = chi2(X_fsvar,y)
              # k取多少?我们想要消除所有p值大于设定值,比如0.05或0.01的特征:
              k_ = chivalue.shape[0] - (pvalues_chi > 0.05).sum()
              X_fschi = SelectKBest(chi2, k=k_).fit_transform(X_fsvar, y)
      2. F检验

        • 是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归(feature_selection.f_regression)也可以做分类(feature_selection.f_classif)。
        • 和卡方检验一样,这两个类需要和类SelectKBest连用.
        • F检验在数据服从正态分布时效果会非常稳定,因此如果使用F检验过滤,我们会先将数据转换成服从正态分布的方式。
        • F检验的本质是寻找两组数据之间的线性关系,其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统计量。和卡方过滤一样,我们希望选取p值小于0.05或0.01的特征,这些特征与标签时显著线性相关的。
          1
          2
          3
          4
          from sklearn.feature_selection import f_classif
          F, pvalues_f = f_classif(X_fsvar,y)
          k_ = F.shape[0] - (pvalues_f > 0.05).sum()
          X_fsF = SelectKBest(f_classif, k=k_).fit_transform(X_fsvar, y)
      3. 互信息法

        • 互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。和F检验相似,它既可以做回归也可以做分类,并且包含两个类feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)。
        • 互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。
          1
          2
          3
          4
          from sklearn.feature_selection import mutual_info_classif as MIC
          result = MIC(X_fsvar,y)
          k_ = result.shape[0] - sum(result <= 0)
          X_fsmic = SelectKBest(MIC, k=k_).fit_transform(X_fsvar, y)
  3. 总结

参数 说明 超参数配置
VarianceThreshold 方差过滤,可输入方差阈值,返回方差大于阈值的新特征矩阵 一般使用0/1筛选,可以画学习曲线
SelectKBest 用来选取K个统计量结果最佳的矩阵,生成符合统计量要求的新特征矩阵 看配合使用的统计量
chi2 卡方验证,专用于分类算法 追求p小于显著性水平的特征
f_classif F检验分类,只能捕捉线性相关,要求数据服从正态分布 追求p小于显著性水平的特征
f_regression F检验回归,只能捕捉线性相关,要求数据服从正态分布 追求p小于显著性水平的特征
mutual_info_classif 互信息分类,可以捕捉任何相关性,不能用于稀疏矩阵 追求互信息大于0的特征
mutual_info_regression 互信息回归,可以捕捉任何相关性,不能用于稀疏矩阵 追求互信息大于0的特征

参考:
Filter过滤法

1…345…10
Angel Teng

Angel Teng

97 posts
14 categories
37 tags
© 2021 Angel Teng
Powered by Hexo
|
Theme — NexT.Muse v5.1.4