原文链接:https://towardsdatascience.com/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d 本文是读书笔记:
PYTHON 中最流行的库就是 Numpy、Matplotlib 和 Pandas。Numpy 是满足所有数学运算所需要的库,由于代码是基于数学公式运行的,因此就会使用到它。Maplotlib则是满足绘图所需要的库。Pandas 则是最好的导入并处理数据集的一个库。对于数据预处理而言,Pandas 和 Numpy 基本是必需的。
一般用pandas导入数据,比如 data = pd.read_csv("..."); 但后面最好用矩阵来存储这些数据,即X = data.iloc[:, :-1].values(假设改数据前n-1列都是自变量,最后一列是因变量y)
可以讲缺失数据所在的行删掉,但这样的处理办法不合理,容易引发各种各样的问题。比较常用的方法是使用其所在列的均值来填充缺失值。可以使用scikit-learn.preprocessing中的Imputer.
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = np.nan, strategy = "mean", axis = 0)
默认的是均值填充, missing_values 的默认值是 nan。数据集如果存在「NaN」形式的缺失值,那么应该关注 np.nan.
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:,1:3])
填充策略可以有很多,比如说可以使用众数、中位数等;当然还有插补法,利用函数拟合来进行插值;也可以计算该变量的分布,然后再进填补;对于缺失值的处理方法,还有很多,得具体情况具体对待。后续补充.....
如果某一列是属性数据,为了后续的计算,需要将其编码为数值。可以使用sklearn.preprocessing中的LabelEncoder类,比如:
from sklearn.preprocessing import LabelEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
但使用这种方法会存在一种问题,就是会产生0,1,2这样的数据,这样的话,会使用数量层级关系进而影响模型的结果。因此,一种更好的方法是创建哑变量。具体做法就是再原有数据基础上,删掉原始的属性值那一列,如果原始属性有m种取值,那么我们增加m列,然后在所属类别那一列标1,其他列标0. 代码示例为:
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_feature = [0])
X = onehotencoder.fit_transform(X).toarray()
一般情况下,对于只有2种取值的属性列,可以使用LabelEncoder类,如果取值多于2个,建议使用OneHotEncoder类。
一般情况下,可以将数据划分为训练集、验证集、测试集;训练集用来训练数据,验证集用来调整模型参数,测试集用来评估模型最后的效果。
某一列的数值远远大于另一列,而且数据范围更广,这样的话,欧式距离将完全由数值大且范围广的特征所主导,这时我们需要缩放特征。缩放特征有很多种方法,但最终的目的就是将所有特征放在同一个量纲上,进而没有一个会被另一个所主导。
from sklearn.preprocessing import StandardScaler
sc_X = StandardScale()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test) ## 需要注意的是测试集数据需要在训练集的特征上进行变换
sc_y = StandardScale()
y_train = sc_y.fit_transform(y_train)
对于因变量,如果因变量是 0 和 1,那么并不需要进行特征缩放。这是一个具有明确相关值的分类问题。但如果其取值范围非常大,那么答案是你需要做缩放。
当然在数据清洗和预处理中,上文只是简单描述其基础,如何填充缺失值、是否需要做特征缩放以及如何做、如何处理属性变量等等,都需要结合具体的业务背景再加上自己的思考来进行处理。