Uploaded by 丁昊

机器学习第15周 77-83

advertisement
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
Download