数据是机器学习的原料,机器学习是通过对数据的训练才得到某种特性的。因此正确的预处理数据对模型结果的输出尤为重要。
-一、数据可能存在的问题
数据一开始可能有数据重复,数据缺失,数据存在异常值等情况。
二、数据预处理的步骤
数据处理主要包括数据的清洗,数据的转化.数据描述,特征选择和特征抽取这几个步骤。1、数据清洗主要通过对缺失值,异常值和重复数据的处理来完成的。
对缺失值的处理首先要判断是否有缺失值,用isnull函数,这个函数返回的是一个布尔类型的结果。其中缺失值为True,非缺失值为Flase。
然后再进行缺失值的处理.
缺失值处理主要有以下两种方式。
一是删除缺失记录
删除数据通过pandas的dropna函数来删除缺失值。
df.dropna(axis = 0,thresh = 2)
axis = 0代表沿着竖直方向(删除行),1代表沿着水平方向(删除列)。使用dropna函数可以直接删除缺失数据所在行或列(默认是行)
thresh = 2代表保留至少2个非NaN数据所在的行。默认是不保留
二是填充数据
填充数据用到的pandas里的函数是
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
'''
vlaue参数指的是填充的值
method指填充的方法 pad/ffill表示用之前的数据填充(列,第一行不填充)backfill/bfill表示用之后的数据填充(列。最后一行不填充)。
limit指限制填充的次数
'''
。
另外还有平均值填补,拉格朗日插值法。平均值就是用mean()函数求出平均值。
拉格朗日插值法是通过其他存在值的计算,来拟合出缺失的数据,不过在缺失大量数据时,偏差较大。
异常值的处理也主要有两种方法。
一是利用3σ原则来找出异常值。就是如果数据服从正态分布,异常值则为与平均值相差超过3倍σ的值。
u = data.mean()#计算均值
std = data.std()#计算标准差
error = data[np.bas(data-u)>3*std]#求出异常值
二是箱型图分析
箱线图是一种用于显示一组数据分散情况的统计图。箱型图不受异常值影响,可以以一种相对稳定的方式描述数据的离散分布情况。
下面是python代码实现方法。其中的precentile函数是用来求出数组的上四分位,中位和下四分位数的。
percentile = np.percentile(self.n, (25, 50, 75), interpolation=‘midpoint’)
#以下为箱线图的五个特征值
Q1 = percentile[0]#上四分位数
Q3 = percentile[2]#下四分位数
IQR = Q3 - Q1#四分位距
ulim = Q3 + 1.5*IQR#上限 非异常范围内的最大值
llim = Q1 - 1.5*IQR#下限 非异常范围内的最小值
2、在数据的转换阶段,有对数据进行归一化,标准化,离散化等操作。
首先,归一化操作是将数据统一映射到[0,1]区间上。由于数据相差过大,所以一般要做归一化处理。
range_ = np.max(x) - np.min(x)
num = (x-np.min(x)) / range_
标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导。
mu = np.mean(self.x,axis=0)#计算平均数
sigma = np.std(self.x,axis=0)#计算方差
num = (x-mu) / sigma
连续值离散化是将数据按照不同的区间分好类,有等宽法和等频法。
等宽法是将数据平均分成三个相同的区间。
d1 = pd.cut(df,k, labels = range(k))
#k表示划分区间的个数
#df表示输入的dataframe类型的数据
#lables表示表头
等频法是按数据出现频率划分。将相同数量的记录放在每个区间,保证每个区间的数量基本一致。即分组后,每个分组的元素个数是一样的。
k = 4
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1]#取几个分位数的值作为不等长列表,用于cut函数
w[0] = w[0]*(1-1e-10)#浮点化
d2 = pd.cut(data, w, labels = range(k))
#或者直接用qcut(data,k)函数
还有另外一种数据处理操作是离散值处理(独热编码)
独热编码是将同类型的数据分类按照二进制来变成0或1的数字。例如:
男:01,女:10
学生:001,老师:010,领导:100
date = pd.read_csv(self.n)#读取csv文件
date_df = pd.DataFrame(date)#转换成DataFrame格式
date_gd = pd.get_dummies(date_df)#进行编码