最近一直在学习机器学习的知识,入门很难。之前跟着吴恩达老师的视频在学习,发现还是有很多的知识点难以理解。前不久,《机器学习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的组合,既包含训练又包含转换。
注意:
- 必须先用fit_transform(trainData),之后再用transform(testData);
- 如果直接使用transform(testData)会报错;
- 如果fit_transform(trainData)后,使用fit_transform(testData)而不是transform(testData),虽然也能归一化,但是两个结果是不在同一个“标准”下的,具有明显的差异。
所有评论(0)