在机器学习中应用统计插补来处理缺失值(附代码)
作者头像
  • IT老友记
  • 2020-06-16 20:51:00 5

教程:使用统计方法处理缺失值

导语

本文将介绍如何利用统计方法处理缺失值,以提升机器学习模型的表现。我们将以病马数据集为例,演示如何识别和替换缺失值,并评估不同插补方法的效果。

缺失值与数据插补

在机器学习中,数据集可能包含缺失值,这可能会导致算法性能下降。因此,对缺失值进行合理的插补非常重要。常用的插补方法之一是使用统计量,如均值、中位数、众数或常数值。

病马数据集

病马数据集用于记录患有腹绞痛的马匹的医学特征及其生存状态。数据集包含300条记录,26个输入变量和1个输出变量。这是一个典型的二分类问题,输出变量表示马匹是否存活。

加载和检查数据

首先,我们需要加载数据集并检查缺失值。这里我们使用Pandas库将所有缺失值标记为NaN。以下是加载和检查数据的代码示例:

```python import pandas as pd

加载数据集

url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv' dataframe = pd.readcsv(url, header=None, navalues='?')

显示前几行数据

print(dataframe.head())

检查每列的缺失值数量和百分比

for i in range(dataframe.shape[1]): nmiss = dataframe[i].isnull().sum() perc = nmiss / dataframe.shape[0] * 100 print(f'> {i}, 缺失值数量: {n_miss} ({perc:.1f}%)') ```

使用SimpleImputer进行统计插补

SimpleImputer 类提供了强大的工具来处理缺失值。我们可以使用均值、中位数、众数或常数值来插补缺失值。以下是使用均值进行插补的示例:

```python from sklearn.impute import SimpleImputer import numpy as np

定义插补器

imputer = SimpleImputer(strategy='mean')

拟合插补器并转换数据

X = dataframe.values[:, :-1] imputer.fit(X) Xtrans = imputer.transform(X)

检查转换后的数据

print('转换后缺失值数量:', np.isnan(Xtrans).sum()) ```

使用Pipeline进行模型评估

为了确保插补过程不会导致数据泄露,我们通常会在模型评估过程中使用Pipeline。以下是使用Pipeline进行模型评估的示例:

```python from sklearn.ensemble import RandomForestClassifier from sklearn.modelselection import crossvalscore from sklearn.pipeline import Pipeline from sklearn.modelselection import RepeatedStratifiedKFold

定义模型和管道

model = RandomForestClassifier() pipeline = Pipeline(steps=[('i', imputer), ('m', model)])

定义交叉验证方法

cv = RepeatedStratifiedKFold(nsplits=10, nrepeats=3, random_state=1)

评估模型

scores = crossvalscore(pipeline, X, dataframe.values[:, -1], scoring='accuracy', cv=cv, n_jobs=-1) print('平均准确率: %.3f (%.3f)' % (np.mean(scores), np.std(scores))) ```

比较不同插补方法

为了找到最适合病马数据集的插补方法,我们可以比较不同统计量的效果。以下是使用不同插补策略进行比较的示例:

```python from matplotlib import pyplot

定义不同的插补策略

strategies = ['mean', 'median', 'most_frequent', 'constant'] results = []

for s in strategies: pipeline = Pipeline(steps=[('i', SimpleImputer(strategy=s)), ('m', RandomForestClassifier())]) cv = RepeatedStratifiedKFold(nsplits=10, nrepeats=3, randomstate=1) scores = crossvalscore(pipeline, X, dataframe.values[:, -1], scoring='accuracy', cv=cv, njobs=-1) results.append(scores) print(f'>{s} 平均准确率: {np.mean(scores):.3f} (标准差: {np.std(scores):.3f})')

绘制箱线图

pyplot.boxplot(results, labels=strategies, showmeans=True) pyplot.xticks(rotation=45) pyplot.show() ```

预测新数据

最后,我们可以使用训练好的模型对新数据进行预测。以下是使用训练好的Pipeline进行预测的示例:

```python

定义新数据

new_data = [2,1,530101,38.50,66,28,3,3,np.nan,2,5,4,4,np.nan,np.nan,np.nan,3,5,45.00,8.40,np.nan,np.nan,2,2,11300,00000,00000]

预测

prediction = pipeline.predict([new_data]) print('预测结果:', prediction[0]) ```

总结

通过以上步骤,我们可以有效地处理数据集中的缺失值,提升机器学习模型的性能。使用统计方法进行插补是一种简单有效的方法,特别是在处理大规模数据集时。

作者简介

Jason Brownlee,机器学习博士,专注于通过实践教程指导开发者如何运用现代机器学习技术解决问题。

    本文来源:图灵汇
责任编辑: : IT老友记
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
缺失机器统计代码处理应用学习
    下一篇