这是github上的一个项目,地址在这儿,作者@# Avik-Jain。
Step 1:导入库
练习中,这两个重要的库每次都要导入。Numpy包含数学函数,Pandas用于导入和管理数据集。
代码语言:javascript复制import numpy as np
import pandas as pd
Step 2:导入数据
数据集一般采用.csv格式。csv文件中,表格数据使用文本格式保存。每行为一条记录。我们使用read_csv方法读取csv文件保存到dataframe中,然后从dataframe中分离出矩阵和向量。
代码语言:javascript复制dataset = pd.read_csv('../datasets/Data.csv')
X = dataset.iloc[:,:-1].values
Y = dataset.iloc[:,3].values
Step 3:处理缺失数据
获得的数据极少是规范的。因为各种原因,数据有可能缺失。缺失的数据需提前处理,以防影响我们的机器学习训练。一般用平均数或中位数代替缺失的值。Imputer类可以完成这个任务。
Imputer类提供了使用缺失值所在的行或列的均值、中值或最频繁值来替代缺失值的基本策略。此类还允许其他不同的缺失值编码。
代码语言:javascript复制from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
imputer = imputer.fit(X[:,1:3])
X[:,1:3] = imputer.transform(X[:,1:3])
Step 4:编码分类数据
分类数据往往是字符而不是数字。分类数据可能的值一般是有限的。例子中的Yes和No由于不是数字,不能参加数字运算,所以我们需要将其转为数字。我们导入LabelEncoder库,实现这个转换。
- LabelEncoder: 编码值介于0和n_classes-1之间的标签,还可用于将非数字标签(只要它们可比较)转换为数字标签。
- OneHotEncoder: 使用K-K方案对分类整数特征进行编码。
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])
创建虚拟变量
有时候,特征不是连续值而是分类。例如,一个人可能具有如下特征:[“男性”,“女性”],[“来自欧洲”,“来自美国”,“来自亚洲”],[“使用Firefox”,“使用Chrome”,“使用Safari”, “使用Internet Explorer”]。这些特征可以编码为整数,例如[“男性”,“来自美国”,“使用Internet Explorer”]可以表示为[0,1,3],而[“女性”,“来自亚洲”,“使用Chrome“]将是[1,2,1]。
这样的整数不能直接与scikit-learn估计器一起使用,因为它们期望连续输入的值,并且将类别解释为有序的,这通常是我们不期望的(即,浏览器集是任意排序的)。
将分类特征转换为可与scikit-learn估计器一起使用的特征的一种方法,是使用OneHotEncoder实现的K或热编码。该估计器将每个具有m个可能值的分类特征转换为m个二进制特征,其中只有一个是有效的。
代码语言:javascript复制onehotencoder = OneHotEncoder(categorical_features = [0])
X = onehotencoder.fit_transform(X).toarray()
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
Step 5:分类训练和测试数据
我们将数据分成两部分,一部分用于训练模型,被成为训练集,另一部分用于测试训练模型的性能,我们称之为测试集。一般来说,区分训练集和测试集遵从80/20原则。
代码语言:javascript复制from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
Step 6:特征标准化
绝大多数机器学习算法在计算中使用欧几里德几何计算两点之间的距离,特征值对量级、单位、取值范围高度依赖。在距离计算时,高数量级特征比低数量级特征有更高的权重。我们用特征标准化或Z分布解决这个问题。
代码语言:javascript复制from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)