How Much Did It Rain? Ⅱ 使用机器学习进行预测(二)

How Much Did It Rain? Ⅱ 使用机器学习进行预测(二)

  • 缺失值处理
    • 缺失值处理方式介绍
    • 缺失值分析处理
  • Labels异常值

   How Much Did It Rain? Ⅱ 使用机器学习进行预测(一)中实现了读取数据,查看数据、缺失值情况查看、Label分布分析。
  接下来要对缺失值进行处理(针对不同的模型的特点与数据要求可以有很多种处理数据的方案)、Labels异常值处理。

缺失值处理

缺失值处理方式介绍

  缺失值处理的常见8类处理方式见:数据分析-缺失值处理方法与优缺点,最关键两个问题:①删还是填?②怎么填?删,信息减少,填,增加噪声。

  一个比较合适的处理步骤是:

  1. 先尝试删除有缺失项的数据,然后训练模型,先把baseline做出来;
  2. 然后会依次尝试:特殊值处理、中位数填充,均值填充和K最近邻法。
常用处理方式 介绍
特殊值处理 将空值作为一种特殊的属性值来处理
中位数填充 用中位数对缺失值进行填充
均值填充 用平均数对缺失值进行填充
K最近邻法 取某类距离,填充距离最近的值

缺失值分析处理

  我们数据量极大,缺失情况也很严重,在没有训练出baseline之前,我们初步采取删减和填0的方式处理数据。
  预测(一)中观察到的缺失值分布,几乎每列的缺失值都大于50%,我们可视化一下缺失值分布情况:使用缺失值可视化Python工具库missingno查看缺失值分布以及缺失情况之间的联系

import missingno as msno
msno.matrix(train)
msno.heatmap(train,figsize = (20,10))

output:(缺失值为白色部分)
How Much Did It Rain? Ⅱ 使用机器学习进行预测(二)_第1张图片
How Much Did It Rain? Ⅱ 使用机器学习进行预测(二)_第2张图片
  存在有特征值完全缺失的数据,并且缺失分布联系关系系数图中有很明显的两个三角区!!!!
  三角区代表着缺失值强相关性,正方形区域代表着缺失值分布不相关,大概意思就是前八列数据缺失分布情况很类似,但是在前八列缺失的时候,后十二列大部分不缺失,后十二列数据缺失分布情况很类似,但是在后十二列缺失的时候,前八列大部分不缺失。

删除训练无价值的数据

  pd对DataFrame有专门的函数用于删除缺失值与填充缺失值:dropnafillna,使用方式查看:dropna介绍和fillna介绍。
  这里使用pd.dropna删除含缺失值的数据:由于缺失分布主要分为前8列与后12列的缺失分布,因此将最少特征数阈值设置为8,这样将删减绝大多数没有训练意义的数据。

train = train.dropna(axis=0, how='all',thresh=12)  # 8个特征数字+Id+time+km+Expected=12

x_train = train.iloc[:,:-1]
Null_num = x_train.isnull().sum()
Null_percent = x_train.isnull().sum()/x_train.shape[0]*100
Null_condition = pd.concat([pd.DataFrame(Null_num),pd.DataFrame(Null_percent)],axis=1)
Null_condition.columns = ['Null_num','Null_percent']
print(Null_condition,'\n')
print(f"还剩下{train.shape[0]}组部分缺失的数据")

output:
How Much Did It Rain? Ⅱ 使用机器学习进行预测(二)_第3张图片
  从比例上而言缺失值情况已经极大的改善了,在没有训练出baseline情况下,暂时将全部缺失值以0进行填充

train = train.fillna(0)

Labels异常值

  可以具体查看数据异常值处理方法,在预测(一)中我们已经观察了Labels的分布,满足正态分布,这里我们再采用常用的分布检验方式:KS检验判断数据是否呈正态分布形式,使用到scipy.stats库中的kstest,具体使用方式参见:kstest函数使用。

from scipy.stats import kstest  #正态分布检测
def KsNormDetect(data):
    u = data.mean()
    std = data.std()
    # 计算P值
    res = kstest(data, 'norm', (u, std))[1]
    if res <= 0.05:
        print('该列数据服从正态分布')
        print('均值为:%.3f,标准差为:%.3f' % (u, std))
    else:
        print("该列数据不服从正态分布")
    return
KsNormDetect(train.iloc[:,23)

output:

该列数据服从正态分布
均值为:17.233,标准差为:205.435

  针对我们的数据,我们采用的异常值处理方式为:

  1. 依据专业知识或个人经验,判断是否超过了理论范围值,删除数据中明显不符合实际情况的错误;
  2. 采用3σ 原则删除:对满足正态分布的数据而言,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值;
# 人为排除异常值
train = train[train['Expected'] <= 150]

# 3标准差排除异常值
label = train.iloc[:,23]
y_mean = label.mean()
y_std = label.std()
train = train[train['Expected'] < (y_mean + 3 * y_std)]
train.reset_index(drop=True, inplace=True)
print("异常值处理后:")
KsNormDetect(train.iloc[:,23])
print("数据还剩:",train.shape[0],'组')

output:

异常值处理后:
该列数据服从正态分布
均值为:1.658,标准差为:1.698
数据还剩:5669492

到此,数据处理部分结束,后续我们分析Features之间、Feature和Label之间的相关性关系,来选择一个模型进行简单的预测。

你可能感兴趣的:(python,人工智能,大数据)