一.数据预处理和运用
1.1数据科学家在机器学习的工作统计
1.2 数据清理
大部分的机器学习模型所处理的都是特征,特征通常是输入变量所对应的可用于模型的数值表示。 大部分情况下,收集得到的数据需要经过预处理后才能够为算法所使用,预处理的操作主要包括以下几个部分:
数据过滤
处理数据缺失
处理可能的异常、错误或者异常值
合并多个数据源数据
数据汇总
1.3 脏数据
真实的数据中通常会出现一些数据质量问题:
- 不完整:数据中缺少属性或者包含一些确实的值
- 多噪音:数据包含错误的记录或者异常点
- 不一致:数据中存在矛盾的、有差异的记录
1.4 数据的转换
对数据进行初步的预处理后,需要将其转换为一种适合机器学习模型的表示形式,以下是一些常见的数据转化的形式。
-
在分类问题中,将类别数据编码成为对应的数值表示(哑编码)
-
数值数据转换为类别数据以减少变量的值(对年龄分段)
-
其他数据
-
从文本数据中提取有用的数据(一般使用词袋法、TF-DF或者word2vec)
-
理图像数据(颜色空间,灰度化,几何变化,haar特征等,图像增强
-
-
特征工程
-
对特延进行归一化、标准化,以保证同一模型的不同输入变量的值域柏同
-
特征扩充:对现有变量进行组合或转换以生成新特征,比如平均数
-
1.5 数据错误的不可避免性
-
数据输入和获得过程数据错误
-
数据集成所表现出来的错误
-
数据传输过程所引入的错误
-
据统计有错误的数据占总数据的5%左右
1.7 数据预处理的形式
1.数据清理
- 补充缺失数据、平滑噪声数据、识别或删除离群点,解决不一致
2.数据集成
- 集成多个数据库、数据立方(DataCube)或文件
3.数据变换
- 规范化和聚集
4.数据归约
- 简化数据、但产生同样或相似的结果
1.8度量数据的中心趋势
1.代数度量一可以通过应用一个代数函数于一个或多个分布度量计算的度量。
- mean()、中列数
- 中位数、众数
2.整体度量
- 必须对整个数据集计算的度量。
- 中位数、众数
二.基本描述数据汇总的图像表示
2.1 分位数图
1.例子使用鸢尾花数据集:事先准备引用
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
2.采用鸢尾花的1类和2类采用特征1,并且进行排序操作
kid1 =np.sort(X[:50,0])
kid2 = np.sort(X[50:100,0])
3.使用分位数图第一个点和最后一个点的连线:
plt.scatter(kid1,kid2)
plt.plot([kid1[0],kid1[-1]],[kid2[0],kid2[-1]])
4.分位数(x轴的四分位,y轴的四分位)
plt.scatter([np.quantile(kid1,0.25),np.quantile(kid1,0.5),np.quantile(kid1,0.75)],[np.quantile(kid2,0.25),np.quantile(kid2,0.5),np.quantile(kid2,0.75)] ,color="red")
plt.show()
5.结果发现特点并不明显
6.采用循环,观察四个图的特点:
for i in range(4):
plt.subplot(2, 2, i + 1)
kid1 = np.sort(X[:50, i])
kid2 = np.sort(X[100:, i])
plt.scatter(kid1, kid2)
plt.plot([kid1[0], kid1[-1]], [kid2[0], kid2[-1]]) # 第一个点和最后一个点的连线
# 分位数(x轴的四分位,y轴的四分位)
plt.scatter([np.quantile(kid1, 0.25), np.quantile(kid1, 0.5), np.quantile(kid1, 0.75)],
[np.quantile(kid2, 0.25), np.quantile(kid2, 0.5), np.quantile(kid2, 0.75)], color="red")
plt.show()
排序之后的四分位图:
for i in range(4):
x_sorted=np.sort(x[:,i])
plt.scatter([i for i in range(x.shape[0])],x_sorted)
plt.plot([0,x.shape[0]-1],[x_sorted[0],x_sorted[x.shape[0]-1]])
plt.scatter([round(x.shape[0]/4),round(x.shape[0]/2),round(x.shape[0]*3/4)],
[np.quantile(x_sorted,0.25),np.quantile(x_sorted,0.5),np.quantile(x_sorted,0.75)],color="red")
运行效果如下:
2.2 直方图
参数:
x: 作直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;必选参数; bins: 直方图的柱数,即要分的组数,默认为10; range:元组(tuple)或None;剔除较大和较小的离群值,给出全局范围;如果为None,则默认为(x.min(), x.max());即x轴的范围; density:布尔值。如果为true,则返回的元组的第一个参数n将为频率而非默认的频数; weights:与x形状相同的权重数组;将x中的每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图; cumulative:布尔值;如果为True,则计算累计频数;如果normed或density取值为True,则计算累计频率; bottom:数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下便宜距离; histtype:{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’};'bar’是传统的条形直方图;'barstacked’是堆叠的条形直方图;'step’是未填充的条形直方图,只有外边框;‘stepfilled’是有填充的直方图;当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起; align:{‘left’, ‘mid’, ‘right’};‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的中心位于bins的右边缘; orientation:{‘horizontal’, ‘vertical’}:如果取值为horizontal,则条形图将以y轴为基线,水平排列;简单理解为类似bar()转换成barh(),旋转90°; rwidth:标量值或None。柱子的宽度占bins宽的比例; log:布尔值。如果取值为True,则坐标轴的刻度为对数刻度;如果log为True且x是一维数组,则计数为0的取值将被剔除,仅返回非空的(frequency, bins, patches); color:具体颜色,数组(元素为颜色)或None。 label:字符串(序列)或None;有多个数据集时,用label参数做标注区分; stacked:布尔值。如果取值为True,则输出的图为多个数据集堆叠累计的结果;如果取值为False且histtype=‘bar’或’step’,则多个数据集的柱子并排排列; normed: 是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数; edgecolor: 直方图边框颜色; alpha: 透明度;
返回值(用参数接收返回值,便于设置数据标签): n:直方图向量,即每个分组下的统计值,是否归一化由参数normed设定。当normed取默认值时,n即为直方图各组内元素的数量(各组频数); bins: 返回各个bin的区间范围; patches:返回每个bin里面包含的数据,是一个list。
1.直方图还是使用鸢尾花的数据集:
x=X[:50,0]
plt.hist(x,edgecolor="k")
plt.show()
2.运行结果如下
3.使用第3特征,选取20个,效果如下:
x=X[:,2]
n,bins,_=plt.hist(x,bins=20,edgecolor="k")
plt.show()
print("bins取值范围",list(bins))
print("频数",list(n))
可以看到,以特征3判断,可以看到分类结果非常的明显。
4.4个特征直方图对比
plt.figure(figsize=(12,12))
for i in range(4):
plt.subplot(2,2,i+1)
x=X[:,i]
n,bins,_=plt.hist(x,bins=100,edgecolor="k")
plt.xlabel(iris["feature_names"][0])
plt.ylabel("Frequency")
plt.show()