本文正在参与「金石方案 . 瓜分6万现金大奖」

大家好,我是小寒。

原文衔接

在数据科学项目中,数据预处理是最重要的事情之一。

假如有正确的数据预处理和特征工程,该模型更有或许与数据未得到很好预处理的模型相比,发生更好的成果。

数据预处理首要有4个重要进程。

  • 拆分练习集和测验集
  • 处理缺失值
  • 处理分类特征
  • 进行标准化处理

拆分练习集和测验集

练习集和测验集拆分是机器学习中的重要进程之一。

这十分重要,由于你的模型需要在布置之前进行评估。

练习集和测验集拆分背后的首要思维是将原始数据集转换为两部分

  • 练习集
  • 测验集

其中练习集由练习数据和练习标签组成,测验集由测验数据和测验标签组成。

最简略的办法是运用 scikit-learn 的 一个内置函数 train_test_split

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

在这里,咱们在 train_test_split 中传入了 X 和 y 作为参数 ,它将 X 和 y 进行拆分,其中练习集占 80%,测验集占 20% 。

处理缺失值

你或许听说过一个著名的机器学习短语,它是

Garbage in Garbage out

假如你的数据集充满了缺失值,那么你的模型效果也不好。

因而,处理此类缺失值很重要。

让咱们用一个虚拟数据集来看看咱们怎么解决这个问题。

首要检查一下数据集中的缺失值。

df.isna().sum()

python进行数据预处理的4个重要步骤

咱们能够看到数据集中有缺失值。

填充缺失值的一种办法是用该列的平均值填充。

例如,咱们能够用该列一切学生的平均值来填充 Final 列的缺失值。

为此,咱们能够运用 sklearn.impute 中的 SimpleImputer 。

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(fill_value=np.nan, startegy='mean')
X = imputer.fit_transform(df)

这将运用 该列的 平均值 填充数据框 df 中的一切缺失值 。

能够运用 fit_transform 函数来做到这一点。

X = pd.DataFrame(X, columns=df.columns)
print(X)

python进行数据预处理的4个重要步骤

现在,能够看到一切缺失值都用均值进行了填充。

X.isna().sum()

python进行数据预处理的4个重要步骤

咱们也能够在 SimpleImputer 中运用 mean、 meadian、 mode 等 。

假如 缺失值的行数较少,或者咱们的数据不建议填充缺失值,那么能够在 pandas 中运用 dropna 删去缺失的行。

dropedDf = df.dropna()

在这里,咱们删去了数据框中的一切空行并将其存储在另一个数据框中。

dropedD.isna().sum()

python进行数据预处理的4个重要步骤

处理分类特征

咱们能够经过将它们转换为整数来处理分类特征。有两种常见的办法能够做到这一点。

  • Label Encoding
  • One Hot Encoding

Label Encoder中,将分类值转换为数字标签。假定这是咱们的数据集

python进行数据预处理的4个重要步骤

在 Country 列上运用 Label Encoding 会将 India 转换为 1,将 USA 转换为 2,将 China 转换为 0。

这种技能有一个缺点,即由于 USA 的标签高,它给予 USA 最高优先级,而 China 的优先级最低,标签为 0。

from sklearn.preprocessing import LabelEncoder
l1 = LabelEncoder()
l1.fit(catDf['Country'])
catDf.Country = l1.transform(catDf.Country)
print(catDf)

python进行数据预处理的4个重要步骤

如代码所示,咱们实例化了一个 LabelEncoder 目标,然后运用 fit 办法将其应用到分类列上,然后运用 transform 办法进行转换。

OneHotEncoder 中 ,咱们为每个唯一的分类值创建一个新列。

下面经过一个例子来了解一下。

咱们将添加另一个分类列,即 “Continent”。

catDf['Continent'] = ['Asia', 'North America', 'Asia']

python进行数据预处理的4个重要步骤

现在由于咱们有 2 个分类列,它们是 [[‘Country’, ‘Continent’]],咱们能够对它们进行独热编码。

有两种办法能够做到这一点。

1.DataFrame.get_dummies

这是一种十分常见的办法,咱们运用 pandas 内置函数 get_dummies 将数据帧中的分类值转换为独热编码。

pd.get_dummies(data=catDf)

这将 回来 一个数据帧。

python进行数据预处理的4个重要步骤

在这里咱们能够看到它现已将 Country 列的唯一值转换为 3 个不同的列,别离是 Country_China、Country_India 和 Country_USA。同样,Continent 列的 2 个唯一值已转换为 2 个不同的列,别离命名为 Continent_Asia 和 Continent_North America。

2.OneHotEncoder

运用 scikit-learn 中的 OneHotEncoder 也是一种常见的做法。

它提供了更多的灵活性和更多的选择,但运用起来有点困难。

让咱们看看怎么为咱们的数据集做这件事。

from sklearn.preprocessing import OneHotEncoder
oh = OneHotEncoder()
s1 = pd.DataFrame(oh.fit_transform(catDf.iloc[:, [0,3]]))
catDf = pd.concat([catDf, s1], axis=1)

在这里,咱们现已初始化了 OneHotEncoder 目标,并在数据框中对咱们想要的列(列号 0 和列号 3)上运用了它的 fit_transform办法。

fit_transform 的回来类型 是 numpy.ndarray ,所以咱们经过pd.DataFrame 将其转换为数据框 ,并存储在一个变量中。

然后,为了将它加入咱们的原始数据帧,能够运用 pd.concat 衔接 2 个不同数据帧。

python进行数据预处理的4个重要步骤

你能够看到,与 pd.get_dummies 相比,它的可读性并不明晰

但是假如你比较运用 pd.get_dummies 和 OneHotEncoder 获得的最后 5 列,它们都是相等的。

标准化数据集

某些试验证明,与未标准化的数据集相比,机器学习和深度学习模型在标准化数据集上的体现更好。

有几种办法能够做到这一点。我将讨论标准化数据集的 2 种常用办法。

1、Standard Scaler

python进行数据预处理的4个重要步骤

运用这种技能,能够将数据集转化为均值为 0,标准差为 1。

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
catDf.iloc[:,1:-1] = ss.fit_transform(catDf.iloc[:,1:-1])
print(catDf)

python进行数据预处理的4个重要步骤

2、Normalization

正则化是将 **每个样本缩放到单位范数(每个样本的范数为1)**的进程。

假如你方案运用二次型(点积)或任何其他核办法来计算两个样本之间的相似性,则此进程会很有用。

Normalization 首要思维是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的成果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。

运用进程十分简略,与 StandaradScaler 相似。

from sklearn.preprocessing import Normalizer
norm = Normalizer()
catDf.iloc[:,1:-1] = norm.fit_transform(catDf.iloc[:,1:-1])
catDf

python进行数据预处理的4个重要步骤