数据预处理 | 处理残缺值(Missing value)python-sklearn实现| 三种常用方法 | Kaggle 学习笔记(三)

方法一: 移除法(Drop)
将含有残缺值的列直接丢弃。这种方法可能会导致大量有用的信息丢失。
数据预处理 | 处理残缺值(Missing value)python-sklearn实现| 三种常用方法 | Kaggle 学习笔记(三)_第1张图片

import pandas as pd

# 读取数据
data = pd.read_csv("filename.csv") 

# 提取出含有残缺值的列
cols_with_missing = [col for col in data.columns if data[col].isnull().any()]

# 移除含有残缺值的列
reduced_data = data.drop(cols_with_missing, axis=1)

方法二: 插值法(Imputation)
用新的数据填充残缺值的位置,一般可用均值(mean value)填充。虽然填充值并不一定精确,但是它不用丢弃整一列的数据。
数据预处理 | 处理残缺值(Missing value)python-sklearn实现| 三种常用方法 | Kaggle 学习笔记(三)_第2张图片

from sklearn.impute import SimpleImputer
import pandas as pd

# 读取数据
data = pd.read_csv("filename.csv") 

# Imputation 用该列均值填充残缺值
my_imputer = SimpleImputer()
imputed_data = pd.DataFrame(my_imputer.fit_transform(data))

# Imputation 通常会移除列名,因此要将它们取回
imputed_data.columns = data.columns

处理类别变量中的残缺值

from sklearn.base import BaseEstimator, TransformerMixin

class MostFrequentImputer(BaseEstimator, TransformerMixin):
	def fit(self, X, y=None):
	# 选取出现次数最多的同类型类别变量
		self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X], index=X.columns)
		return self
	def transform(self, X, y=None):
		return X.fillna(self.most_frequent_)

cat_imputer = MostFrequenctImputer()
imputed_data = pd.DataFrame(cat_imputer.fit_transform(data))

方法三: 插值法的延伸
通常情况下,插值法(imputation)可以很好的解决问题,但是插入的均值要么高于或低于实际值(actual value),因此导致计算的结果与现实情况有所出入。因此,我们除了查入均值外,对于每个含有残缺值的列,我们都额外添加一列来表示该列中残缺值的位置。在某些应用中,这个方法能优化结果,当然有时候也不起作用。
数据预处理 | 处理残缺值(Missing value)python-sklearn实现| 三种常用方法 | Kaggle 学习笔记(三)_第3张图片

from sklearn.impute import SimpleImputer
import pandas as pd

# 读取数据
data = pd.read_csv('filename.csv')

# 复制该数据集,以免接下来的操作(imputing)更改了原来的数据
data_plus = data.copy()

# 获取含有缺失值的列的列名
cols_with_missing = [col for col in data.columns if data[col].isnull().any()]

# 增添新的列来表明缺失值的位置
for col in cols_with_missing:
	data_plus[col + '_was_missing'] = data_plus[col].isnull()

# Imputation 在残缺值的位置插入该列的平均值
my_imputer = SimpleImputer()
imputed_data_plus = pd.DataFrame(my_imputer.fit_transform(data_plus))

# Imputation 通常会移除列名,因此要将它们取回
imputed_data_plus.columns = data_plus.columns

# 统计数据集中每一列的缺失值数目
missing_val_count_by_column = (data.isnull().sum())

你可能感兴趣的:(数据挖掘)