特征工程
机器学习流程
数据
任务
模型
特征
模型评价
数值
标量,向量,空间
- 标量 单独的数值称之为标量
- 有序的标量列表
- 空间 向量位于向量空间
处理计数
-
二值化
- 就是把数据变成0或1的形式可以减少不同样本的特殊性
- 数量的多少不会决定现二选一的情况,比如去过北京和没去过,和多少次没关系,就可以用二值化
-
区间量化
-
在数据中有离群点可能会造成相似度的影响,我们需要区间量化,去除实际值,就是将连续的数值,映射到离散型数值,可以看成有序的分箱序列,表示对密度的测量
-
固定宽度的分箱
- 线性分箱,只需要用计数除以宽度,取整就行
- 跨越多个数量级的可以用10幂,可以用对数计算
-
分位数分箱
- 如果数据有断崖的分布的特质,我们就需要使用自适应的箱体定位,不会产生太多的空箱,这个就需要使用数据的分位数来实现
- 中位数
- 十分位数
- 可以使用pandas.Dataframe.quantile和Series的计算分位数.pandas.qcut()可以将数据映射到所需要的分位数
-
对数变换
- 可以对大数进行压缩,小数进行放大,但是有个要防止的就是有零的时候会有个突变
- R方分数模型,它是衡量训练出来的回归模型对新值预测的能力,R值越大模型越好,R可以是负数,用10折交叉验证(skleain.model_selection.cross_val_score),我们不仅可以得到训练的分数,还可以比较两个模型的差异
- 我们在运用对数变换是一定要注意数据中的零值,如果加一对数据影响有限,或许可以为了对数变换的好处,加一处理,
-
指数变换
- 指数变换就是簇变换,对数变换就是他的一个特例
它们的方差稳定的.方差稳定表示是没有严重的重尾 - 使用Box-Cox变换,在scipy.stats中
- 指数变换就是簇变换,对数变换就是他的一个特例
-
特征缩放/归一化
-
因为有些模型输入时平滑函数,又比如线性回归,逻辑回归,包含矩阵模型,都会受到数据大尺度的变化会有影响,如果是决策树则不会受到影响,数值再大,在一个边缘叶子节点就被纯化了,如果对数据敏感就需要进行数据缩放,也就是说会改变数据的尺度,又被称之为归一化
-
min-max 缩放
- x = (x-min(x))/(max(x)-min(x))
- 将数据压缩(扩张)到区间0-1之间
- 在稀疏特征上进行min-max归一化一定要慎重,会把稀疏矩阵转化为密集矩阵,会对计算造成很大的负担
-
特征标准化/方差缩放
- 先减去平均值,在除以方差
- 缩放后特征值均值为0,方差为一
-
ℓ**2归一化
- 将初始数据除以欧几里得范数
- x = x/||x||2
- ||x||2 = sqrt(x12+x22+…xn**2)
- 这时数列的范数为1 ,
交互特征
- 两个特征的乘积可以组成一个交互特征
- 交互特征可以看成and的逻辑关系,比如年龄和地点的交互就是18岁在某地做某事的可能性会更大一些
- 虽然交互特征构造简单,却增加了代价,如果是线性模型中的交互特征会让训练和评价的时间从O(n)变成O(n**2)
- 我们可以在构造了交互特征后精选一些交互特征
特征的选取
-
特征选取就是精简掉对预测贡献小的,或者说影响小的,用来降低模型的复杂度,在对预测影响不大或在可接受范围内,提高计算速度,特征选择不是为了减少训练时间而是减少评分时间
-
过滤
- 去除对模型不太有用的数据.我们可以计算出每个特征与响应变量之间的相关性和互信息.过滤掉一些在阈值下面的特征
- 在这个过程中一定要注意不要把有用的特征在进入训练之前被删了
-
打包方法
- 打包是一种代价较大的方法,会实验特征的各个子集,不会意外的删除那些对本身不体现价值,配合其他特征却非常有用的特征,给特征子集给出合理评分的黑盒子,它们使用另一种方法对特征子集进行迭代优化
-
嵌入式方法
- 特征选择作为训练模型过程中的一部分,对决策树就是与生俱来的能力,是对上面两种的一种平衡
文本数据:扁平化,过滤,和分块
元素袋:将自然为本转换为扁平的向量
-
在机器学习的模型和构建特征,季简单又可以解释结果,这个自然是最好的.简单明了的特征不一定最准确的,但在简单的基础上绝对必要的情况下添加复杂性是必要的
-
词袋
- 就是把一个文档映射到高维空间中,把文档的每个词作为一维,频率作为度量,就可以轻松的把一个文档映射到高维进行聚类,只是在进行画词的时候就把语义破话掉.不过这是一种简单的启发式方法
-
n元词袋
- nn-gram 能够更多地保留文本中的初始序列结构,因此 n 元词袋表示法可以表达更丰富的信 息。然而,这不是没有代价的。理论上,有k 个不同的单词,就会有k2 个不同的2-gram (又称二元词)。实际上,没有这么多,因为不是每个单词都可以跟在另一个单词后面。尽 管如此,n-gram(n>1)一般来说也会比单词多得多。这意味着n 元词袋是一个更大也更 稀疏的特征空间,也意味着n 元词袋需要更强的计算、存储和建模能力。n 越大,能表示 的信息越丰富,相应的成本也会越高gram 能够更多地保留文本中的初始序列结构,因此 n 元词袋表示法可以表达更丰富的信 息。然而,这不是没有代价的。理论上,有k 个不同的单词,就会有k2 个不同的2-gram (又称二元词)。实际上,没有这么多,因为不是每个单词都可以跟在另一个单词后面。尽 管如此,n-gram(n>1)一般来说也会比单词多得多。这意味着n 元词袋是一个更大也更 稀疏的特征空间,也意味着n 元词袋需要更强的计算、存储和建模能力。n 越大,能表示 的信息越丰富,相应的成本也会越高
使用过滤获取清洁特征
-
停用词
- 分类和提取通常不需要对文本进行深入了解
- 像在粗颗粒度中像冠词代词,介词,是没有价值的.
- 在情感分析中的需要对语义进行细粒度的深刻理解
-
基于频率的过滤
- 在提取中我们可以用人工定义的方法,或用具有统计性的方法找到没有意义的词,在单词过滤中我们也可以运用这种方法,也可以使用频率统计
- 高频词:频率统计有助于集于频率的过滤技术与停用词列表接合起来,如何划分两者的边界是一个问题.
- 罕见词:一般都是噪声,要么是生僻词,也有可能是错词,对分布就是重尾分布,会增加存储,计算,模型,训练的,却收效甚微,可以通过频率过滤,将其放入垃圾箱中并标记
-
词干提取
- 文本的简单解析有一个问题,就是同一个单词的各种变体会被视为不同的词而分别计数,把含义相近的映射成同一单词,文本解析会更好
- 基于语言学,统计观测,有一种算法子类综合了词性标注和语言 规则,这种处理过程称为词形还原
意义单位:从单词,n元词到短语
-
解析与分词
- 当字符串中不单纯的是文本时就需要我们解析
- ,如果不解析有些特定的结构数据就会变成普通的文本信息,会丢失大量的信息
- 在分词时需要知道开始和结束的标准,比如英文中空格就是标志的开始和下一个词的开始,只有对每个句子进行分词才能得到单词
- 需要分词程序可以解析对应的编码格式
-
通过搭配提取进行短语检测
-
搭配是一种表达方式,用我们约定俗成的事务进行说明
-
通过标记序列我们可以得到一个n元词列表
-
搭配能表达的意义比组成他的各个单词的总数和还要多,所以单词计数不能完全表达它的意义.词袋就不够了,因为n元词袋中有太多额无意义的序列,有意义的序列太少
-
所以搭配是一种非常好的特征,一种是人工穷举包含多种语言习惯的综合性列表,这个方法肯定有效,可能从某种程度上看是最好好的方法,开始需要频繁的更新和干预,可以用在特定的领域,对于新闻微博就不行了
-
使用统计的方法可以找出短语,建立一个短语与管用语的固定不同,统计性的搭配提取方法可以根据不断的发展变化的数据中找出最流行的用语
-
基于频率的方法
- 频率高的词语不一定是有用的,大多数四平淡无奇毫无意义的
-
用于搭配提取的假设检验
- 对于两个经常同时出现的词,它们同时出现的概率是否远高于有偶然才同时出现的概率.能回答的这个问题统计学手段就是假设检验
-
特征缩放的效果:从词袋到ti_idf
它们能体现出感情,这是一个非常宝贵的信息,我们需要的是能强调出有意义的词的表达方式
tf-idf :词袋的一种简单扩展
- 这是一个基础词袋的扩展,就是某个单词在总数据文档中所占的比例,又称为逆文档率,如果一个单词出现在其他文档的参数越少,什么这就是一个特征
- 如果将 tf-idf 定义为:
tf-idf(w, d) = bow(w, d) * log(N / 单词 w 出现在其中的文档数量 ) - 当该单词,会在每个训练文档中逆文档率等于1log的值就会是0,当单词出现的越少逆文档率就会越高,用logjiuhui极大的压缩特征,这样就会忽略所有的常用词
tf-idf方法测试
- tf-idf通过乘以一个常数,对单词计数特征进行了转化,因此这是一个特征缩放.
创建分类数据集
- 因为训练的数据量比较大,所以我们取它的一个子集,因为样本量分类的数据类别不平衡
- 我们需要选择样本比例来平衡数据的级别相当
- 我们可以用7/3的选择训练集和测试集
- 在训练数据中包含多少个唯一词,这个就是词袋表示法的特征数量
使用tf-idf变换来缩放词袋
- 对应先做tf-idf还是后做tf-idf再做归一化都是一样的
- 测试集的特征缩放
特征缩放的妙处在于,它要求我们知道一些实际中我们很可能不知道的特征统计量,比如平均值,方差,文档频率,t**2范数等等. - 为了计算出 tf-idf 表示,我们必须基于训练数据计算出逆文档频率,并用这些统计量既缩放训 练数据也缩放测试数据。在 scikit-learn 中,在训练数据上拟合特征转换器相 当于收集相关统计量。然后可以将拟合好的特征转换器应用到测试数据上。
- 当使用训练数据统计量来缩放测试数据时,结果看上去会有点奇怪。测试集上的 min-max 缩放不会严格地映射到 0 和 1 之间。ℓ2 范数、均值和方差统计量看上去也有点不对劲。这 是仅次于缺失数据的一个问题
- 如果测试集中含有没出现在训练集中的单词, 那么这些新单词就没有可用的文档频率。通常的解决方法是直接将测试集中的新单词删 除。这看上去有点不负责任,但模型——通过训练集得出的模型——真的不知道如何处理 这些单词。另外一种稍微温柔一点的做法是,显式地设置一个“垃圾词”特征,将所有低频词都映射到这个特征,包括训练集中的低频词。这种方法在 3.2.2 节的“罕见词”部分 讨论过
使用逻辑斯蒂回归进行分类
- 事与愿违,结果显示准确率最高的分类器使用的是词袋特征,这真是出乎意料。实际上, 出现这种情况的原因在于分类器没有很好地“调优”,这是在比较分类器时经常犯的错误
使用正则化对逻辑回归进行调优
- 当数据的特征比样本量多是要找出最佳模型就变得不确定,一种方法就是在训练过程中加入额外的限制条件
- 通过重采样估计方差
- 现代统计方法假定基本数据来自于随机分布。对于从这种数据导出的模型,它的性能测 量也会受到随机噪声的影响。在这种情况下,好的做法是不止做一次测量,而是基于具 有大致相同的统计量的数据集进行多次测量。这样可以获得一个测量结果的置信区间。 k-折交叉验证就是这样一种方法。重采样则是另一种能从同一份基础数据中生成多个 小样本的技术。可以参考 Zheng (2015) 了解关于重采样的详细介绍。
- import sklearn.model_selection as modsel
l2_search = modsel.GridSearchCV(LogisticRegression(), cv=5, param_grid=param_grid_) ,k折交叉验证
深入研究:方式了什么
- 为了了解如何使用特征值的,对于逻辑回归这种线性模型,折过程通过一个称为数据矩阵的中间对象实现的
- 使用词袋出现的词就对该词加一,每行是文档样本,大部分是0是一个稀疏矩阵,对列进行
- 训练一个线性分类器就是找特征(数据矩阵的列向量)的最优解,我们训练出来的线性分类器的质量取决于矩阵的零空间好列空间
- 与特征数量相比,列空间相对较少,使得文档中可能会出现大致相同的次数,尽管可能是满秩的但是这些列向量几乎是线性相关的,这时就是秩亏
- 秩亏的行空间和列空间会使模型对问题用力过猛。线性模型会为数据集中的每个特征都配 备一个权重参数。如果行空间和列空间是满秩的 1,模型会生成输出空间中的任何目标向量。 当它们秩亏时,模型会具有更多不必要的自由度,这会导致更加难以确定最终解。
- 如果这个向量与目标输出不相关,那么我们就有效地消除了噪声信号,这是非常好的事 情。这就是 tf-idf 与 ℓ2 归一化之间的关键区别。ℓ2 归一化永远不会计算出一个值为 0 的范 数,除非向量中都是 0。如果向量接近于 0,那么它的范数也接近于 0。除以一个小范数会 突出这个向量,并使它更长。
- 特征缩放(包括ℓ2 归一化和tf-idf)的真正用武之地是加快解的收敛速度。这表现在它能 使数据矩阵具有明显更少的条件数(最大奇异值和最小奇异值的比值,参见附录 A 中关于 这些名词的详细讨论)。实际上,ℓ2 归一化使得条件数几乎为 1。但并不是条件数越少,解 就越好。在这次实验中,ℓ2 归一化收敛得比词袋和 tf-idf 都快得多,但它对过拟合更加敏 感:它需要更多的正则化,而且对优化过程中的迭代次数更加敏感