这是我参与更文挑战的第3天,活动详情查看: 更文挑战
在进行学习机器学习的开始,首先需要了解的是数据预处理的部分,数据预处理就是将数据准备为可以进行数据拟合与训练的格式,便于我们利用这些数据,我们一般可能需要通过:
- 数据准备
- 处理确实数据
- 标签编码转换
- 虚拟编码转换
- 生成训练集与测试集
- 特征缩放
等几部分进行操作,来准备用与机器学习的数据。
基础库准备
我们一般需要引入numpy
,pandas
,matplotlib
作为基础库来便于我们之后的数据操作
### 导入基础库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
复制代码
数据准备
根据数据准备的格式进行处理,可以通过pandas
来读取常见的数据
dataset = pd.read_csv('Data.csv')
复制代码
读取到的数据,需要根据数据的类型来设为对应的自变量与因变量数据
# 设置自变量列,因变量列
X = dataset.iloc[:,:-1]. values
Y = dataset.iloc[:,3].values
复制代码
处理确实数据
在自变量数据中会存在部分空数据即缺失数据,我们一般需要对这些缺失数据进行处理并补全,我们这里使用sklearn
的SimpleImputer
来完成这个操作
### 处理缺失数据
from sklearn.impute import SimpleImputer
# 创建imputer对象
# mean 使用平均数进行填充
# mediain 使用中位数进行填充
imputer = SimpleImputer(missing_values=np.nan,strategy= 'median')
# 拟合并计算生成缺失数据
X[:,1:3] = imputer.fit_transform(X[:,1:3])
复制代码
其中SimpleImputer
的参数missing_values
是需要补全的缺失数据类型,参数strategy
是对应的补全策略,常见的有mean
,mediain
等策略。
标签转换编码
标签编码转换是将一些需要处理后使用的字符数据转换为可以进行直接处理的数字编码,如国家
,职位
等数据,在数据处理中只需要将他们转换为1,2,3进行显示,这里使用sklearn
的LabelEncoder
来进行处理。
### 标签转换编码
# 将标签转换为1,2,3
from sklearn.preprocessing import LabelEncoder;
labelencoder_X = LabelEncoder()
# 对自变量列实现数字编码
X[:,0] = labelencoder_X.fit_transform(X[:,0])
# 对因变量列实现数字编码
labelencoder_Y = LabelEncoder()
Y = labelencoder_X.fit_transform(Y)
复制代码
虚拟编码转换
在一些标签数据中,其实并没有大小关系以及顺序,如国家转换为的1,2,3,我们为了排除这些影响,我们需要将他们转换为虚拟编码进行显示,如0 0 1
,0 1 0
,1 0 0
这样,让数据只是来标记他们的类型,而不是其他的关系。
我们这里需要使用sklearn
的OneHotEncoder
与ColumnTransformer
来进行处理
### 虚拟编码
# 将标签转换为0,0,1 0,1,0 1,0,0
from sklearn.preprocessing import OneHotEncoder;
from sklearn.compose import ColumnTransformer
# 进行虚拟编码
onehotEncoder = OneHotEncoder()
# 对第0列实现虚拟编码
ct = ColumnTransformer([("OneHot", OneHotEncoder(),[0])], remainder="passthrough")
X = ct.fit_transform(X)
复制代码
生成训练集与测试集
数据准备好后,我们需要将数据分为训练集与测试集两部分,我们使用sklearn
的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)
复制代码
特征缩放
在数据都准备好之后,可能会有一些其他问题,如数据中的金额可能是1800000元
,年龄可能会是18
岁,这些数据的数量级差别过大,可能在计算对计算结果产生一些影响,我们在一些情况下希望将他们变成相同的数据级进行处理,这时候就需要进行特征缩放处理。
我们使用sklearn
来StandardScaler
来进行特征缩放的处理。
### 特征缩放
# 将不同数量级的数据,缩放到同一数量级
from sklearn.preprocessing import StandardScaler
# 对自变量进行特征缩放
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
复制代码
在此我们基本完成了数据预处理的操作,只有我们就可以对数据进行拟合和训练的处理,我们下一章会来了解关于线性回归的相关内容,完整的数据预处理代码如下:
# 数据预处理
### 导入基础库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
### 导入数据
dataset = pd.read_csv('Data.csv')
# 设置自变量列,因变量列
X = dataset.iloc[:,:-1]. values
Y = dataset.iloc[:,3].values
### 处理缺失数据
from sklearn.impute import SimpleImputer
# 创建imputer对象
# mean 使用平均数进行填充
# mediain 使用中位数进行填充
imputer = SimpleImputer(missing_values=np.nan,strategy= 'median')
# 拟合imputer对象
# 实际是使用拟合结果进行填充
#imputer = imputer.fit(X[:,1:3])
# 计算缺失对象
# X[:,1:3]= imputer.transform(X[:,1:3])
# 可以将拟合与计算两部合并处理
X[:,1:3] = imputer.fit_transform(X[:,1:3])
### 标签转换编码
# 将标签转换为1,2,3
from sklearn.preprocessing import LabelEncoder;
labelencoder_X = LabelEncoder()
# 拟合并转换
X[:,0] = labelencoder_X.fit_transform(X[:,0])
### 虚拟编码
# 将标签转换为0,0,1 0,1,0 1,0,0
from sklearn.preprocessing import OneHotEncoder;
from sklearn.compose import ColumnTransformer
# 对国家列实现虚拟编码
onehotEncoder = OneHotEncoder()
ct = ColumnTransformer([("OneHot", OneHotEncoder(),[0])], remainder="passthrough") # The last arg ([0]) is the list of columns you want to transform in this step
X = ct.fit_transform(X)
# 对因变量列实现数字编码
labelencoder_Y = LabelEncoder()
Y = labelencoder_X.fit_transform(Y)
### 生成训练集与测试集
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)
### 特征缩放
# 将不同数量级的数据,缩放到同一数量级
from sklearn.preprocessing import StandardScaler
# 对自变量进行特征缩放
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
复制代码