机器学习--数据预处理

前言:凡事预则立,不预则废,训练机器学习模型也是如此。数据清洗和预处理是模型训练之前的必要过程,否则模型可能就「废」了。

数据预处理是建立机器学习模型的第一步(也很可能是最重要的一步),对最终结果有决定性的作用:如果你的数据集没有完成数据清洗和预处理,那么你的模型很可能也不会有效——就是这么简单。

人们通常认为,数据预处理是一个非常枯燥的部分。但它就是「做好准备」和「完全没有准备」之间的差别,也是表现专业和业余之间的差别。就像为度假做好事先准备一样,如果你提前将行程细节确定好,就能够预防旅途变成一场噩梦。

那么,应该怎么做呢?

 #1  导入需要使用的库文件和数据文件:

库是非常棒的使用工具:将输入传递给库,它则完成相应的工作。你可以接触到非常多的库,但在 PYTHON 中,有三个是最基础的库。任何时候,你都很可能最终还是使用到它们。这三个在使用 PYTHON 时最流行的库就是 Numpy、Matplotlib 和 Pandas。Numpy 是满足所有数学运算所需要的库,由于代码是基于数学公式运行的,因此就会使用到它。Maplotlib(具体而言,Matplotlib.pyplot)则是满足绘图所需要的库。Pandas 则是最好的导入并处理数据集的一个库。对于数据预处理而言,Pandas 和 Numpy 基本是必需的。

# 导入库文件
import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

#导入数据文件
dataset = pd.read_csv('my_data.csv')

前几行数据如下:

#2 创建一个矩阵来保存自变量,一个向量来保存因变量:

# 创建矩阵保存自变量
X = dataset.iloc[:,:-1].values  # 最后的「.values」表示希望提取所有的值
y = dataset.iloc[:,3].values

注:在查看数据集的时候,索引(index)是从 0 开始的。所以,如果希望统计列数,从 0 开始计数而不是 1。「[:, :3]」会返回 animal、age 和 worth 三列。其中 0 表示 animal,1 表示 age,2 表示 worth。对于这种计数方法,即使你没见过,也会在很短的时间内适应。

#3 缺失数据的处理

最常用的方法是,用其所在列的均值来填充缺失。为此,你可以利用 scikit-learn 预处理模型中的 inputer 类来很轻松地实现

from sklearn.preprocessing import Imputer
imputer = Imputer(misssing_values = np.nan,strategy = 'mean',axis = 0)

# 为了拟合imputer 输入
imputer = imputer.fit(X[:,1:3])  # 只取第一、二列

# transformer实现调用
X[:,1:3] = imputer.transform(X[:,1:3])

注 np.nan,可以在此查看官方文档: https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html

多尝试一些不同的填充策略。也许在某些项目中,你会发现,使用缺失值所在列的中位数或众数来填充缺失值会更加合理。填充策略之类的决策看似细微,但其实意义重大。因为流行通用的方法并不一定就是正确的选择,对于模型而言,均值也不一定是最优的缺失填充选择。

注:

1.类就是我们希望为某目的所建立的模型。如果我们希望搭建一个棚子,那么搭建规划就是一个类。

2.对象是类的一个实例。在这个例子中,根据规划所搭建出来的一个棚子就是一个对象。同一个类可以有很多对象,就像可以根据规划搭建出很多个棚子一样。

3.方法是我们可以在对象上使用的工具,或在对象上实现的函数:传递给它某些输入,它返回一个输出。这就像,当我们的棚子变得有点不通气的时候,可以使用「打开窗户」这个方法。

#4 包含数据属性时,如何处理?

这是一个好问题。没有办法明确地计算诸如猫、狗、麋鹿的均值。那么可以怎么做呢?可以将属性数据编码为数值!你可能希望使用 sklearn.preprocessing 所提供的 LabelEncoder 类。从你希望进行编码的某列数据入手,调用 label encoder 并拟合在你的数据上。

from sklearn.preprocessing import LabelEncoder
labelencoder_X  = LabelEncoder()
X[:,0] = labelencoder_X .fit_transform(X[:,0])

这就是将第一列中的属性变量替换为数值所需的全部工作了。例如,麋鹿将用 0 表示,狗将用 2 表示,猫将用 3 表示。

    潜在问题?

标注体系暗含以下信息:所使用的数值层级关系可能会影响模型结果:3 比 0 的数值大,但猫并不一定比麋鹿大。

So :创建哑变量--利用oneHotEncoder

from sklearn.preprocessing import OneHotEncoder,LabelEncoder
onehotencoder = OneHotEncoder(categorical_features = [0])

# 然后拟合和转换
X = onehotencoder.fit_transformer(X).toarray()


# 同理,对ylabel进行编码转换
labelencoder_y = LabelEncoder()
y = labelencoder.fit_transform(y)

#5 训练集合测试集的划分

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,random_stat e= 0 )

创建 X_train、X_test、y_train 和 y_test 集合

一种常见的方法是将数据集按 80/20 进行划分,其中 80% 的数据用作训练,20% 的数据用作测试。这也是为何指定 test_size 为 0.2 的原因。你也可以根据自己的需求来任意划分。你并不需要设置 random_state,这里设置的原因是为了可以完全复现结果。

# 6数据的特征缩放(统一量纲)

看看我们的数据。我们有一列动物年龄,范围是 4~17,还有一列动物价值,范围是$48,000-$83,000。价值一栏的数值不仅远大于年龄一栏,而且它还包含更加广阔的数据范围。这表明,欧式距离将完全由价值这一特征所主导,而忽视年龄数据的主导效果。如果欧式距离在特定机器学习模型中并没有具体作用会怎么样?缩放特征将仍能够加速模型,因此,你可以在数据预处理中,加入特征缩放这一步。

特征缩放的方法有很多。但它们都意味着我们将所有的特征放在同一量纲上,进而没有一个会被另一个所主导。

from sklearn.preprocessing import StandardScaler
# 创建一个需要缩放对象,并调用StandardScaler
sc_X = StandardScaler()
# 直接在数据集上进行拟合以及变换
x_train = sc_X.fit_transform(X_train)
x_test = sc_X.transform(X_test)  # 测试集不进行拟合,只需要进行变换即可。

#7 对于哑变量而言,是否需要进行缩放?

对于这个问题,有些人认为需要,有些则认为不需要。这取决于你对模型可解释性的看重诚度。将所有数据缩放至同一量纲固然有好处,但缺点是,这丢失了解释每个观测样本归属于哪个变量的便捷性。

对于 Y 呢?如果因变量是 0 和 1,那么并不需要进行特征缩放。这是一个具有明确相关值的分类问题。但如果其取值范围非常大,那么答案是你需要做缩放。

猜你喜欢

转载自blog.csdn.net/Jasminexjf/article/details/87874404