数据清洗&预处理

原文链接: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,那么并不需要进行特征缩放。这是一个具有明确相关值的分类问题。但如果其取值范围非常大,那么答案是你需要做缩放。

 

当然在数据清洗和预处理中,上文只是简单描述其基础,如何填充缺失值、是否需要做特征缩放以及如何做、如何处理属性变量等等,都需要结合具体的业务背景再加上自己的思考来进行处理。

你可能感兴趣的:(读书笔记)