机器学习day001:数据预处理

发布时间 2023-07-04 07:19:21作者: xaopng

Step 1: 引入需要的python库

import numpy as np
import pandas as pd

numpy库包含了大量的数学函数
pandas库用于引入和管理数据集
这两个库我们每次都会用到

Step 2: 导入数据集

dataset = pd.read_csv('Data.csv')
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 3].values

数据集通常是.csv格式的文件。csv文件以文本的方式存储表格数据。文件的每一行是一条数据记录。我们使用pandas库的read_csv方法将本地csv文件读为dataframe类型的变量。然后,我们从dataframe中制作独立和非独立变量的单独矩阵和向量。

dataset.iloc是用来从数据集中选择特定单元格的函数,也就是说,它可以帮助我们从数据框或数据集的一组值中选择属于特定行或列的值。使用iloc()函数,我们可以使用分配给它的索引值检索属于行和列的特定值https://www.askpython.com/python/built-in-methods/python-iloc-function。

例如,如果你想要选择数据集中第一行第二列的值,你可以写:

value = dataset.iloc[0, 1]

如果你想要选择数据集中除了第一列之外的所有行和列,你可以写:

X = dataset.iloc[:, 1:]

如果你想要选择数据集中第一列的所有行,你可以写:

Y = dataset.iloc[:, 0]

Step 3: 处理丢失数据

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
imputer = imputer.fit(X[ : , 1:3])
X[ : , 1:3] = imputer.transform(X[ : , 1:3])

这段代码的目的是用来处理数据集中的缺失值,也就是说,用某种方法来填补或替换那些没有值的单元格。它使用了sklearn.preprocessing模块中的Imputer类,这是一个用于完成缺失值的转换器。具体的解释如下:
from sklearn.preprocessing import Imputer:这一行是导入Imputer类的语句,你需要先安装sklearn这个库才能使用它。注意,如果你使用的是sklearn的最新版本,你可能需要改成from sklearn.impute import SimpleImputer,因为Imputer类已经被弃用了
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0):这一行是创建一个Imputer对象的语句,你需要指定三个参数:missing_values, strategyaxismissing_values表示你要处理的缺失值的占位符,这里是"NaN",也就是np.nanstrategy表示你要用什么方法来填补缺失值,这里是"mean",也就是用每一列(或每一行)的平均值来替换。axis表示你要沿着哪个轴来计算平均值,这里是0,也就是沿着列来计算。你也可以选择其他的策略,比如"median"(中位数)或"most_frequent"(众数)
imputer = imputer.fit(X[ : , 1:3]):这一行是让Imputer对象适应数据集X的语句,你需要指定你要处理哪些列(或哪些行),这里是X[ : , 1:3],也就是第二列和第三列。这一步会计算出每一列(或每一行)的平均值,并保存在Imputer对象的statistics_属性中。

我们得到的数据很少是一致的。由于不同的原因,数据可能会丢失,我们需要事先处理,从而避免影响机器学习模型的性能。我们可以用整列的平均值或中值来替换丢失数据。我们使用sklearn.preprocessing中的Imputer类来完成这项任务。

Step 4: 编码类别数据

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

这段代码的目的是用来对数据集中的类别变量进行编码,也就是说,把一些非数值的变量(比如国家,性别,等级等)转换成数值的形式,以便于机器学习算法能够处理。它使用了sklearn.preprocessing模块中的LabelEncoder类和OneHotEncoder类,这是两种常用的编码方法。具体的解释如下:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder:这一行是导入LabelEncoder类和OneHotEncoder类的语句,你需要先安装sklearn这个库才能使用它。

labelencoder_X = LabelEncoder():这一行是创建一个LabelEncoder对象的语句,你可以用它来对类别变量进行标签编码,也就是给每个类别分配一个整数值。

X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])这一行是让LabelEncoder对象对数据集X中的第一列进行转换的语句,你需要指定你要转换哪一列,这里是X[ : , 0]。这一步会把第一列中的不同类别(比如国家名)转换成不同的整数(比如0, 1, 2等),并返回一个新的数组

LabelEncoder类可以简单方便地将数据中的类别编码成整数,但是有一个问题,就是它可能会让算法误以为类别之间有某种顺序或等级关系,比如1>0, 2>1等。这在某些情况下可能不合适,比如国家之间并没有大小之分。为了解决这个问题,我们可以使用OneHotEncoder类来对类别变量进行独热编码,也就是给每个类别创建一个新的二进制变量(0或1),表示该类别是否出现

例如,如果我们有三个国家:France, Germany, Spain,我们可以用LabelEncoder把它们编码成:

• France: 0

• Germany: 1

• Spain: 2

然后我们可以用OneHotEncoder把它们编码成:

• France: [1, 0, 0]

• Germany: [0, 1, 0]

• Spain: [0, 0, 1]

这样就避免了算法对类别之间有顺序或等级的假设。OneHotEncoder类的用法和LabelEncoder类类似,只是需要指定更多的参数,比如categorical_features(表示哪些列是类别变量),sparse(表示是否返回稀疏矩阵)等https://www.cnblogs.com/sench/p/10134094.html。

创造一个虚拟(dummy,我觉得是one hot变量的意思)变量:

onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y =  labelencoder_Y.fit_transform(Y)

类别数据是一些包含标签值而非数字值得变量。可能值的数字经常被限定在一个固定的集合中。比如样例值"Yes"和"No"不能被用在模型的数学等式中。所以我们需要将这些变量编码成数字。为了实现这个目的,我们从sklearn.preprocessing库中引入了LabelEncoder

Step 5: 将数据集分割成测试集和训练集

from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)

这段代码的目的是用来对数据集进行随机划分,也就是说,把数据集分成训练集和测试集,以便于进行机器学习模型的训练和评估。它使用了sklearn.cross_validation模块中的train_test_split函数,这是一个快速方便的工具。具体的解释如下:

• from sklearn.cross_validation import train_test_split:这一行是导入train_test_split函数的语句,你需要先安装sklearn这个库才能使用它。注意,如果你使用的是sklearn的最新版本,你可能需要改成from sklearn.model_selection import train_test_split,因为cross_validation模块已经被弃用了https://scikit-learn.org/0.15/modules/generated/sklearn.cross_validation.train_test_split.html。

• X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0):这一行是调用train_test_split函数对数据集进行划分的语句,你需要指定四个参数:X, Y, test_size和random_state。X和Y表示你要划分的特征矩阵和标签向量,它们可以是列表,numpy数组,scipy稀疏矩阵或pandas数据框。test_size表示你要把多少比例的数据作为测试集,它可以是一个浮点数(比如0.2)或一个整数(比如100),如果是None,它会自动设置为训练集的补集。random_state表示你要用什么随机数种子来控制数据的打乱顺序,它可以是一个整数(比如0)或一个RandomState对象,如果是None,它会使用默认的随机数种子。这一步会返回四个数组:X_train, X_test, Y_train, Y_test,分别表示训练集特征,测试集特征,训练集标签和测试集标签https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html。

train_test_split函数可以简单方便地将数据集随机划分为训练集和测试集,但是有一个问题,就是它只能进行一次划分,而且可能会受到数据顺序或分布的影响。为了解决这个问题,我们可以使用其他的交叉验证方法,比如KFold类或ShuffleSplit类,它们可以对数据集进行多次划分,并且可以控制每次划分的比例或重复次数https://blog.csdn.net/littlle_yan/article/details/83656662

我们将数据分成两部分,一部分用于训练模型,叫做训练集,一部分用于测试训练模型的性能,叫做测试集。分割比例通常是80/20。我们引入sklearn.cross_validation库的train_test_split方法来完成这个任务。

Step 6:特征缩放

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)

这段代码的目的是用来对数据集进行特征标准化,也就是说,把每个特征的值减去该特征的均值,并除以该特征的标准差,从而使得每个特征都符合标准正态分布。它使用了sklearn.preprocessing模块中的StandardScaler类,这是一个方便的工具类。具体的解释如下:

• from sklearn.preprocessing import StandardScaler:这一行是导入StandardScaler类的语句,你需要先安装sklearn这个库才能使用它。

• sc_X = StandardScaler():这一行是创建一个StandardScaler对象的语句,你可以用它来对数据集进行标准化。

• X_train = sc_X.fit_transform(X_train):这一行是让StandardScaler对象对训练集X_train进行拟合和转换的语句,你需要传入一个二维数组作为参数。这一步会计算出每个特征的均值和标准差,并保存在StandardScaler对象的mean_和scale_属性中,然后用这些属性对每个特征进行标准化,并返回一个新的数组https://blog.csdn.net/wzyaiwl/article/details/90549391。

• X_test = sc_X.fit_transform(X_test):这一行是让StandardScaler对象对测试集X_test进行拟合和转换的语句,你需要传入一个二维数组作为参数。这一步会计算出每个特征的均值和标准差,并保存在StandardScaler对象的mean_和scale_属性中,然后用这些属性对每个特征进行标准化,并返回一个新的数组https://blog.csdn.net/wzyaiwl/article/details/90549391。

注意,这里有一个常见的错误,就是对训练集和测试集分别使用fit_transform方法。这样做会导致训练集和测试集使用不同的均值和标准差进行标准化,从而破坏数据之间的一致性。正确的做法是只对训练集使用fit_transform方法,然后用transform方法对测试集进行转换,这样就可以保证训练集和测试集使用相同的均值和标准差进行标准化https://www.cnblogs.com/lvdongjie/p/11349701.html。

大多数机器学习算法在计算过程中使用两个数据点之间的欧几里得距离(Euclidean distance),而在量级、单位和范围上变化很大的特征会带来问题。高量级的特征在计算距离时会比低量级的特征更加重要。通过特征标准化或Z-分数归一化完成。引入sklearn.preprocessing库的StandardScaler