机器学习算法完全依赖于数据,因为这是使模型训练成为可能的最关键方面。另一方面,如果无涯教程无法理解这些数据,那么在将其提供给ML算法之前,一台机器将毫无用处。简而言之,对于要机器解决的问题,始终需要提供正确的数据,即正确比例,格式和包含有意义特征的数据。
选择用于机器学习训练的原始数据后,最重要的任务是数据预处理。从广义上讲,数据预处理会将选定的数据转换为无涯教程可以使用的形式或可以提供给ML算法的形式。始终需要对数据进行预处理,以便可以按照机器学习算法的期望进行处理。
拥有以下数据预处理技术,可将其应用于数据集以生成用于ML算法的数据-
数据集很可能包含规模可变的属性,但是无法将此类数据提供给ML算法,因此需要重新缩放,数据重定比例可确保属性具有相同的比例。通常,将属性重新缩放到0到1的范围内,像梯度下降和k最近邻这样ML算法需要缩放的数据可以借助 scikit-learn Python库的 MinMaxScaler 缩放数据。
在此示例中,将重新缩放之前使用的Pima Indians Diabetes数据集的数据。首先,将加载CSV数据(如前几章所述),然后在 MinMaxScaler 类的帮助下,将其重新缩放为0到1。
以下脚本的前几行与在上一章中编写CSV数据时写的相同。
from pandas import read_csv from numpy import set_printoptions from sklearn import preprocessing path = r'C:\pima-indians-diabetes.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(path, names=names) array = dataframe.values
现在,可以使用 MinMaxScaler 类在0和1的范围内重新缩放数据。
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1)) data_rescaled=data_scaler.fit_transform(array)
无涯教程还可以根据选择汇总输出数据。在这里,将精度设置为1,并在输出中显示前10行。
set_printoptions(precision=1) print ("\nScaled data:\n", data_rescaled[0:10])
输出
Scaled data: [[0.4 0.7 0.6 0.4 0. 0.5 0.2 0.5 1. ] [0.1 0.4 0.5 0.3 0. 0.4 0.1 0.2 0. ] [0.5 0.9 0.5 0. 0. 0.3 0.3 0.2 1. ] [0.1 0.4 0.5 0.2 0.1 0.4 0. 0. 0. ] [0. 0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ] [0.3 0.6 0.6 0. 0. 0.4 0.1 0.2 0. ] [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ] [0.6 0.6 0. 0. 0. 0.5 0. 0.1 0. ] [0.1 1. 0.6 0.5 0.6 0.5 0. 0.5 1. ] [0.5 0.6 0.8 0. 0. 0. 0.1 0.6 1. ]]
从上面的输出中,所有数据都重新缩放到0和1的范围内。
另一种有用的数据预处理技术是规范化,这用于将每行数据重新缩放为长度为1,它主要用于稀疏数据集中,其中有很多零。无涯教程可以借助scikit-learn Python库的Normalizer类来重新缩放数据。
在机器学习中,有两种类型的规范化预处理技术,如下所示:
顾名思义,这是一种可以使数据二进制化的技术,可以使用二进制阈值来使数据二进制。高于该阈值的值将转换为1,低于该阈值的值将转换为0。
例如,如果选择阈值= 0.5,则其上方的数据集值将变为1,而低于此值的数据集值将变为0。这就是为什么可以将其称为二值化数据或 thresholding 数据。当数据集中有几率并希望将其转换为清晰的值时,此技术很有用。
无涯教程可以借助 scikit-learn Python库的 Binarizer 类对数据进行二值化
在此示例中,将重新缩放之前使用的Pima Indians Diabetes数据集的数据。首先,将加载CSV数据,然后在 Binarizer 类的帮助下,将根据阈值将其转换为二进制值,即0和1。以0.5为阈值。
以下脚本的前几行与在上一章中编写CSV数据时写的相同。
from pandas import read_csv from sklearn.preprocessing import Binarizer path = r'C:\pima-indians-diabetes.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(path, names=names) array = dataframe.values
现在,无涯教程可以使用 Binarize 类将数据转换为二进制值。
binarizer=Binarizer(threshold=0.5).fit(array) Data_binarized=binarizer.transform(array)
在这里,显示输出中的前5行。
print ("\nBinary data:\n", Data_binarized [0:5])
输出
Binary data: [[1. 1. 1. 1. 0. 1. 1. 1. 1.] [1. 1. 1. 1. 0. 1. 0. 1. 0.] [1. 1. 1. 0. 0. 1. 1. 1. 1.] [1. 1. 1. 1. 1. 1. 0. 1. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1.]]
另一种有用的数据预处理技术,基本上用于转换具有高斯分布的数据属性,它使平均值和SD(标准偏差)与平均值为0和SD为1的标准高斯分布不同,此技术在ML算法(如线性回归,逻辑回归)中很有用,该算法假设输入数据集中的高斯分布并产生更好的输出输出与重新缩放的数据。可以在 scikit-learn Python库的 StandardScaler 类的帮助下标准化数据(平均值= 0和SD=1)。
在此示例中,无涯教程将重新缩放之前使用的Pima Indians Diabetes数据集的数据。首先,将加载CSV数据,然后借助 StandardScaler 类将其转换为平均值= 0和SD=1的高斯分布。
以下脚本的前几行与在上一章中编写CSV数据时写的相同。
from sklearn.preprocessing import StandardScaler from pandas import read_csv from numpy import set_printoptions path = r'C:\pima-indians-diabetes.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(path, names=names) array = dataframe.values
现在,无涯教程可以使用 StandardScaler 类重新缩放数据。
data_scaler=StandardScaler().fit(array) data_rescaled=data_scaler.transform(array)
还可以根据选择汇总输出数据。在这里将精度设置为2,并在输出中显示前5行。
set_printoptions(precision=2) print ("\nRescaled data:\n", data_rescaled [0:5])
输出
Rescaled data: [[ 0.64 0.85 0.15 0.91 -0.69 0.2 0.47 1.43 1.37] [-0.84 -1.12 -0.16 0.53 -0.69 -0.68 -0.37 -0.19 -0.73] [ 1.23 1.94 -0.26 -1.29 -0.69 -1.1 0.6 -0.11 1.37] [-0.84 -1. -0.16 0.15 0.12 -0.49 -0.92 -1.04 -0.73] [-1.14 0.5 -1.5 0.91 0.77 1.41 5.48 -0.02 1.37]]
大部分sklearn函数都希望数据使用数字标签而不是文字标签,因此,无涯教程需要将此类标签转换为数字标签,此过程称为标签编码,可以借助 scikit-learn Python库的 LabelEncoder()函数对数据执行标签编码。
在以下示例中,Python脚本将执行标签编码。
首先,如下导入所需的Python库:
import numpy as np from sklearn import preprocessing
现在,需要提供输入标签,如下所示:
input_labels=['red','black','red','green','black','yellow','white']
下一行代码将创建标签编码器并对其进行训练。
encoder=preprocessing.LabelEncoder() encoder.fit(input_labels)
脚本的下几行将通过编码随机有序列表来检查性能-
test_labels = ['green','red','black'] encoded_values = encoder.transform(test_labels) print("\nLabels =", test_labels) print("Encoded values =", list(encoded_values)) encoded_values = [3,0,4,1] decoded_list = encoder.inverse_transform(encoded_values)
无涯教程可以在以下python脚本的帮助下获取编码值的列表-
print("\nEncoded values =", encoded_values) print("\nDecoded labels =", list(decoded_list))
输出
Labels=['green', 'red', 'black'] Encoded values=[1, 2, 0] Encoded values=[3, 0, 4, 1] Decoded labels=['white', 'black', 'yellow', 'green']
祝学习愉快!(如果内容有误?选中内容 -> 右键 -> 编辑提交!)