本文将介绍如何利用统计方法处理缺失值,以提升机器学习模型的表现。我们将以病马数据集为例,演示如何识别和替换缺失值,并评估不同插补方法的效果。
在机器学习中,数据集可能包含缺失值,这可能会导致算法性能下降。因此,对缺失值进行合理的插补非常重要。常用的插补方法之一是使用统计量,如均值、中位数、众数或常数值。
病马数据集用于记录患有腹绞痛的马匹的医学特征及其生存状态。数据集包含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
类提供了强大的工具来处理缺失值。我们可以使用均值、中位数、众数或常数值来插补缺失值。以下是使用均值进行插补的示例:
```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进行模型评估的示例:
```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,机器学习博士,专注于通过实践教程指导开发者如何运用现代机器学习技术解决问题。