数据预处理

最近,由于每次在kaggle做比赛时,都是主要参考别人的Kernel来做,对整个数据分析的处理过程缺失整体的思路和理解,在这里借助Home Credit Default Risk Competition这个比赛对整个过程进行整理,这里参考了Start Here: A Gentle Introduction

 

特征工程

https://www.zhihu.com/search?type=content&q=%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B这篇文章详细介绍特征工程。

  1. 数据

在kaggle比赛中常常有很多不同的csv文件,对于主文件和预测变量要有一定的认识。

  1. 评判指标

在这个数据比赛中,是一个分类问题,指标是Metric: ROC AUC,这个指标在数据样本不平衡时十分常见。

  1. 数据预处理

eda的介绍,Exploratory Data Analysis (EDA) is an open-ended process where we calculate statistics and make figures to find trends, anomalies, patterns, or relationships within the data. The goal of EDA is to learn what our data can tell us. It generally starts out with a high level overview, then narrows in to specific areas as we find intriguing areas of the data. The findings may be interesting in their own right, or they can be used to inform our modeling choices, such as by helping us decide which features to use。

3.1 查看预测变量的样本分布,发现是一个不平衡的数据,这在现实中也是经常遇见的,对于不平衡的数据分布,处理办法也有很多,链接:

https://blog.csdn.net/heyongluoyao8/article/details/49408131

其中有种boosting的方法在机器学习中是很常见的概念,随机森林就是类似,给予不同树不同权重。

机器学习类别不平衡处理之欠采样(undersampling) ,类别不平衡就是指分类任务中不同类别的训练样例数目差别很大的情况

常用的做法有三种,分别是1.欠采样, 2.过采样, 3.阈值移动

欠采样,即去除一些反例使得正、反例数目接近,然后再进行学习

https://www.cnblogs.com/bjwu/p/9073937.html

3.2缺失值的处理

对于每列数据,查看缺失数据量的多少,检查缺失率,对于缺失率高于阈值的变量可考虑进行删除,阈值有人为决定。

对于缺失值的处理,知乎上有篇文章说的不错:

https://www.zhihu.com/question/26639110

1一般来说,缺失率达到90%的数据我们会直接删除。

2.当面对缺失数据较多的时候,如果对删除该变量存疑的话,可以考虑新建一个变量,该变量缺失为NO,不缺失为YES。

3.最常用的方法就是均值,中位数进行填充,不过这种方式并不一定合适,应为实际情况可能与填充差异较大,相当于人为添加了噪声。

4.利用上下数据,插值法填充:这种方法更适合时间序列数据。

  1. 利用算法进行拟合然后填充:这个方法的难度在于解释变量的寻找,在高位数据中,到底哪些变量才是适合用来做缺失数据的解释变量。

 

3.2分类变量转化成数值变量

一般对二元分类变量的处理,就是利用labelencoder将他变成0-1变量,至于谁取1并么有太大影响。

或者自定义:例如

data.gender.value_counts()

M    24665
W    12585
Name: gender, dtype: int64

 

maplist={'M':1,'W':0}
data.gender.map(maplist)

对于多分类变量,我们可以用one-hot编码,虽然数据的维度变高了,但是通过这样,原始的信息没有丢失,同时其中的缺失变量在新变量中全部为0.。

3.3 对于回归问题而言:对于有明显左偏或者右偏,我们会一般进行对数化处理。

进一步的特征处理需要专业知识了,需要对整个问题有一个清晰的认识,构造新的变量,删除旧的变量。

详细来说:

接下里对特征这块借用他人的观点:

 

此图出自

https://www.zhihu.com/search?type=content&q=%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B

在数据竞赛中,一般所给的数据都非常的详尽,第一个要求尽可能的找到多的可能与被解释变量相关的特征对我们来说并不是问题。

链接:https://www.zhihu.com/question/29316149/answer/110159647

2 数据预处理

  通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:

不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。

信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。

定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。通常使用哑编码的方式将定性特征转换为定量特征:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。

存在缺失值:缺失值需要补充。

信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。

2.1 无量纲化

  无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。

2.1.1 标准化

  标准化需要计算特征的均值和标准差,公式表达为:

  使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:

from sklearn.preprocessing import StandardScaler

#标准化,返回值为标准化后的数据

StandardScaler().fit_transform(iris.data)

2.1.2 区间缩放法

  区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:

  使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:

from sklearn.preprocessing import MinMaxScaler

#区间缩放,返回值为缩放到[0, 1]区间的数据

MinMaxScaler().fit_transform(iris.data)

2.1.3 标准化与归一化的区别

  简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:

  使用preproccessing库的Normalizer类对数据进行归一化的代码如下:

from sklearn.preprocessing import Normalizer

#归一化,返回值为归一化后的数据

Normalizer().fit_transform(iris.data)

2.2 对定量特征二值化

  定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:

  使用preproccessing库的Binarizer类对数据进行二值化的代码如下:

from sklearn.preprocessing import Binarizer

#二值化,阈值设置为3,返回值为二值化后的数据

Binarizer(threshold=3).fit_transform(iris.data)

2.3 对定性特征哑编码

  由于IRIS数据集的特征皆为定量特征,故使用其目标值进行哑编码(实际上是不需要的)。使用preproccessing库的OneHotEncoder类对数据进行哑编码的代码如下:

from sklearn.preprocessing import OneHotEncoder

 

#哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据

OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

高数量类别特征(high-cardinality categorical attributes)的预处理方法

http://www.cnblogs.com/bjwu/p/9087071.html

high-cardinality categorical attributes,从字面上理解,即对于某个category特征,不同值的数量非常多,这里暂且把它叫做高数量类别属性。反之,即低数量类别属性(low-cardinality)

对于低数量类别属性,通常在data science中采用的方式是将其转化为one-hot编码,即给每一个类别增加一个特征。但是当类别数量增加的时候,ont-hot编码增加的特征也在增加。所以,one-hot编码无法适用于高数量特征属性

2.4 缺失值计算

  由于IRIS数据集没有缺失值,故对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失。使用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:

from numpy import vstack, array, nan

from sklearn.preprocessing import Imputer

Imputer 介绍:

https://blog.csdn.net/kancy110/article/details/75041923

 

#缺失值计算,返回值为计算缺失值后的数据

#参数missing_value为缺失值的表示形式,默认为NaN

#参数strategy为缺失值填充方式,默认为mean(均值)

Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

 

2.5 数据变换

  常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。4个特征,度为2的多项式转换公式如下:

 

  使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:

from sklearn.preprocessing import PolynomialFeatures

 

  1. ## 导入库
  2. import pandas as pd
  3. import numpy as np
  4. ## 读取数据
  5. dataset = pd.read_excel("/labcenter/python/dataset2.xlsx")
  6.  
  7. ## 简单函数变换
  8. dataset['new_col2'] = np.log10(dataset['col2'])      #10为底的对数
  9. dataset['new_col2'] = np.exp(dataset['col2'],2)      #取平方
  10. dataset['new_col2'] = np.exp(dataset['col2'])        #e为的底的指数
  11. dataset['new_col2'] = 1 / dataset['col2']            #取倒数
  12. dataset['new_col2'] = np.sqrt(dataset['col2'])       #开方
  13. dataset['new_col2'] = np.sin(dataset['col2'])        #取正弦

 

来自数据预处理:https://blog.csdn.net/kkfd1002/article/details/80287999

#多项式转换

#参数degree为度,默认值为2

PolynomialFeatures().fit_transform(iris.data)

  基于单变元函数的数据变换可以使用一个统一的方式完成,使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:

from numpy import log1p

from sklearn.preprocessing import FunctionTransformer

 

#自定义转换函数为对数函数的数据变换

#第一个参数是单变元函数

FunctionTransformer(log1p).fit_transform(iris.data)

 

3 特征选择

链接:https://blog.csdn.net/newmarui/article/details/52119869

https://blog.csdn.net/ae5555/article/details/49534263

https://blog.csdn.net/mmc2015/article/details/47333579

http://scikit-learn.org/stable/modules/feature_selection.html#feature-selection

  当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:

特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。

特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

  根据特征选择的形式又可以将特征选择方法分为3种:

Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

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

Embedded:集成法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

  我们使用sklearn中的feature_selection库来进行特征选择。

3.1 Filter

3.1.1 方差选择法

  使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:

from sklearn.feature_selection import VarianceThreshold

 

#方差选择法,返回值为特征选择后的数据

#参数threshold为方差的阈值

VarianceThreshold(threshold=3).fit_transform(iris.data)

3.1.2 相关系数法

  使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest

from scipy.stats import pearsonr

 

#选择K个最好的特征,返回选择特征后的数据

#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数

#参数k为选择的特征个数

SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

3.1.3 卡方检验

  经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

 

  不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest

from sklearn.feature_selection import chi2

 

#选择K个最好的特征,返回选择特征后的数据

SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

3.1.4 互信息法

  经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:

 

  为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:

 from sklearn.feature_selection import SelectKBest

 from minepy import MINE

 

 #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5

 def mic(x, y):

     m = MINE()

     m.compute_score(x, y)

     return (m.mic(), 0.5)

 

#选择K个最好的特征,返回特征选择后的数据

SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

3.2 Wrapper

3.2.1 递归特征消除法

  递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

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)

3.3 Embedded

3.3.1 基于惩罚项的特征选择法

  使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel

from sklearn.linear_model import LogisticRegression

 

#带L1惩罚项的逻辑回归作为基模型的特征选择

SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

  实际上,L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型:

from sklearn.linear_model import LogisticRegression

 

class LR(LogisticRegression):

    def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0,

                 fit_intercept=True, intercept_scaling=1, class_weight=None,

                 random_state=None, solver='liblinear', max_iter=100,

                 multi_class='ovr', verbose=0, warm_start=False, n_jobs=1):

 

        #权值相近的阈值

        self.threshold = threshold

        LogisticRegression.__init__(self, penalty='l1', dual=dual, tol=tol, C=C,

                 fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight=class_weight,

                 random_state=random_state, solver=solver, max_iter=max_iter,

                 multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)

        #使用同样的参数创建L2逻辑回归

        self.l2 = LogisticRegression(penalty='l2', dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)

 

    def fit(self, X, y, sample_weight=None):

        #训练L1逻辑回归

        super(LR, self).fit(X, y, sample_weight=sample_weight)

        self.coef_old_ = self.coef_.copy()

        #训练L2逻辑回归

        self.l2.fit(X, y, sample_weight=sample_weight)

 

        cntOfRow, cntOfCol = self.coef_.shape

        #权值系数矩阵的行数对应目标值的种类数目

        for i in range(cntOfRow):

            for j in range(cntOfCol):

                coef = self.coef_[i][j]

                #L1逻辑回归的权值系数不为0

                if coef != 0:

                    idx = [j]

                    #对应在L2逻辑回归中的权值系数

                    coef1 = self.l2.coef_[i][j]

                    for k in range(cntOfCol):

                        coef2 = self.l2.coef_[i][k]

                        #在L2逻辑回归中,权值系数之差小于设定的阈值,且在L1中对应的权值为0

                        if abs(coef1-coef2) < self.threshold and j != k and self.coef_[i][k] == 0:

                            idx.append(k)

                    #计算这一类特征的权值系数均值

                    mean = coef / len(idx)

                    self.coef_[i][idx] = mean

        return self

  使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel

 

#带L1和L2惩罚项的逻辑回归作为基模型的特征选择

#参数threshold为权值系数之差的阈值

SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)

3.3.2 基于树模型的特征选择法

  树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel

from sklearn.ensemble import GradientBoostingClassifier

 

#GBDT作为基模型的特征选择

SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

 

4 降维

  当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

4.1 主成分分析法(PCA)

  使用decomposition库的PCA类选择特征的代码如下:

from sklearn.decomposition import PCA

 

#主成分分析法,返回降维后的数据

#参数n_components为主成分数目

PCA(n_components=2).fit_transform(iris.data)

4.2 线性判别分析法(LDA)

  使用lda库的LDA类选择特征的代码如下:

from sklearn.lda import LDA

 

#线性判别分析法,返回降维后的数据

#参数n_components为降维后的维数

LDA(n_components=2).fit_transform(iris.data, iris.target)

 

这里顺便添加一下特征处理的原因:

链接:https://www.zhihu.com/question/22012482/answer/21357107

To transform or not to transform? That is the question!

总的说来,对数变换是数据变换的一种常用方式,数据变换的目的在于使数据的呈现方式接近我们所希望的前提假设,从而更好的进行统计推断。但需要注意的是,数据是离散变量时进行对数变换要额外小心!

当然,我们可以追问的更多:

  1. (Why)为什么需要做数据变换?
  • 从直观上讲,是为了更便捷的发现数据之间的关系(可以理解为更好的数据可视化)。举个栗子,下图的左图是各国人均GDP和城市人口数量的关系,可以发现人均GDP是严重左偏的,并且可以预知在回归方程中存在明显的异方差性,但如果对GDP进行对数变换后,可以发现较明显的线性关系。为什么呢?因为我们度量相关性时使用的Pearson相关系数检验的是变量间的线性关系,只有两变量服从不相关的二元正态分布时,Pearson相关系数才会服从标准的t-分布,但如果变量间的关系是非线性的,则两个不独立的变量之间的Pearson相关系数也可以为0.

  • 所以,数据变换后可以更便捷的进行统计推断(t检验、ANOVA或者线性回归分析)。例如通常构造估计量的置信区间时是使用样本均值加减两倍标准差的方式,而这就要求样本均值的分布是渐近正态分布,如果数据呈现出明显的偏度,则此时使用上述统计推断方式就是不适用的;另外,最经典的例子就是回归分析中的异方差性,误差项的方差随着自变量的变化而变化,如果直接进行回归估计残差的方差会随着自变量的变化而变化,如果对变量进行适当变换,此时残差服从同一个正态分布。

2. (Why)为什么可以做数据变换?

  • 这个问题很难,每当做数据变换时,禁不住会想这样原始的数据信息是否经过变换后存在损失?数据变换有没有标准程序原始数据的统计推断又该怎么进行?我也没有完全理清思路,但想通过几个例子抛砖引玉。
  • 先从理论情形下去考虑,例子1,如果一个数是连续的,并且服从对数正态分布ln(X)\sim N(\mu,\sigma^{2}),可以很容易知道X的概率密度函数(PDF)f_{X}(x)=\frac{1}{x\sqrt{2\pi}\sigma} e^{-\frac{(lnx-\mu)^2}{2\sigma^{2}} },这样E(X)=e^{\mu+\frac{\sigma^{2}}{2}}Var(X)=\left( e^{\sigma{2}-1}  \right)e^{2\mu+\sigma^2},此时可以看到已知变换后的数据的统计特征可以反过来推导出原始数据的统计特征,不存在数据信息的损失(可以看到对数转换后变量的均值可以直接由样本数据的均值得到,但不进行变化却需要由样本均值方差两方面去推断得到);例子2,如果一个数是离散的,服从负二项分布,概率质量函数(PMF)可以写成f\left( k:\theta,p\right)=C_{\theta-1}^{k+\theta-1} \left( 1-p \right)^\theta p^k,如果对这个变量进行对数变换后,情形又会怎样呢?此时,E\left( k \right) =\frac{p^{\theta}}{1-p}Var\left( k \right)=\frac{p^\theta}{(1-p)^2},假设数据的生成过程服从负二项分布,并且在不同的\theta=0.5,1,2,5,10,100下模拟生成数据,再用不同的方式去估计\tilde{\mu}=Y,可以设计评价指标B=\frac{1}{S}\Sigma_{\left(s\right)} \tilde{\mu} -\mu,可以看到不同的数据变换方式下的估计精度是不同的。可以看到,如果假设数据服从负二项分布,估计的误差很小,如果假设数据对数变换后服从正态分布时会出现较大误差(由于离散分布时数据可以取0,此时对数变换需要用ln\left( x+k \right)的形式,可以发现k取值并非随意),如果假设数据根号变换后服从正态分布时的误差要小于对数变换。所以,从一个小的随机模拟实验可以看出,数据的变换方式并非随意,并且对数变换也不一定是最好的变换,尤其是离散数据情况下(详见"Do not log-transform count data").

  • 但上述仅仅是在理论前提下数据变换的讨论,但实际应用中呢?理论前提下,即使再复杂总能找到处理的办法,但应用问题却没有标准答案。在我看来,数据变换方法的使用更是一门艺术(先验知识+经验+运气),需要结合应用领域的专门知识。例如,在宏观计量中,许多不平稳的经济数据要进行时间序列建模,就需要进行差分变换或者去除趋势,按照经济增长理论,经济数据应该存在趋势,那对数据应该进行去除趋势变换,但后来实证发现数据进行差分变换后的ACF/PACF图更符合模型的假设,这就要求建模时使用差分变换而非去除趋势变换(从理论上可以证明一个非平稳的变量如果错误进行变换仍然是非平稳的),所以这就存在困惑(貌似说的有点远……)。

 

5 总结

  再让我们回归一下本文开始的特征工程的思维导图,我们可以使用sklearn完成几乎所有特征处理的工作,而且不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。这些难道都是巧合吗?还是故意设计成这样?方法fit_transform中有fit这一单词,它和训练模型的fit方法有关联吗?接下来,我将在《使用sklearn优雅地进行数据挖掘》中阐述其中的奥妙!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值