机器学习数据中缺失值的处理方法

查看每一列有多少缺失值:

# Shape of training data (num_rows, num_columns)
print(X_train.shape)

# Number of missing values in each column of training data
missing_val_count_by_column = (X_train.isnull().sum())
print(missing_val_count_by_column[missing_val_count_by_column > 0])

1.直接删除缺少值的行或列

若某一列(行)缺失了大多数值,则可考虑将这列(行)删除。
以删除列为例,代码如下:

# Get names of columns with missing values
cols_with_missing = [col for col in X_train.columns
                     if X_train[col].isnull().any()]

# Drop columns in training and validation data
reduced_X_train = X_train.drop(cols_with_missing, axis=1)  #训练数据X,axis=1表示删除列
reduced_X_valid = X_valid.drop(cols_with_missing, axis=1)	#测试数据X

其中X_train是DataFrame对象。
isnull()函数返回一个同维度对象,非空值处为False,空值处为True.
any()函数判断对象中如果有一个值为True,则返回True,若全为False则返回False。(与之相对的函数为all(),所有元素为True则返回True,有一个为False则返回False)

2.估算并填充缺失的值。例如,我们可以沿每一列填平均值(众数、中位数等)。

大多数情况下,估算的值并不是完全正确的,但是使用这种方法通常会使模型比直接删除行或列更精确。
虽然填充平均值很简单,但它通常表现得很好(但这取决于数据集)。虽然统计学家已经试验了确定估算值的更为复杂的方法(例如,回归估算),但一旦将结果插入复杂的机器学习模型,复杂的策略通常不会带来额外的好处。
**sklearn.impute.SimpleImputer()函数实现了这个方法。
参数:
missing_value:缺失值长什么样,默认为空值即np.nan.
strategy:填充策略,默认为均值填充(mean:均值填充(仅对数值型特征有用);median:中值填充(仅对数值型特征有用);most_frequent:众数填充(对数值型和字符型特征都有用);constant:表示参考参数“fill_value”中的值)
** fill_value
:当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0。
copy:默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

from sklearn.impute import SimpleImputer

# Imputation
my_imputer = SimpleImputer()
imputed_X_train = pd.DataFrame(my_imputer.fit_transform(X_train))
imputed_X_valid = pd.DataFrame(my_imputer.transform(X_valid))

# 为副本创建列名
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns

fit_tranform():先拟合数据(并不是训练模型时候的拟合,而是找到整体指标,如均值,方差,标准差、最大值、最小值等),然后transform()(这里即为imputation)
tranform():训练数据已经fit()了,所以测试数据直接transform().

可以参考这篇博客 fit_transform,fit,transform区别和作用详解

3.第二种方法的扩展

我们在第二种方法基础上新增加一列记录每次个填充值的位置。这种方法在某些情况下对提高结果很有意义,在某些情况下毫无意义。

# Make copy to avoid changing original data (when imputing)
X_train_plus = X_train.copy()
X_valid_plus = X_valid.copy()

# Make new columns indicating what will be imputed
for col in cols_with_missing:  #cols_with_missing:列中存在缺失值的列名
    X_train_plus[col + '_was_missing'] = X_train_plus[col].isnull()#存放是否缺失值True or False
    X_valid_plus[col + '_was_missing'] = X_valid_plus[col].isnull()

# Imputation
my_imputer = SimpleImputer()
imputed_X_train_plus = pd.DataFrame(my_imputer.fit_transform(X_train_plus))
imputed_X_valid_plus = pd.DataFrame(my_imputer.transform(X_valid_plus))

# Imputation removed column names; put them back	即为副本创建列名
imputed_X_train_plus.columns = X_train_plus.columns
imputed_X_valid_plus.columns = X_valid_plus.columns


发布了15 篇原创文章 · 获赞 6 · 访问量 3277

猜你喜欢

转载自blog.csdn.net/supreme_1/article/details/104307676