数据预处理要点总结

  • 1. 为什么要数据预处理
  • 2. 数据中存在缺失值
    • 2.1 查看数据的完整性(missingno)
    • 2.2 简单删除法
    • 2.3 人工填写(filling manually)
    • 2.4 KNN填补法
  • 3. 异常值处理
  • 4. 连续属性离散化
  • 5. 特征重要性筛选
  • 6. 数据平衡
  • 遇到的问题
    • 1 安装 fancyimpute 过程中,问题 error: Microsoft Visual C++ 14.0 is required

1. 为什么要数据预处理

在现实背景中,我们的数据集往往存在各种各样的问题,如果不对数据进行预处理,模型的训练就无法开始。而且机器学习中大约70%的时间都要花在数据预处理上。

2. 数据中存在缺失值

2.1 查看数据的完整性(missingno)

missingno 安装 :

pip install missingno

missingno提供了一个灵活且易于使用的缺失数据可视化和实用程序的小工具集,使您可以快速直观地总结数据集的完整性.

import matplotlib.pyplot as plt
import pandas as pd
import missingno as msno
def missingDataStat(data):total = data.isnull().sum().sort_values(ascending=False)percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending=False)missing_data = pd.concat([total, percent], axis=1, keys=['Total','Percent'])t = missing_data.head(20)print(t)msno.matrix(data)plt.show()print(total)if __name__ == '__main__':url = r".\data\iris.csv"names = ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)', 'class']data = pd.read_csv(url, names=names)missingDataStat(data)
                   Total   Percent
petal width (cm)       3  0.020000
petal length (cm)      3  0.020000
class                  1  0.006667
sepal width (cm)       0  0.000000
sepal length (cm)      0  0.000000

2.2 简单删除法

这种方法简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与信息表中的数据量相比非常小的情况下是非常有效的。然而,这种方法却有很大的局限性。它是以减少历史数据来换取信息的完备,会造成资源的大量浪费,丢弃了大量隐藏在这些对象中的信息.

直接用Padas 的方法dropna() 删掉有缺失的值的行

data = data.dropna()

2.3 人工填写(filling manually)

由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果最好的一种。然而一般来说,该方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。

2.4 KNN填补法

如果你的数据里有许多缺失值,但是这些值相对多一些,不能直接删掉,那么就可以用KNN填补法, 通过计算找到临近的3条记录,通过投票选出其中最多的类别用以填充缺失的值,

from fancyimpute import KNN
def missingData(data):return KNN(k=3).fit_transform(data)

3. 异常值处理

通过箱型图检查样本数据中异常数据,可以发现鸢尾花中Sepal-width者一列中有一些异常值,
对于这些异常点可以选择修复或者删掉。不然会影响模型的输出
不懂箱型图 的可以看这个连接查看

ΔQ = Q3 -Q1
最大值区间: Q3+1.5ΔQ
最小值区间: Q1-1.5ΔQ
中位数(Med–也就是Q2)

def noiseDataHandle(data):print(data.describe())data.plot.box()plt.show()

4. 连续属性离散化

(1) 等宽算法
根据用户指定的区间数目KK,将属性的值域[Xmin−Xmax][X_{min}−X_{max}][Xmin​−Xmax​]划分成KK个区间,并使每个区间的宽度相等,即都等于Xmin−XmaxK\frac{X_{min}−X_{max}}{K}KXmin​−Xmax​​。缺点是容易受离群点的影响而使性能不佳。
(2) 等频算法
等频算法也是根据用户自定义的区间数目,将属性的值域划分成K个小区间。他要求落在每个区间的对象数目相等。譬如,属性的取值区间内共有M个点,则等频区间所划分的K个小区域内,每个区域含有MK\frac{M}{K}KM​个点。
(3) K-means聚类算法
首先由用户指定离散化产生的区间数目K,K-均值算法首先从数据集中随机找出K个数据作为K个初始区间的重心;然后,根据这些重心的欧式距离,对所有的对象聚类:如果数据x距重心GiG_iGi​最近,则将x划归GiG_iGi​所代表的那个区间;然后重新计算各区间的重心,并利用新的重心重新聚类所有样本。逐步循环,直到所有区间的重心不再随算法循环而改变为止。

等宽算法 来离散化年龄的例子

import numpy as np
import pandas as pd
ages = np.array([1,5,10,40,36,12,58,62,77,100]) #年龄数据
data = pd.DataFrame(ages, columns=['age'])
r6 =  pd.cut(data['age'], 5, labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
print(r6)
0    婴儿
1    婴儿
2    婴儿
3    青年
4    青年
5    婴儿
6    中年
7    壮年
8    壮年
9    老年

K-means聚类来离散话的例子

def coopLvIDiscretization(data, fieldName, newFieldName, k ):fieldData = data[fieldName].copy()#K-mean算法(K为离散化后簇的数量)kmodel = KMeans(n_clusters=k)kmodel.fit(fieldData.values.reshape((len(fieldData),1)))print(kmodel.cluster_centers_)kCenter =pd.DataFrame(kmodel.cluster_centers_, columns=list('a'))kCenter = kCenter.sort_values(by = 'a')#确定分类边界rolled = kCenter.rolling(2)#kBorder = kCenter.rolling(2).mean().iloc[1:]print(rolled)print(rolled.mean())kBorder = rolled.mean().iloc[1:]kBorder = [0] + list(kBorder.values[:, 0]) + [fieldData.max()]#切分数据, 实现离散化newFeildData = pd.cut(fieldData, kBorder, labels=range(k))#合并添加新列data = pd.concat([data, newFeildData.rename(newFieldName)], axis=1)return data

5. 特征重要性筛选

安装xgboost

pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple

特征重要性筛选就是剔除与结果没有影响或影响不大的特征, 有助于提高瞒报预测模型的构建速度,增强模型的泛化能力,并提升对特征与特征值之间的理解

下面是用的是鸢尾花数据集, 查看每个特征的重要性,我们发现petal-length属性最重要

from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import  pyplotdef featureSelection(data):X = data[['sepal-length', 'sepal-width', 'petal-length', 'petal-width']]y = data['class']xgboost  = XGBClassifier()xgboost.fit(X, y)print(xgboost.feature_importances_)# 变量重要性可视化pyplot.bar(range(len(xgboost.feature_importances_)), xgboost.feature_importances_)pyplot.show()# 变量重要性排序可视化plot_importance(xgboost)pyplot.show()if __name__ == '__main__':url = r"C:\Users\harry\PycharmProjects\helloworld\ML\pre_process\data\iris2.csv"names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']data = pd.read_csv(url, names=names, dtype=float)featureSelection(data)
[0.00751511 0.01210508 0.8186488  0.16173099]


6. 数据平衡

如果你的每一类的样本数的不平衡,那么你训练出来的模型也是有问题。下面就是一种采用SMOTE算法去平衡你的样本数目,
我把鸢尾花数据集故意去掉一部分样本

安装imblearn

pip install imblearn -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
from imblearn.combine import SMOTEENN
def smoteData(data):A, A2, B, B2 = train_test_split(data[['sepal-length', 'sepal-width', 'petal-length', 'petal-width']], data[['class']], test_size=0.3)X = A.valuesy =B.valuesprint(X.shape)#数据平衡(训练集)over_sample = SMOTEENN()X, y = over_sample.fit_sample(X, y)train = pd.DataFrame(np.hstack((X,y.reshape(-1, 1))), columns= data.columns)test = pd.concat([A2, B2], axis=1)print(train.shape)return  [train, test]if __name__ == '__main__':url = r"C:\Users\harry\PycharmProjects\helloworld\ML\pre_process\data\iris2.csv"names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']data = pd.read_csv(url, names=names, dtype=float)smoteData(data)
(89, 4)
(98, 5)

遇到的问题

1 安装 fancyimpute 过程中,问题 error: Microsoft Visual C++ 14.0 is required

error: Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Studio”: https://visualstudio.microsoft.com/downloads/
ERROR: Could not build wheels for cvxpy which use PEP 517 and cannot be installed directly

这问题折腾了好久,网上好多人都说要装一堆whl包, 但是我的装了也不行。最总解决方法, 直接安装Microsoft visual c++ 14.0,Microsoft Visual C++ Build Tools 2015

[机器学习-sklearn]数据预处理要点总结相关推荐

  1. 机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)

    机器学习之数据预处理--数据清洗缺失值.异常值和重复值的处理 基础知识 技术点总结 数据列缺失的处理方法 1.丢弃(缺失值处理) 1.生成一份随机数据 2.查看哪些值缺失 3.获得含有NA的列 4.获 ...

  2. 机器学习之数据预处理——特征编码(标签编码,独热编码)

    机器学习之数据预处理--特征编码 数据预处理--特征编码 离散数据的编码 标签编码 sklearn LabelEncoder(使用fit_transform函数) sklearn LabelEncod ...

  3. 机器学习PAL数据预处理

    机器学习PAL数据预处理 本文介绍如何对原始数据进行数据预处理,得到模型训练集和模型预测集. 前提条件 完成数据准备,详情请参见准备数据. 操作步骤 登录PAI控制台. 在左侧导航栏,选择模型开发和训 ...

  4. 机器学习之数据预处理——归一化,标准化

    机器学习之数据预处理--归一化,标准化 基础知识 1.什么是特征预处理 2.预处理方法 : 3.预处理API: 数据的标准化(normalization)和归一化 数据的标准化 数据归一化 1 把数变 ...

  5. sklearn机器学习之数据预处理(Preprocessing Impute)

      在之前的机器学习中,我们使用的数据集都是sklearn自带的数据集以及非常经典的泰坦尼克号数据集,这些数据集都是一些经过处理被验证为对机器学习很友好的数据集,而现实生活中我们往往数据集并不是那么友 ...

  6. 机器学习之数据预处理

    在sklearn之数据分析中总结了数据分析常用方法,接下来对数据预处理进行总结 当我们拿到数据集后一般需要进行以下步骤: (1)明确有数据集有多少特征,哪些是连续的,哪些是类别的 (2)检查有没有缺失 ...

  7. 负数如何归一化处理_机器学习之数据预处理

    第一节:前言 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.由此可见,特征工程在机器学习中占有相当重要的地位. 特征工程:利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能 ...

  8. 机器学习中数据预处理——标准化/归一化方法(scaler)

    由于工作问题比较忙,有两周没有总结一下工作学习中遇到的问题. 这篇主要是关于机器学习中的数据预处理的scaler变化. 工作中遇到的问题是:流量预测问题,拿到的数据差距非常大,凌晨的通话流量很少几乎为 ...

  9. Scikit-learn学习系列 | 2. sklearn数据预处理的相关方法

    如有错误,恳请指出. 以下内容整理自专栏:博主"文火冰糖的硅基工坊"的专栏--机器学习与scikit-learn,对部分的文章的简化与整理. 文章目录 1. 数据预处理介绍 2. ...

最新文章

  1. 编码之路,与君共勉。
  2. 每天一个linux命令(28):tar命令
  3. leetcode - Same Tree
  4. Win7无法远程桌面
  5. 【体验】感谢热心网友送的3D打印结构外壳,nodemcu外壳,3D打印wifi外壳
  6. SCSI 总线和协议
  7. [javaSE] 集合工具类(Collections-sort)
  8. NOIp 2014 #5 解方程 Label:数论?
  9. java智能社下载_08 深入javascript
  10. excel计算式自动计算_全套Excel版工程自动计算表格+实用小工具,高效工作不加班...
  11. Tidal生活方式丨解忧、故事与爱好:我是知乎用户,也是知乎答主
  12. 搭建hexo个人网站小试
  13. wifi快速漫游实例分析
  14. 购买服务器需要注意哪些问题
  15. C# ——web网站发布服务器
  16. sql执行顺序及性能优化
  17. 编写一个函数,计算两个数字的和,差,积,商
  18. c语言fp函数,FP_INFINITE
  19. LeetCode 2035. 将数组分成两个数组并最小化数组和的差
  20. 微信小程序报错{errMsg:hideLoading:fail:toast can't be found}

热门文章

  1. (转)Java线程:新特征-线程池
  2. 通过Intel XDK编写跨平台app(一)
  3. shell 脚本编程的10 个最佳实践
  4. 路径获取文件名通用方法
  5. HDFS客户端的权限错误:Permission denied
  6. Serverless 实战 —— ​​​​​​​与微服务一脉相承,Serverless适用何种场景?会带来哪些冲击?
  7. c语言两个线程交替打印奇数和偶数,经典面试题——两个线程交替打印奇数和偶数...
  8. java官网门户源码 SSM框架 自适应-响应式 freemarker 静态模版引擎
  9. 【Python】Python第三方库安装
  10. 【Python】BMI指数 计算器