可以看到,原来的一列Continent字段变成了三列,分别代表[ 'AM', 'EP', 'LA' ],取值1表明是,取值0表明否。这就是常说的one-hot编码。如果类别变量的取值是整数,则直接用sklearn.preprocessing.OneHotEncoder()即可,把上面代码中LabelBinarizer()替换掉
注意我们必须将对训练集上的变换原封不动的作用到测试集,而不能重新对测试集的数据做变换(详见我之前写的『新手数据挖掘中的几个常见误区』第一节)。
4.3.2. 处理数值变量
一般而言,数值变量不用做太多处理,只需做正规化(normalization)和标准化(standardization)即可,分别对应scikit-learn中的Normalizer和StandardScaler。不过对于稀疏变量,在做标准化的时候要注意,选择不去均值。
其实数值型变量最好也进行离散化,离散手段从基本的等距离散法、按分隔点人为指定,到聚类、输入树模型等,手段很多,在此不详细展开,我会在后续文章中提及。
4.3.3. 处理文本变量
文本在实际问题中很常见,比如用户评论、新闻摘要、视频弹幕等等。我们用的toy_data不包含文本变量,所以这里我参考了scikit-learn的文档,一个小的corpus作为我们的训练数据集。
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
]
corpus有四句话,可以看做是四个样本。接下来我们先用一个简单的方法处理文本变量——统计corpus中每个词出现次数,代码如下:
from sklearn.feature_extraction.text import CountVectorizer
vectorizer1 = CountVectorizer(min_df=1)
temp1 = vectorizer1.fit_transform(corpus)
print vectorizer1.get_feature_names()
print temp1.toarray() # temp1是sparse类型, 转换成ndarray方便查看
运行结果: