机器学习一:数据预处理

最近一直在学习机器学习的知识,入门很难。之前跟着吴恩达老师的视频在学习,发现还是有很多的知识点难以理解。前不久,《机器学习A-Z》出了中文翻译,老师讲的非常浅显易懂,所以开始跟着学起来了。

 

为了能更系统的整理到学的知识进行一个整理,也作为一个自我监督,接下来就把较为系统的知识点都整理到博客上。相应的代码也会同步到github上。

 

下面所有的代码都是使用Python写的,数据预处理主要用到的是sklearn.preprocessing模块 [ sklearn.apachecn.org/cn/0.19.0/m… ]

 

目录

在机器学习一的这部分,我主要说一下数据的预处理。

 

1.导入标准库

numpy:包含很多机器学习需要用到的数学方法
matplotlib.pyplot:主要用于绘图
pandas:导入数据集以及对数据集进行一系列的处理

import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd
复制代码

 

2.导入数据集

 

iloc数组中参数:逗号左边表示行数,逗号右边表示列数,冒号表示选择所有行或者列

 

# Import the dataset
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:,3].values
复制代码

 

3.缺失数据

一般处理数据缺失的方法包括平均数填充、中位数填充,众数填充。在Imputer类中的strategy的可选参数中可以进行选择。

 

Imputer这个类主要用于缺失数据的处理 参数axis:

axis = 0 取一列的平均值
axis = 1 取一行的平均值

参数strategy: strategy : string, optional (default=”mean”) The imputation strategy.

If “mean”, then replace missing values using the mean along the axis.
If “median”, then replace missing values using the median along the axis.
If “most_frequent”, then replace missing using the most frequent value along the axis.

# Taking care of missing data
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values="NaN",strategy="mean",axis=0)
imputer.fit(X[:,1:3])  #代表1和2
X[:,1:3] = imputer.transform(X[:,1:3])
复制代码

 

4.分类数据

 

4.1. 标签编码

 

作用:将文本转换为数字

缺点:在开始的时候不同的国籍并没有数值的区分,将不同的国家转换为数值之后0,1,2之后,对于不同的类就有大小之分,所以对不同的类进行了排序。

 

解决方案:独热编码(虚拟编码)

 

4.2. 独热编码(虚拟编码)(dummy coding)

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:,0])
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)
# Encode labels with value between 0 and n_classes-1(将不同组的名称转换为数字)
复制代码

 

5.将数据集划分为训练集和测试集

test_size:0到1之间,默认值为0.25 一般情况下比较好的为0.2或者0.25
random_state:决定随机数生成的方式

# splitting dataset into Training set and Test set
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)
复制代码

 

6.特征缩放

 

为什幺要对数据进行特征缩放?

 

欧氏距离(两个点之间线段的长度),在很多机器学习的算法中非常重要。

 

将不同数量级的数据缩放到同一个数量级,如果不进行特征缩放,年龄在工资的比较下影响就会变得非常小。

 

为了解决这个问题,我们需要将Age和Salary缩放到同一个数量级里面。

6.1. 标准化(Standardisation)

 

得到的新的数据平均值为0,并且方差为1 运用在支持向量机、逻辑回归、类神经网络

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
复制代码

 

6.2. 归一化(Normalisation)

 

将所有的值投射到0和1之间

import sklearn.preprocessing as sp
mms = sp.MinMaxScaler(feature_range=(0,1))
mms_samples2 = mms.fit_transform(raw_samples)
复制代码

 

7.数据预先处理模板

 

import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd
# Import the dataset
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:,3].values
# Taking care of missing data
from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values="NaN",strategy="mean",axis=0)
imputer = Imputer()
test = imputer.fit(X[:,1:3])
X[:,1:3] = imputer.transform(X[:,1:3])
# Encoding categorical data
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:,0])
onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)
# Splitting the dataset into the Training set and Test set
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
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
复制代码

 

8.问题

 

8.1. fit、fit_transform、transform之间的区别?

fit():简单来说,就是求得训练集的均值、方差、最大值、最小值,也就是训练集X的属性,可以理解为一个训练过程;
Transform():在fit的基础上,进行标准化、降维、归一化等操作;
fit_transform():是fit和transform的组合,既包含训练又包含转换。

注意:

 

 

    1. 必须先用fit_transform(trainData),之后再用transform(testData);

 

    1. 如果直接使用transform(testData)会报错;

 

    1. 如果fit_transform(trainData)后,使用fit_transform(testData)而不是transform(testData),虽然也能归一化,但是两个结果是不在同一个“标准”下的,具有明显的差异。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注