数据处理 特征工程

0.数据处理的一般流程

数据获取 –> 数据划分 –> 数据处理 –> 效果评判

1.数据获取

数据来源

  • 企业日益积累的大量数据(互联网公司更为显著)
  • 政府掌握的各种数据
  • 科研机构的实验数据

数据类型

  • 离散型数据

    • 由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。
  • 连续性数据

    • 变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。

通过sk-learn获取数据

  • sklearn数据集获取API

    • sklearn.datasets
  • 小规模数据集的获取

    • datasets.load_*() 获取小规模的数据集, 数据集已经包含在了datasets里
    • 参数subset: train 表示获取训练街, test 表示获取测试集, all 表示两者全部
  • 大规模数据的获取与删除

    • datasets.fetch_*(data_home=None) 从网络上以下载的方式获取大规模的数据集
      • data_hom:表示数据集下载的目录,默认是 ~/scikit_learn_data/
        • subset: train 表示获取训练街, test 表示获取测试集, all 表示两者全部
      • datasets.clear_data_home(data_home=None) 清除目录下的数据集
  • api接口返回值(datasets.base.Bunch 实例)的属性

    • data:特征数据数组,是 [n_samples * n_features] 的二维numpy.ndarray 数组
      • target:目标值数组,是 n_samples 的一维 numpy.ndarray 数组
      • feature_names:特征名,新闻数据,手写数字、回归数据集没有
      • target_names:目标数据名称
      • DESCR:数据描述

2.数据集的划分

数据集常见划分形式

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效

数据划分的原则

  • 将数据集划分为两个互斥的集合,其中一个集合作为训练集,留下的集合作为测试集
  • 划分要尽可能的保持数据分布的一致性(中的数据分布跟是一样的),才能避免因数据划分过程引入额外的偏差而对最终结果产生影响
  • 不同的划分将导致不同的训练/测试集,相应的模型评估也是有差别的,若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果

sklearn数据集划分方法

  • sklearn.model_selection.train_test_split(x, y, **options)
    • x 数据集的特征值
    • y 数据集的标签值
    • test_size 测试集占用比例的大小, 一般是0.8
    • random_state 当设置该值为任意值时, 返回的划分结果相同
    • return (训练集特征值,测试集特征值,训练标签,测试标签)

3.数据处理和特征工程

特征抽象&特征衍生

特征抽象的作用

将计算机不好理解的数据转化为计算机友好的数据形式来体现

举例

1545549182751

特征衍生的作用

将一些数据之间所体现的规律和特征体现出来

举例

连续变量

1545549287303

离散变量

1545549324097

特征抽取

数据抽取的作用
  • 让计算机和模型更好的理解数据的结构,可将数据处理成计算机比较友好的数据结构,比如讲分类问题的数据处理成one-hot编码的数据类型等, 常用与分类问题的特征处理
sk-learn特征抽取api

1.字典特征抽取

  • 使用类: sklearn.feature_extraction.DictVectorizer

  • 常用方法

    • DictVectorizer(sparse=True,…) # 创建dict_vert对象

      • sparse: 是否返回sparse矩阵

      • DictVectorizer.fit_transform(X) # 将X进行特征转化

        • X:字典或者包含字典的迭代器
      • DictVectorizer.inverse_transform(X) # 将X转为为特征转化之前的数据格式

        • X:array数组或者sparse矩阵
      • DictVectorizer.get_feature_names() # 获取特征类别名称

      • DictVectorizer.fit(X) 将X数据进行特征值标准匹配

      • DictVectorizer.transform(X) # 将X按照之前的fit标准进行转化

    • 返回值的数据格式类型one-hot编码

    • 1545545641715

2.文本的特征抽取

  • 英文文本特征抽取

    • 使用类: sklearn.feature_extraction.text.CountVectorizer
  • 常用方法

    • CountVectorizer(max_df=1.0,min_df=1, stop_word) # 创建词频矩阵对象

      • max_df整数:指每个词的所有文档词频数不大于该值
      • min_df小数:每个词的次数/所有文档数量,最小
      • stop_word: 将分词的哪些不需要的结果进行剔除
    • CountVectorizer.fit_transform(X) # 获取特征值矩阵

      • X:文本或者包含文本字符串的可迭代对象
      • 注意: 利用toarray(), 可以将返回值进行sparse矩阵转换array数组
    • CountVectorizer.inverse_transform(X) # 将特征值矩阵转化为之前的数据格式

      • X:array数组或者sparse矩阵
    • CountVectorizer.get_feature_names() # 获取特征值化后的单词列表

    • 中文文本特征抽取

      • 常用方法

        • 使用类:sklearn.feature_extraction.text.TfidfVectorizer

        • TfidfVectorizer(stop_words=None,…) # 创建权重矩阵对象

        • TfidfVectorizer.fit_transform(X) # 返回文本单词的权重sparse矩阵

          • X:文本或者包含文本字符串的可迭代对象
        • TfidfVectorizer.inverse_transform(X)

          • X:array数组或者sparse矩阵 # 将矩阵转换之前数据格式
        • TfidfVectorizer.get_feature_names() # 获取特征抽取后的单词列表

      • 备注: 中文的特征值抽取原理上和英文一样,但是需要先使用分词器对长句子, 进行分词处理

      • 分词器的常用方法

        • pip3 install jieba # 下载jieba分词器

        • import jieba

        • jieba.cut(“python 现在我在进行特征词抽取”) # 对句子进行分词处理

          • 返回: 返回包含分词结果的生成器

        TF-IDF

        • TF_IDF的介绍

          • 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
        • TF-IDF作用

          • 用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
            • 分类机器学习算法的重要依据
        • TF-IDF的计算公式

          • 1545545886259

数据特征生成(生成交叉特征)

为什么生成交叉特征

比如说我们目前有一群二维的输入样本[a,b][a,b], 这个群二维的输入样本去训练模型,发现不管在训练集还是在测试集中的R^2 值都不高。 这时候,我们可以考虑将二维样本空间映射到跟高维度例如:[1,a,b,a2,ab,b2][1,a,b,a2,ab,b2] 或者更高维度。来体现features和features之间的关系。

sklearn的交叉特征生成api
  • poly = PolynomialFeatures(degree = 2, interaction_only = True, include_bias=False)
    • degree:默认为2,多项式次数(就同几元几次方程中的次数一样)
    • interaction_only:是否包含单个自变量自相作用,默认为False,为True则表示去除与自己相乘的情况
    • include_bias:是否包含偏差标识,默认为True,为False则表示不包含偏差项
  • poly.fit_transform(X)

缺失值处理

处理的两种思路
  • 删除: 如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
  • 插补:可以通过缺失值每行或者每列的平均值、中位数来填充
sk-learn缺失值处理api
  • sklearn.preprocessing.Imputer
  • Imputer(missing_values=’NaN’, strategy=’mean’, axis=0)
    • missing_values: 却是值的代替值
    • strategy: 缺失代替值的类型
    • axis: 代表按照列来计算, 1按照行来计算
  • Imputer.fit_transform(X) # 将缺失值进行插补
    • X:numpy array格式的数据[n_samples,n_features]
np.NaN的解释
  • numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
  • 如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数值即可

标准化和归一化处理

归一化处理

通过对原始数据进行变换把数据映射到(默认为[0,1])之间

归一化公式

1545547148732
备注:

  • 作用于每一列,max为一列的最大值,min为一列的最小值,那么X’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0
sklearn归一化API
  • sklearn.preprocessing.MinMaxScaler
  • MinMaxScalar(feature_range=(0,1)…) # 创建归一化对象
    • feature_range:每个特征缩放到给定范围(默认[0,1])
  • MinMaxScalar.fit_transform(X) # 对数据集进行归一化处理
    • X:numpy array格式的数据
    • 返回转换后的形状相同的array
      归一化的弊端
      使用归一化的时候,最大值和最小值非常容易受到异常点的影响, 所以这种只适合于传统精确小的数据场景
标准化处理

通过对原始数据进行变换把数据变换到均值为0,方差为1的正太分布范围内

标准化处理 公式

1545547178739

标准化的优点

如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小, 对标准化的影响较小。

sklearn标准化处理API
  • scikit-learn.preprocessing.StandardScaler
  • StandardScaler() # 创建标准化实例对象
  • StandardScaler.fit_transform(X) # 将Numpy array 格式的数据进行标准化
  • StandardScaler.mean_ # 原始数据中每列特征的平均值
  • StandardScaler.std_ # 原始数据每列特征的方差

特征的筛选和降维

特征值选择的原因
  • 冗余:部分特征的相关度高,容易消耗计算性能
  • 噪声:部分特征对预测结果有负影响
主要应用的方法
  • 1.Filter(过滤式):VarianceThreshold
  • 2.Embedded(嵌入式):正则化、决策树
  • 3.Wrapper(包裹式)
1.低方差特征筛选-sklearn特征选择API
  • sklearn.feature_selection.VarianceThreshold
  • VarianceThreshold(threshold = 0.0) # 创建低方差数据删除对象
    • threshold: 设定方差低于多少进行删除
      • Variance.fit_transform(X) # 对特征数据中方差较低的特征进行删除
      • X:numpy array格式的数据
      • 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
PCA的的作用
  • 特征之间通常是线性相关的,可以进行一些特征合并操作
  • PCA是一种分析、简化数据集的技术, 是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息, 可以削减回归分析或者聚类分析中特征的数量.
PCA 降维 公式

1545546993332

2.特征的降维(PCA)-sklearn api
  • sklearn. decomposition.PCA
  • PCA(n_components=None) # 创建PCA对象
    • n_components: 将数据转化为多少维度的数据, 默认只降低一维
  • PCA.fit_transform(X) # 对特征矩阵进行降维处理
    • X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后指定维度的array

4.特征的效果评判

1545550409982

准确率

  • 计算公式
    • 准确率 = (TP + TN)/(TP + FP + FN + TN)
  • sklearn api
    • from sklearn.metrics import accuracy_score
    • accuracy_score(y_true, y_predict, normalize=False)

精确率

  • 计算公式
    • 精确率 = (TP) / (TP + FP)
  • sklearn api
    • from sklearn.metrics import precision_score
    • precision_score(y_true, y_predict)

召回率

  • 计算公式
    • 召回率 = (TP) / (TP + FN)
  • sklearn api
    • from sklearn.metrics import recall_score
    • recall_score(y_true, y_predict)

F1-score

  • 计算公式
    • $F 1 - socre = 2 * \frac { \text { Precision } _ { - } \text { score*Recall score } } { \text { Precision } _ { - } \text { score } + \text { Recall } \text { score } }$
  • sklearn api
    • from sklearn.metrics import f1_score
    • f1_score(y_true, y_predict)

混淆矩阵

  • 什么是混淆矩阵

混淆矩阵用来表示预测结果的真实反馈,返回的形式是一个矩阵,对角线元素表示预测标签等于真实标签的点的数量,是分类结果的一个绝对量

  • 举个栗子

1545551134429

​ 获得的混淆矩阵为

1545551159947

  • sklearn api

    • from sklearn.metrics import confusion_matrix
    • confusion_matrix(y_true, y_pred)

ROC

  • 计算公式
    • TPR = TP / (TP + FN) 预测为正的样本占所有正样本比例
    • FPR = FP / (FP + TN) 预测为正但是实际为负的样本占所有负样本的比例
  • sklearn api
    • from sklearn.metrics import roc_curve
    • fpr, tpr, thresholds = roc_curve(y_true, y_pred,pos_label=1)
      • thresholds: 样本属于正样本的概率
  • ROC曲线
    • 1545552541093

AUC

  • 计算公式
    • AUC是ROC曲线下方的面积,通常AUC值在0.5-1.0之间,值越大模型效果越好
    • AUC 为 0.5 跟随机猜测一样(例:丢硬币),模型没有预测价值
  • sklearn api
    • from sklearn.metrics import auc
    • roc_auc = auc(fpr, tpr)

KS

  • 计算公式
    • ks = max(TPR – FPR)

5.模型的选择与调优

交叉验证

  • 交叉验证的作用

    • 为了让被评估的模型更加准确可信
  • 交叉验证的过程

    • 将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。

    • 1545554725566

网格搜索

  • 通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
  • 交叉验证通常是为了配合网格搜索, 通过网格似的参数对比, 交叉验证出最优参数, 以此来优化模型的参数选择
  • 1545554711552

交叉验证-网格搜索api

  • sklearn.model_selection.GridSearchCV
  • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
    • estimator:估计器对象
    • param_grid:估计器参数 dict类型, key为超参数, value为将要进行网格搜索的参数 {“n_neighbors”:[1,3,5]}
    • cv:指定几折交叉验证
    • fit:输入训练数据
    • score:准确率评估集合,返回多组的训练准确率结果
  • 返回结果分析:
    • best_score_:在交叉验证中验证的最好结果
    • best_estimator_:最好的参数模型
    • cv_results_:每次交叉验证后的测试集准确率结果和训练集准确率结果
刘小恺(Kyle) wechat
如有疑问可联系博主