专栏名称: Cassie1492949236626
前端开发工程师
今天看啥  ›  专栏  ›  Cassie1492949236626

机器学习一:数据预处理

Cassie1492949236626  · 掘金  ·  · 2018-11-08 02:12
阅读 43

机器学习一:数据预处理

最近一直在学习机器学习的知识,入门很难。之前跟着吴恩达老师的视频在学习,发现还是有很多的知识点难以理解。前不久,《机器学习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);
  2. 如果直接使用transform(testData)会报错;
  3. 如果fit_transform(trainData)后,使用fit_transform(testData)而不是transform(testData),虽然也能归一化,但是两个结果是不在同一个“标准”下的,具有明显的差异。

8.2. 标准化和归一化的区别以及各自作用的场景?

www.jianshu.com/p/95a8f035c…




原文地址:访问原文地址
快照地址: 访问文章快照