4.2.2 类标的编码 '''将类标转化为整数序列''' import numpy as np # 虽然大多数分类预估器会在内部将类标转换为整数 # 但手动实现能从技术角度避免一些问题的产生 # 类标并非有序,且被赋予哪个整数数值并不重要 class_mapping = {label: idx for idx, label in enumerate(np.unique(df['classlabel']))} '''使用映射字典将类标转换为整数''' df['classlabel'] = df['classlabel'].map(class_mapping) '''还原类标''' inv_class_mapping = {v: k for k, v in class_mapping.items()} df['classlabel'] = df['classlabel'].map(inv_class_mapping) '''使用LabelEncoder类可以更方便地对类标进行整数编码''' from sklearn.preprocessing import LabelEncoder class_le = LabelEncoder() # fit_transform方法相当于分别调用fit和transform方法的快捷方式 y = class_le.fit_transform(df['classlabel'].values) '''使用inverse_transform方法还原类标''' class_le.inverse_transform(y) 77 4.2.3 标称特征上的独热编码 '''使用LabelEncoder类转换color属性''' X = df[['color', 'size', 'price']].values color_le = LabelEncoder() X[:, 0] = color_le.fit_transform(X[:, 0]) # 具体编码结果为:blue→0;green→1;red→2 问题:颜色的值没有特定 顺序,但学习算法将假定green大于blue、red大于 green 虽然最终能够生成有用的结果,但可能不是最优解 解决方法:独热编码(one-hot encoding)技术 创建一个新的虚拟特征(dummy feature),虚拟特征的每一列各代表标称数 据的一个值 例如,将color特征转换为三个新的特征:blue、green以及red 蓝色样本可以标识为:blue=1,green=0以及red=0 78 4.2.3 标称特征上的独热编码 '''使用OneHotEncoder类实现独热编码''' from sklearn.preprocessing import OneHotEncoder # 通过categorical_features参数选定要转换的特征所在的位置 ohe = OneHotEncoder(categorical_features=[0]) # 通常情况下,transform方法会返回一个稀疏矩阵 # 稀疏矩阵是存储大型数据集的有效方法 # 特别是在数据包含很多零值时非常有用 # 处于可视化考虑,通过toarray方法将其转换为一个NumPy数组 # 也可以在初始化阶段使用OneHotEncoder(···,sparse=False)来返回NumPy数组 ohe.fit_transform(X).toarray() '''使用get_dummies方法实现独热编码''' # get_dummies方法只对字符串列进行转换,其它列不变 pd.get_dummies(df[['price', 'color', 'size']]) 79 4.3 将数据集划分为训练数据集和测试数据集 '''从UCI机器学习样本数据库中获取葡萄酒数据集''' df_wine = pd.read_csv('https://archive.ics.uci.edu/' 'ml/machine-learningdatabases/wine/wine.data', header=None) # 如果链接失效使用如下代码 # df_wine = pd.read_csv('https://raw.githubusercontent.com/rasbt/python-machinelearning-book/master/code/datasets/wine/wine.data', header=None) df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline'] # 该数据集包含178个葡萄酒样本,通过13个特征对其化学特征进行描述 # 类标分别为1、2、3,对应于三种生长在意大利不同地区的葡萄种类 print('Class labels', np.unique(df_wine['Class label'])) df_wine.head() 80 4.3 将数据集划分为训练数据集和测试数据集 '''划分数据集''' if Version(sklearn_version) < '0.18': from sklearn.cross_validation import train_test_split else: from sklearn.model_selection import train_test_split # 特征赋给X,类标赋给y X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values X_train, X_test, y_train, y_test = \ train_test_split(X, y, test_size=0.3, random_state=0) 81 4.4 将特征的值缩放到相同的区间 特征缩放:将特征的值缩放到相同区间,使算法的性能更佳 如果一个特征值的范围为1~10,另一个的范围为1~100000,则一般的损失函 数将主要根据第二个特征上较大的误差进行权重的优化 特征缩放的两种方法:归一化(normalization)和标准化(standardization) 归一化是指将特征的值缩放到区间 0,1 ,是最小-最大缩放的一个特例 通过如下公式可以计算出一个新的样本𝑥 𝑖 的特征值𝑥𝑛𝑜𝑟𝑚 : 𝑖 𝑖 𝑥𝑛𝑜𝑟𝑚 𝑥 𝑖 − 𝐱 𝑚𝑖𝑛 = 𝐱 𝑚𝑎𝑥 − 𝐱 𝑚𝑖𝑛 其中, 𝑥 𝑖 是一个特定的样本, 𝐱 𝑚𝑖𝑛 和𝐱 𝑚𝑎𝑥 分别是某特征列的最小值和最大值 '''归一化''' from sklearn.preprocessing import MinMaxScaler mms = MinMaxScaler() X_train_norm = mms.fit_transform(X_train) X_test_norm = mms.transform(X_test) 82