最近一直在学习机器学习的知识,入门很难。之前跟着吴恩达老师的视频在学习,发现还是有很多的知识点难以理解。前不久,《机器学习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),虽然也能归一化,但是两个结果是不在同一个“标准”下的,具有明显的差异。
Be First to Comment