chapter 5 用转换器抽取特征(感觉有点特征工程的意思)
本章所讨论的是如何从数据集中抽取数值和类别型特征,并选出最佳特征。
特征抽取
对于各个实物,我们只有先把现实用特征表示出来,才能借助数据挖掘的力量找到问题的答案。特征选择的另一个优点在于降低真实世界的复杂度。
dataframe中的unique函数有点类似于SQL中的distinct,能把一列中互不相同的元素筛选出来。
数据离散化:条件判断,划分。
特征选择
sklearn中的VarianceThreshold转换器可用来删除特征值的方差达不到最低标准的特征。
from sklearn.feature_selection import VarianceThreshold
vt = VarianceThreshold()
xt = vt.fit_transform(x)
输出xt后,会发现不符合要求的列消失了。print(vt.variances_) #输出每一列的方差
选择最佳特征
sklearn提供了几个用于选择单变量特征的转换器:
SelectKBest返回k个最佳特征
SelectPercentile返回表现最佳的前r%个特征
单个特征和某一类别之间相关性的计算方法有很多。常用的有卡方检验、互信息、信息熵等。
使用SelectKBest转换器类,用卡方函数打分
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
transformer = SelectKBest(score_func=chi2, k=3)
xt_chi2 = transformer.fit_transform(x, y)#对数据集进行预处理和转换,结果为分类效果较好的三个特征
print(transformer.scores_)#打印每一列的相关性
PCA
from sklearn.decomposition import PCA
pca = PCA(n_components = 5)
xd = pca.fit_transform(x)
创建自己的转换器
转换器有两个关键函数。
fit():接收训练数据,设置内部函数。
transform():转换过程。接收训练数据集或相同格式的新数据集。
转换器接收numpy数组作为输入,根据均值将其离散化。任何高于均值的特征值替换为1,小于或等于均值的替换为0.
from sklearn.base import TransformerMixin
from sklearn.utils import as_float_array
class MeanDiscrete(TransformerMixin):
def fit(self, x):
x = as_float_array(x)
self.mean = x.mean(axis = 0)
return self
def transform(self, x):
x = as_float_array(x)
assert x.shape[1] == self.mean.shape[0]
return x > self.mean
chapter 6 使用朴素贝叶斯进行社会媒体挖掘
N元语法
比起用单个词做特征,使用N元语法能更好地描述文档。N元语法是指由几个连续的词组成的子序列。拿本章用的数据集来讲,N元语法指的就是每条消息里一组连续的词。
N元语法的计算方法跟计算单个词语方法相同,把构成N元语法的几个词看成是词袋中的一个词。数据集中每一项就变成了N元语法在给定文档中的词频。
比如,“厉害了我的国”,设N = 3,则这句话的3元语法为,“厉害了”、“害了我”、“了我的”、“我的国”。
N元语法比起单个词,可有助于理解词语用法的上下文信息、有助于发现拼写错误。它的缺点是特征矩阵变得更为稀疏。
当用流水线组合起来后,为了得到模型,就用流水线的fit函数,创建模型。借助流水线的named_steps属性和步骤名,就能访问流水线的每一个步骤。如,可访问朴素贝叶斯模型。
model = pipeline.fit(x, y)
nb = model.named_steps['naive-bayes']