📜  如何在部署机器学习模型之前准备数据?

📅  最后修改于: 2022-05-13 01:54:35.718000             🧑  作者: Mango

如何在部署机器学习模型之前准备数据?

以您想要的形式获得精确的数据是非常罕见的。在构建和部署机器学习模型之前,数据预处理是至关重要的第一步。在构建模型时,并不是每次都能获得干净且格式化的数据来处理。使用前必须清理和检查数据。因此,我们对这些使用数据预处理。在构建我们应该执行的模型之前,让我们检查一些步骤。

  1. 获取数据集
  2. 导入库
  3. 导入数据集
  4. 寻找缺失值
  5. 编码分类数据
  6. 在训练和测试集中拆分数据
  7. 特征缩放

1. 获取数据集

我们需要的第一件事是数据集,因为机器学习完全适用于数据集。以特定格式收集的数据称为DATASET。非常有必要很好地理解您的数据集以进行处理。因为数据集可能出于不同的目的采用不同的格式。并且您需要非常了解数据集以构建和分析模型。为了在我们的代码中使用数据集,我们基本上以 CSV 格式或 xlsx(Excel) 格式使用它。

2. 导入库

为了使用Python执行数据预处理,我们需要导入一些预定义的Python库。为了执行某些特定任务,这些库非常有用。

  • Numpy Numpy Python库用于在代码中执行任何类型的科学和数学计算。
  • Pandas Pandas 是最著名和最有用的Python库,用于导入和管理数据集。 Pandas 是开源数据,可在Python中提供高性能数据操作。
  • Matplotlib 为了可视化我们的结果并更好地查看数据,Matplotlib 非常重要。使用这个库,我们需要导入一个名为Pyplot的子包。该库用于绘制任何类型的图或图表。
Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


Python
data = pd.read_csv('dataset.csv')


Python
x = data.iloc[:,:-1].values


Python
y = data.iloc[:,-1].values


Python
y = data['Survived']


Python
# CATEGORICAL DATA
from sklearn.preprocessing import LabelEncoder
le_x = LabelEncoder()
x['State'] = le_x.fit_transform(x['State'])


Python
from sklearn.preprocessing import OneHotEncoder
onehot_encoder = OneHotEncoder(categorical_features = ['State'])
x = onehot_encoder.fit_transform(x).toarray() 
  
# or
x = pd.get_dummies(x['gender'])


Python
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_state = 0)


Python
from sklearn.preprocessing import StandardScaler


Python
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)


Python
# Importing libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  
# import dataset
data = pd.read_csv('datasets/Titanic.csv')
  
# extract dependent and independent features
x = data.drop('Survived', axis = 1)
y = data['Survived']
  
# Missing value Imputation
# drop the unrelaven features
x.drop(['Name', 'Ticket', 'Cabin'], 
       axis = 1, inplace = True)
  
# numeric value imputation with mean
x['Age'] = x['Age'].fillna(x['Age'].mean())   
  
# categorical value imputation with mode(most frequent category)
x['Embarked'] = x['Embarked'].fillna(x['Embarked'].mode()[0])
  
# category encoding
x = pd.get_dummies(x, columns = ['Sex', 'Embarked'],
                   prefix = ['Sex', 'Embarked'], 
                   drop_first = True)
  
# 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,
                                                    random_state = 0)
  
# feature scaling
from sklearn.preprocessing import StandardScaler
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)


在 Jupyter 笔记本中

3. 导入数据集

现在,是时候导入我们为机器学习模型收集的数据集了。在导入数据集之前,请确保将当前目录设置为工作目录。现在要导入数据集,请使用 pandas 库的read_csv() ,该库用于读取 CSV 文件并对其执行各种操作。还有各种其他选项可用于读取不同格式的文件,例如read_excel()用于读取 excel 文件。

Python

data = pd.read_csv('dataset.csv')

数据集是变量的名称,该变量将加载的数据集存储为以 CSV 格式命名为数据集的文件。这是一个带有称为 Titanic 数据集的随机数据集的示例,您可以在此处下载。

在 Jupyter 笔记本中

提取因变量和自变量:探索过滤后的数据集后,您需要创建自变量矩阵和因变量向量。首先,您应该决定并确认您使用哪些列或因子作为自变量(也称为特征)来训练影响目标变量的模型。例如,如果目标列是数据集的最后一列,那么您可以轻松创建自变量矩阵,如下所示:

Python

x = data.iloc[:,:-1].values

这里,第一个冒号(:)表示我们想要数据集中的所有行。 :-1表示我们要获取除最后一列之外的所有列。 .values意味着我们想要获取所有值。如果目标变量最终不像我们的情况(Survived)那样,那么我们可以删除它并采用训练集中的所有其他列。例子:

在 Jupyter 笔记本中

并取因变量的向量,它只是数据集的最后一列,您可以写为:

Python

y = data.iloc[:,-1].values

或者用这个方法,

Python

y = data['Survived']

4. 处理缺失值

丢失的数据会给结果带来巨大的问题,因此有必要将它们从数据集中删除。缺失数据是最常见的问题,也是数据清洗中涉及的重要步骤。缺失值通常采用NaN 或 NONE的形式。缺失值的原因是:有时列中的大部分字段都是空的,需要用正确的数据填充,有时会出现不正确的数据或数据质量差,从而对输出产生不利影响。有几种方法可以处理缺失值并填充它们:

  • 处理 NULL 值的第一种方法:您可以简单地删除具有 NULL 值的行或列。但大多数时候这可能会导致信息丢失,因此这种方法效率不高。
  • 另一个重要的方法是填充数据来代替 NULL 值。您可以计算特定行和列的平均值并填充它来代替 Null 值。该方法非常有用,其中列具有数字数据,例如年龄、薪水、体重、年份等。
  • 您还可以决定用同一列中紧随其后的任何值来填充缺失值。

这些决定取决于数据的类型,以及您想用数据绘制的结果。如果缺失值较少,则最好删除它们,如果缺失值超过 50%,则需要填充正确的数据。

在 Jupyter 笔记本中

此处,客舱列包含大约 55% 的缺失数据。 name 和 ticket 列在预测人的生存率方面效率不高,因此请删除对预测不重要的列,否则它们会损害您的机器学习模型的准确性。

5. 编码分类数据

机器学习适用于数学和数字(浮点型或整数型)。然而,经常发生数据集中有一些具有分类值(字符串类型)的列,我们想用它们来训练我们的模型。在这种情况下,我们必须将类别值转换为数字类型。例如,数据集中有一个性别列,其中包含需要转换为数值的男性和女性,然后我们可以简单地转换它,就像我们可以将 0 分配给男性,将 1 分配给女性并在其上训练我们的模型。它主要发生在许多列中,例如州名、国家/地区、颜色等。要将值转换为数字,我们可以简单地使用 SKLEARN 具有类名LabelEncoder()预处理库。例如,我们将 state 列转换为数值。

Python

# CATEGORICAL DATA
from sklearn.preprocessing import LabelEncoder
le_x = LabelEncoder()
x['State'] = le_x.fit_transform(x['State'])

在上面的代码中,我们从sklearn导入了预处理库的LabelEncoder类。该类已成功将变量编码为数字。如果有更多的数字编码,例如 0,1,2,那么机器学习模型会假设这之间存在某种关系,并且通过这些,模型预测的输出将是错误的,性能会降低。因此,为了避免这个问题,我们将使用虚拟变量。

虚拟变量:虚拟变量是只有 0 和 1 的变量。在我们的数据集中,如果我们有 3 个值 0,1 和 2,那么它会将其转换为 0 和 1。为此,我们将使用OneHotEncoder()类预处理库。当列中的类别较少时使用它,例如性别列具有男性和女性的值,然后可以将其编码为 0,1。

Python

from sklearn.preprocessing import OneHotEncoder
onehot_encoder = OneHotEncoder(categorical_features = ['State'])
x = onehot_encoder.fit_transform(x).toarray() 
  
# or
x = pd.get_dummies(x['gender'])

6. 将数据集拆分为训练集和测试集

将数据集拆分为训练集和测试集的数据预处理非常关键的步骤。通过执行此步骤,我们可以以更好、更有效的方式提高模型的性能和准确性。如果我们在不同的数据集上训练模型并使用与训练完全不同的数据集对其进行测试,那么模型将难以估计自变量和因变量之间的创建,并且模型的准确性将非常低。因此,我们总是尝试制作一个在训练集和测试集上都表现良好的机器学习模型。

  • 训练集:用于训练模型的数据集子集,输出对我们来说也是已知的。
  • 测试集:用于测试模型的数据集子集,该模型根据给定模型的训练预测输出。

为此,我们使用 sklearn 中model_selection库的train_test_split类。

Python

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_state = 0)
  • x_train:训练集的自变量(特征)
  • y_train:测试数据的特征
  • x_test:因变量训练数据
  • y_test:自变量测试数据

train_test_split()中,我们传递了 4 个参数,其中两个是数组,第三个是 test_size,它定义了测试数据的大小。这里我们取了 20% 的数据作为测试,所以给定为 0.2,剩下的 80% 将提供给训练集。最后一个参数 random_state 用于为随机生成器设置种子,以便您始终获得相同的结果。

7. 特征缩放

机器学习模型的最后一步是特征缩放。这是一种在特定范围内标准化训练数据集的方法。在特征缩放中,所有值都保持在相同的范围和相同的尺度上,以便没有变量支配另一个变量。例如,我们在训练数据集中有年龄和薪水,那么它们与年龄是 31 和薪水是 48000 不在同一个尺度上。由于机器学习模型是基于欧几里德距离的,如果我们没有对变量进行缩放,它将导致结果和性能的问题。

对于特征缩放,我们使用预处理中的StandardScaler 图书馆。

Python

from sklearn.preprocessing import StandardScaler

现在,我们将为自变量创建 StandardScaler 类的对象。然后我们将拟合和转换训练数据集。对于测试数据集,我们将直接应用转换函数,因为它已经在训练数据集中完成了。

Python

std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)

作为输出,变量在 -1 到 1 之间缩放。执行这些步骤后拟合模型,预测和部署它,然后测试模型的准确性。它将给出准确的结果,并且模型的准确度将始终高于 90%。

结合以上所有步骤

现在,最后,我们将结合所有步骤,使代码更具可读性和可理解性。

Python

# Importing libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  
# import dataset
data = pd.read_csv('datasets/Titanic.csv')
  
# extract dependent and independent features
x = data.drop('Survived', axis = 1)
y = data['Survived']
  
# Missing value Imputation
# drop the unrelaven features
x.drop(['Name', 'Ticket', 'Cabin'], 
       axis = 1, inplace = True)
  
# numeric value imputation with mean
x['Age'] = x['Age'].fillna(x['Age'].mean())   
  
# categorical value imputation with mode(most frequent category)
x['Embarked'] = x['Embarked'].fillna(x['Embarked'].mode()[0])
  
# category encoding
x = pd.get_dummies(x, columns = ['Sex', 'Embarked'],
                   prefix = ['Sex', 'Embarked'], 
                   drop_first = True)
  
# 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,
                                                    random_state = 0)
  
# feature scaling
from sklearn.preprocessing import StandardScaler
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)

在上面的代码中,我们涵盖了准备数据或数据预处理所需的必要步骤。但是有一些区域和数据集需要所有步骤,在这些情况下,我们可以将它们从我们的代码中排除。