精华内容
下载资源
问答
  • 单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。...举例说明:设计俄罗斯方块游戏,把游戏界面和逻辑进行分离。当有一天需要改变界面的时候,不过是窗体类的变化,和游戏逻辑无关,以此来达到复

    单一职责原则(SRP)就一个类而言,应该仅有一个引起它变化的原因。

     

    如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

     

    举例说明:设计俄罗斯方块游戏,把游戏界面和逻辑进行分离。当有一天需要改变界面的时候,不过是窗体类的变化,和游戏逻辑无关,以此来达到复用的目的。

     

    开放-封闭原则是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。这个原则有两个特征,一是“对于扩展是开放的 (open for extension)”,另一个是说“对于更改是封闭的(Closed for modification)”。

    开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。

     

    无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测最有可能发生的变化种类,然后构造抽象来隔离那些变化。但有时候很难预先猜测。在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。

     

    面对变化,对程序的改动是通过增加新代码实现的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在。

     

    开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都时刻地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

     

    举例说明:当设计一个具有加、减、乘、除功能的计算器的时候,通过一些面向对象的手段,如继承,多态等来隔离具体加法、减法等与客户端的耦合。当后续需要增加其他功能,比如开根号等,就不需要再去更改客户端以及加法、减法等类了,而只是增加开根号类就可以了。

     

    依赖倒转原则(或依赖倒置原则):

    A. 高层模块不应该依赖底层模块。两个都应该依赖抽象。

    B. 抽象不应该依赖细节。细节应该依赖抽象。(可以理解为要针对接口编程,不要对实现编程)

    举例说明:比如当我们做新项目时,发现业务逻辑的高层模块都是一样的,但是客户却希望使用不同的数据库或存储信息方式。我们希望能再次利用这些高层模块,但是如果高层模块都是与低层的访问数据库绑定在一起,就没有办法复用这些高层模块。而如果不管高层模块还是低层模块,它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,那么任何一个的更改都不用担心其他受到影响。

    依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。

     

    里氏代换原则子类型必须能够替换掉它们的父类型。

    里氏代换原则的数学定义比较复杂,它的白话翻译就是,一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。

     

    也正因为有了这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

     

    举例说明:在面向对象设计时,一个是鸟类,一个是企鹅类,如果鸟类是可以飞的,企鹅不会飞,那么企鹅可以继承鸟类吗?答案是显然不行,因为继承意味着子类拥有父类所有非private的行为和属性,而在这里,企鹅不能以父类——鸟的身份出现(不满足依赖倒转原则),所以,企鹅不能继承鸟类。

     

    迪米特法则也叫最少知识原则


    迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。


    “迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。”


    迪米特法则其根本思想,是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。

    展开全文
  • 面向对象的三个基本特征

    万次阅读 2018-09-05 17:11:31
    面向对象的三个基本特征是:封装、继承、多态。 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的...

    面向对象的三个基本特征是:封装、继承、多态。

    o_OOBase.gif

    封装

    封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

    封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    继承

    面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

    通过继承创建的新类称为“子类”或“派生类”。

    被继承的类称为“基类”、“父类”或“超类”。

    继承的过程,就是从一般到特殊的过程。

    要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。

    在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

     

    继承概念的实现方式有三类:实现继承、接口继承和可视继承。

    Ø         实现继承是指使用基类的属性和方法而无需额外编码的能力;

    Ø         接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

    Ø         可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

    在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

    抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。

    OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

     

    多态

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

    实现多态,有二种方式,覆盖,重载。

    覆盖,是指子类重新定义父类的虚函数的做法。

    重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

    其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。”

    那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

     

    概念讲解

    泛化(Generalization)

    o_Generalization.gif

    图表 1 泛化

    在上图中,空心的三角表示继承关系(类继承),在UML的术语中,这种关系被称为泛化(Generalization)。Person(人)是基类,Teacher(教师)、Student(学生)、Guest(来宾)是子类。

    若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。

    例如,教师是人,Teacher 是Person的“一种”(a kind of )。那么类Teacher可以从类Person派生(继承)。

    如果A是基类,B是A的派生类,那么B将继承A的数据和函数。

    如果类A和类B毫不相关,不可以为了使B的功能更多些而让B继承A的功能和属性。

    若在逻辑上B是A的“一种”(a kind of ),则允许B继承A的功能和属性。

     

    聚合(组合)

    o_aggregationBase.gif

    图表 2 组合

    若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。

    例如,眼(Eye)、鼻(Nose)、口(Mouth)、耳(Ear)是头(Head)的一部分,所以类Head应该由类Eye、Nose、Mouth、Ear组合而成,不是派生(继承)而成。

     

    聚合的类型分为无、共享(聚合)、复合(组合)三类。

     

    聚合(aggregation)

     

    o_aggregation.gif

    图表 3 共享

    上面图中,有一个菱形(空心)表示聚合(aggregation)(聚合类型为共享),聚合的意义表示has-a关系。聚合是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。

     

    组合(composition)

    o_composition.gif

    图表 4 复合

    这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系——组合(composition)(聚合类型为复合)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制。即A会随着B的创建而创建,随B的消亡而消亡。

     

    依赖(Dependency)

    o_Dependency.gif

    图表 5 依赖

    这里B与A的关系只是一种依赖(Dependency)关系,这种关系表明,如果类A被修改,那么类B会受到影响。

     

     

    UML对很多人来说应该不是一个陌生的概念,这一两年来,UML被大家越来越多的讨论着。本来UML跟我这个主题似乎并不能扯上多大的关系(它是语言无关的,甚至可以说其本身就是一种语言——用于交流的)。我在此谈到它有两个目的:
    1. UML是针对面向对象软件开发的,而C++正是这样的一种语言
    2. UML在设计中被越来越多的使用着,而下一篇杂谈准备讨论设计模式,如果不了解UML,那么无法进行下去

    UML,全称:Unified Modeling Language,其目的是为了对软件密集型的制品进行可视化、详述、构造和文档化的图形语言。UML是依据许多前人的思想总结出的成果,1997年被OMG通过并成为标准(所以在《设计模式》书中如果你看到与标准不一样的地方,不要奇怪,那本书是95年的)。关于UML的历史和更详细的描述,可以参考《UML 参考手册》。UML主要由一系列视图组成,其中包括静态视图(Static view),用例视图(Use case view)活动视图(Activity view)等,不同的图用处自然也不一样,而对开发人员来讲(或者说为我的下一篇来说),更重要的应该是静态视图中的类图(class diagram)和交互视图(Interaction view)中的顺序图(Sequence diagram),请注意view和diagram的区别。

     类图
    静态视图说明了对象的结构,其中最常用的就是类图,类图可以帮助我们更直观的了解一个系统的体系结构,有时侯,描述系统快照的对象图(Object diagram)也是很有用的。在这里,我们主要介绍类图,下面的图就是一个简单的类图:

    在类图中,类由矩形框来表示,如上图中,定义了4个类,分别为Base、A、B、C,类之间的关系通过各种线条和其他符号来表示,在上图中,空心的三角表示继承关系,在UML的术语中,这种关系被称为泛化(Generalization),所以上面的类用等价代码表示为:
    class Base{…};
    class A:public Base{…};
    class B:public Base{…};
    class C:public Base{…};

    我们再看下一幅图:

    这幅图与上幅几乎没有什么区别,唯一的不同就是Base类中增加了成员,一个私有的integer _x(UML术语为property)和一个公有的fun()的函数(method),是否需要这些类的内部细节UML本身并没有限制,完全取决于你自己如何使用,UML的用处在于帮助你了解系统,所以只要你自己觉得足够清楚,那么够了,不要再复杂了。
    接着看第三幅图:

    上面图中的箭头表示一种关系,箭头另一边有一个菱形(空心)表示聚合(aggregation),聚合的意义表示has-a关系,其等价代码如下:
    class A{…};
    class B{ A* theA;…};
    聚合是一种相对松散的关系,聚合类B不需要对被聚合的类A负责。
    下面的图:

    这幅图与上面的唯一区别是菱形为实心的,它代表了一种更为坚固的关系——组合(composition)。组合表示的关系也是has-a,不过在这里,A的生命期受B控制,通常情况,等价代码如下:
    class A{…};
    class B{A theA;…};
    即A会随着B的创建而创建,随B的消亡而消亡。

    下图:

    这里B与A的关系只是一种依赖关系,这种关系表明,如果类A被修改,那么类B会受到影响,一个简单的例子就是:
    class A{…};
    class B{fun(A params);…};

    常用的关系就是我们上面用的这些,通过这些关系和类表示的类图,我们可以用图形化的方式描述一个系统的设计部分,当你习惯使用UML后,你会发现,这往往比你告诉同伴某某类从某某类派生,派生类又和某某类具有什么关系容易的多。

     顺序图:
    UML中另外一个常用的图形就是交互视图中的顺序图,在以往的过程化语言中,我们通常使用流程图来描述一个函数(系统)是如何工作的,而在面向对象的系统中,这显然是不可行的,而顺序图正是来解决这个问题的。
    假设有如下的伪代码:

    
     

    对于下面的调用:
    window wnd;
    wnd.drawcircle();
    对应的顺序图如下:

     

    图中上方的方块表示参与的对象,垂直的虚线表示对象的生命线,方框表示激活,其中箭头表示了一个调用消息(也可以有回送return),如果是异步的消息,则用半箭头表示,其中draw表示了一个自调用(self call)

    至此,UML中最常用的(从开发人员的角度),当然UML的内容远远不只这些,这里的介绍只是一些简单的概括,并且UML本身也在不断的发展之中,无论怎样,我觉得UML会越来越多的深入我们的开发过程中,特别是对下一篇我们要介绍的设计模式而言,类图是主要的描述工具(到那个时候你会体会到UML描述的优越)。
    如果你看过《设计模式》着本书,你会发现与我上面所描述的有一些细微的不同,不要紧张,《设计模式》是GOF95年的作品,那时候UML还没有形成,而且,其中也明确那是OMT方法(Jim Rumbaugh在通用电气发表的建模技术——Object Modeling Technique)和Booch方法。如果你觉得UML有些让你无所适从,也不必紧张,UML本身只是一个辅助工具,它的目的是帮助你描述系统,不是复杂你的工作,如果你的系统很简单,一句话可以说的很清楚,那么不要用UML,如果你只想说明类之间的关系,而不是类的接口描述,那么像第一副图那样简单的描述就很好,总之不要去追求细节,只要能说明问题,那么你的目的就达到了(甚至你没有必要完全遵守规范)。

     参考书目
    《设计模式——可复用面向对象软件的基础》 
    作者: Erich Gamma 等 译者:李英军 马晓星 蔡敏 刘建中 机械工业出版社2000

    《UML参考手册》作者: James Rumbaugh Ivar Jacobson Grady Booch
    译者: 姚淑珍 唐发根 机械工业出版社2001

    《UML精粹——标准对象建模语言简明指南(第2版)》
    作者: Martin Fowler&Kendall Scott 译者: 徐家福 清华大学出版社 2002

    《Design Patterns Explained》Alan Shalloway, James R. Trott
    Addison-Wesley Pub 2001

     

    展开全文
  • 特征工程基本流程

    千次阅读 2018-03-25 23:37:24
     特征是数据中抽取出来的对结果预测有用的信息,可以是文本或者数据。特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。过程包含了特征提取、特征构建、特征选择等模块...

    https://www.cnblogs.com/infaraway/p/8645133.html

    前言

      特征是数据中抽取出来的对结果预测有用的信息,可以是文本或者数据。特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。过程包含了特征提取、特征构建、特征选择等模块。 

      特征工程的目的是筛选出更好的特征,获取更好的训练数据。因为好的特征具有更强的灵活性,可以用简单的模型做训练,更可以得到优秀的结果。“工欲善其事,必先利其器”,特征工程可以理解为利其器的过程。互联网公司里大部分复杂的模型都是极少数的数据科学家在做,大多数工程师们做的事情基本是在数据仓库里搬砖,不断地数据清洗,再一个是分析业务不断地找特征。 例如,某广告部门的数据挖掘工程师,2周内可以完成一次特征迭代,一个月左右可以完成模型的小优化,来提升auc。


    1. 数据采集 / 清洗 / 采样

    数据采集:数据采集前需要明确采集哪些数据,一般的思路为:哪些数据对最后的结果预测有帮助?数据我们能够采集到吗?线上实时计算的时候获取是否快捷? 

      举例1:我现在要预测用户对商品的下单情况,或者我要给用户做商品推荐,那我需要采集什么信息呢? 

      -店家:店铺的评分、店铺类别…… 

      -商品:商品评分、购买人数、颜色、材质、领子形状…… 

      -用户:历史信息(购买商品的最低价最高价)、消费能力、商品停留时间…… 


    数据清洗: 数据清洗也是很重要的一步,机器学习算法大多数时候就是一个加工机器,至于最后的产品如何,取决于原材料的好坏。数据清洗就是要去除脏数据,比如某些商品的刷单数据。 

      那么如何判定脏数据呢? 

      1) 简单属性判定:一个人身高3米+的人;一个人一个月买了10w的发卡。

      2) 组合或统计属性判定:号称在米国却ip一直都是大陆的新闻阅读用户?你要判定一个人是否会买篮球鞋,样本中女性用户85%? 

      3) 补齐可对应的缺省值:不可信的样本丢掉,缺省值极多的字段考虑不用。 


    数据采样:采集、清洗过数据以后,正负样本是不均衡的,要进行数据采样。采样的方法有随机采样和分层抽样。但是随机采样会有隐患,因为可能某次随机采样得到的数据很不均匀,更多的是根据特征采用分层抽样。  

    正负样本不平衡处理办法:

       正样本 >> 负样本,且量都挺大 => downsampling

       正样本 >> 负样本,量不大 =>  

         1)采集更多的数据

         2)上采样/oversampling(比如图像识别中的镜像和旋转) 

         3)修改损失函数/loss function (设置样本权重)

     


    2. 特征处理

    2.1 数值型

      1.  幅度调整/归一化:python中会有一些函数比如preprocessing.MinMaxScaler()将幅度调整到 [0,1] 区间。

      2.统计值:包括max, min, mean, std等。python中用pandas库序列化数据后,可以得到数据的统计值。 
    这里写图片描述

      3.离散化:把连续值转成非线性数据。例如电商会有各种连续的价格表,从0.03到100元,假如以一元钱的间距分割成99个区间,用99维的向量代表每一个价格所处的区间,1.2元和1.6元的向量都是 [0,1,0,…,0]。pd.cut() 可以直接把数据分成若干段。

      4.柱状分布:离散化后统计每个区间的个数做柱状图。

    2.2 类别型

      类别型一般是文本信息,比如颜色是红色、黄色还是蓝色,我们存储数据的时候就需要先处理数据。处理方法有: 

      1. one-hot编码,编码后得到哑变量。统计这个特征上有多少类,就设置几维的向量,pd.get_dummies()可以进行one-hot编码。 

      2. Hash编码成词向量: 
       这里写图片描述 

      3. Histogram映射:把每一列的特征拿出来,根据target内容做统计,把target中的每个内容对应的百分比填到对应的向量的位置。优点是把两个特征联系起来。 

       这里写图片描述 

      上表中,我们来统计“性别与爱好的关系”,性别有“男”、“女”,爱好有三种,表示成向量 [散步、足球、看电视剧],分别计算男性和女性中每个爱好的比例得到:男[1/3, 2/3, 0],女[0, 1/3, 2/3]。即反映了两个特征的关系。

    2.3 时间型

      时间型特征的用处特别大,既可以看做连续值(持续时间、间隔时间),也可以看做离散值(星期几、几月份)。

      连续值

        a) 持续时间(单页浏览时长)

        b) 间隔时间(上次购买/点击离现在的时间)

      离散值

        a) 一天中哪个时间段(hour_0-23)

        b) 一周中星期几(week_monday...)

        c) 一年中哪个星期

        d) 一年中哪个季度

        e) 工作日/周末

      数据挖掘中经常会用时间作为重要特征,比如电商可以分析节假日和购物的关系,一天中用户喜好的购物时间等。

    2.4 文本型

      1. 词袋:文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。Python中用CountVectorizer处理词袋. 

      2. 把词袋中的词扩充到n-gram:n-gram代表n个词的组合。比如“我喜欢你”、“你喜欢我”这两句话如果用词袋表示的话,分词后包含相同的三个词,组成一样的向量:“我 喜欢 你”。显然两句话不是同一个意思,用n-gram可以解决这个问题。如果用2-gram,那么“我喜欢你”的向量中会加上“我喜欢”和“喜欢你”,“你喜欢我”的向量中会加上“你喜欢”和“喜欢我”。这样就区分开来了。 

      3. 使用TF-IDF特征:TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF(t) = (词t在当前文中出现次数) / (t在全部文档中出现次数),IDF(t) = ln(总文档数/ 含t的文档数),TF-IDF权重 = TF(t) * IDF(t)。自然语言处理中经常会用到。

    2.5 统计型

       加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少...

       分位线:商品属于售出商品价格的多少分位线处

       次序型:排在第几位

       比例类:电商中,好/中/差评比例,你已超过全国百分之…的同学

      

    2.6 组合特征

      1. 拼接型:简单的组合特征。例如挖掘用户对某种类型的喜爱,对用户和类型做拼接。正负权重,代表喜欢或不喜欢某种类型。 

      - user_id&&category: 10001&&女裙 10002&&男士牛仔 

      - user_id&&style: 10001&&蕾丝 10002&&全棉 

      2. 模型特征组合: 

      - 用GBDT产出特征组合路径 

      - 组合特征和原始特征一起放进LR训练


    3. 特征选择

      特征选择,就是从多个特征中,挑选出一些对结果预测最有用的特征。因为原始的特征中可能会有冗余和噪声。 

      特征选择和降维有什么区别呢?前者只踢掉原本特征里和结果预测关系不大的, 后者做特征的计算组合构成新特征。

    3.1 过滤型

       - 方法:  评估单个特征和结果值之间的相关程度, 排序留下Top相关的特征部分。 

       - 评价方式:Pearson相关系数, 互信息, 距离相关度。 

       - 缺点:只评估了单个特征对结果的影响,没有考虑到特征之间的关联作用, 可能把有用的关联特征误踢掉。因此工业界使用比较少。 

       - python包:SelectKBest指定过滤个数、SelectPercentile指定过滤百分比。

    3.2 包裹型

      - 方法:把特征选择看做一个特征子集搜索问题, 筛选各种特征子集, 用模型评估效果。 

      - 典型算法:“递归特征删除算法”。 

      - 应用在逻辑回归的过程:用全量特征跑一个模型;根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观察准确率/auc的变化;逐步进行, 直至准确率/auc出现大的下滑停止。 

      - python包:RFE 
      

    3.3 嵌入型

       - 方法:根据模型来分析特征的重要性,最常见的方式为用正则化方式来做特征选择。 

       - 举例:最早在电商用LR做CTR预估, 在3-5亿维的系数特征上用L1正则化的LR模型。上一篇介绍了L1正则化有截断作用,剩余2-3千万的feature, 意味着其他的feature重要度不够。 

       - python包:feature_selection.SelectFromModel选出权重不为0的特征。

    《注:以上总结来自于七月在线课程》

    展开全文
  • 文本特征选择之互信息和卡方

    万次阅读 2016-08-17 17:48:08
    在做文本挖掘,特别是有监督的学习时,常常需要从文本中... 一个常用的方法是计算文档中的词项t与文档类别c的互信息MI,MI度量的是词的存在与否给类别c带来的信息量,互信息基本定义如下:  应用到文本特征选择:

    参考:http://www.cnblogs.com/fengfenggirl/p/text_feature_selection.html

    在做文本挖掘,特别是有监督的学习时,常常需要从文本中提取特征,提取出对学习有价值的分类,而不是把所有的词都用上,因此一些词对分类的作用不大,比如“的、是、在、了”等停用词。这里介绍两种常用的特征选择方法:

    互信息

      一个常用的方法是计算文档中的词项t与文档类别c的互信息MI,MI度量的是词的存在与否给类别c带来的信息量,互信息的基本定义如下:

      应用到文本特征选择:

      U、C都是二值随机变量,当文档包含词项t时,U的取值为et=1et=1,否则et=0et=0;当文档属于类别c时,C的取值ec=1ec=1,否则ec=0ec=0,用最大似然估计时,上面的概率值都是通过统计文档中词项和类别的数目阿里计算的。于是实际计算公式如下:  

      其中NxyNxy表示x=etx=ety=ecy=ec情况下对应的文档数目,比如N10N10表示包含词项t(此时et=1et=1)但不属于类别c(此时ec=0ec=0)的;N1.=N10+N11N1.=N10+N11表示所有包含词项t的文档数目。N.1=N11+N01N.1=N11+N01表示所有属于类c的文档数目,N=N00+N01+N10+N11N=N00+N01+N10+N11表示所有文档数目。

      举例:路透社的语料库Retuters-RCV1的一个类别poultry及词项export。类别和词项的四种组合的文档数如下:  

      计算类别poultry和词export之间的类别的互信息为:  

      我们可以对每一个类计算各个词项与其的互信息,并选取值最大的k个词项,当然有可能两个类会选取相同的特征词,去重一下即可。

      互信息度量的是词项是否被类别包含所带来的信息量,如果某个词项均匀的分布在各个类别,那么I(U;C)=0I(U;C)=0,当某词项总是出现在当前类别,而在其他类别中很少出现时,I(U;C)I(U;C)就会比较大。使用互信息能够保留具有信息含量的词项的同时,去掉那些没有信息含量的词项,从而提高正确率。

    X2X2统计量

      在统计学中,X2X2统计量经常用来检测两个事件的独立性。在特征选择中,两个事件分别指词项的出现与类别的出现,计算公式如下:

      依然是前面的类别poultry及词项export的例子,我们有

      其他的类似计算,得到:  

      

      查卡方的分布表,置信度为0.999的卡方临界值是10.83,也就是当卡方值X2(D,t,c)>10.83X2(D,t,c)>10.83时,我们有99.9%的把握,t与c不独立,这里284显然大于10.83,因此我们认为poultry与export不独立,也就是export对poultry是一个强特征。同样我们计算所有词的卡方值,取值最大的前k个词项作为特征词。

      卡方是基于显著统计性来选择特征的,因此他会比MI选出更多的罕见词项,而这些词项对分类并不靠谱。

      虽然卡方和互信息的出发点不同,但它们的准确性却相差不多,因为大部分文本分类问题中,只有很少的强特征,大部分都是弱特征。只要所有的强特征和很多弱特征被选出,那么分类的准确率就不会低。

      另外上面介绍的两种特征选择主要用于文本的分类等用监督学习,而不适宜聚类等无监督学习,因为聚类我们不知道每篇文档属于的类别,也就无从计算互信息和卡方值,这时一般使用TF-IDF作为特征词的选取方法

    展开全文
  • 功能约束“FC”定了数据类的每个信息特征,数据的信息是强制性的或者可选的。 简单的建模例子(一) 逻辑节点的基本组成(二) 逻辑节点通信机制(三) 图一定义了建模的基本模型最高层...
  • 一、面向对象程序设计(OOP)的三大基本特征(定义、特性、优缺点、java中的表现形式、应用) 1.封装 封装的定义 ​ 通俗的说:普通人对计算机进行应用操作,只需知道如何在计算机上连网,如何浏览网页,下载东西...
  • 比较详细的讲解了特征工程的一些流程,好像最先发表在知乎,其中的流程图不要画的太牛逼,但好像说也只是个入门。。。花了一个星期的时间把里面的东西的原理都看了一遍,当然只是浅尝辄止,总之是挖的越深觉得能挖的...
  • iptables命令详解和举例

    万次阅读 多人点赞 2018-03-27 10:25:47
    从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由...
  • 特征选择作为常见的降维方法是数据挖掘中的研究热点之一。特征选择时指从原始的特征集合中选取出以某种标准最优的特征子集。其目的就是选出最优的特征子集,进而达到使分类或回归模型更好的预测精度。 文章包含特诊...
  • 迁移学习与代码举例

    千次阅读 多人点赞 2020-03-18 16:40:34
    此时源域的DNN模型的前几层layer的输出可以看做对图片特征的提取器,这些特征能有效的代表图片的信息。 基于关系的迁移学习 通过将source domain和target domain映射到一个新的数据空间。在这个新的数据空间中,来自...
  • 一、基本定义 1.定义一,信息网络(Information Network):  信息网络可以用一个有向图 G   = ( V, E ) 来表示,其中V代表 Object,E代表  Edge。并且用映射函数  ϕ   :   V   → A   来表示...
  • jpg 格式举例详解

    万次阅读 2013-06-04 20:39:48
    表7:SOF0(图像基本信息) -------------------------------------------------------------------------- 名称 字节数 值 说明 ----------------------------------------------------------------------...
  • LBP特征原理

    万次阅读 多人点赞 2016-11-01 14:37:53
    一、LBP特征的背景介绍LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood [1]...
  • 举例:我们从市场上挑了很多芒果。 特征是输入变量,即简单线性回归中的 x变量。(如芒果的大小,颜色,产地,品牌等) 简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按...
  • 信息分类的基本原则与方法

    万次阅读 2013-09-30 13:47:29
    信息分类应根据信息内容的属性或特征,按照一定的规范和标准直,为了方便信息的交流与共享,应遵循以下原则: 1. 科学性 :在分类时,应选准信息的最稳定的本质属性,作为分类的基础和依据,确保一个稳定的分类...
  • 机器学习中的特征——特征选择的方法以及注意点

    万次阅读 多人点赞 2014-10-12 17:23:26
    关于机器学习中的特征我有话要说 一、特征选择和降维 二、特征选择的目标 三、
  • 并查集(Union-Find) 应用举例 --- 基础篇

    万次阅读 多人点赞 2012-07-22 23:54:14
    find通过parent-link数组中的信息来找到指定节点的根节点,同样地,也可以根据应用的具体特征,选择是否采用路径压缩这一优化手段。然而在需要保存 每个 节点代表子树的秩的时候,则无法采用路径压缩,因为这样会...
  • 利用weka和clementine数据挖掘举例

    千次阅读 2016-03-10 20:23:33
    1.数据概述 本实验中采用的数据集来自于UCI经典数据集Adult,最初来源是由1994年Barry Becker的统计数据集,该数据集本来最初的主要任务是根据数据集中的相关属性预测...这14个基本属性中有一项属性为fnlwgt,即fi
  • jpg 格式举例详解——非常详细

    万次阅读 2017-11-24 22:50:07
    表7:SOF0(图像基本信息) -------------------------------------------------------------------------- 名称 字节数 值 说明 ----------------------------------------------------------------------...
  • 它的基本思路是,从初始特征集合中不断的选择子集合,根据学习器的性能来对子集进行评价,直到选择出最佳的子集。在搜索过程中,我们会对每个子集做建模和训练。 上图为包裹法的流程图,其中Estimated ...
  • 软件项目计划如何编写举例

    千次阅读 2006-07-19 11:20:00
    一、项目计划的要素 根据PMBOK2000,项目计划可以包含如下要素: 1、 项目范围说明 项目范围说明阐述进行这个项目的原因或意义,形成项目的基本框架,使项目所有者或项目管理者能够系统地、逻辑地分析项目关键...
  • Comzyh   ,计算机专业在读 ...通过滤波永远只会使图像失去...相比之下,对于随机噪声的常用时域(空间域)平滑操作则更易于理解和分析:取一个适当大小的邻域,在该邻域内信号的真实值认为基本不变,而邻域所包含...
  • TOPSIS算法(优劣解距离法)的使用举例与matlab实现

    千次阅读 多人点赞 2021-01-28 22:59:20
    计算每个方案的优劣值(1)计算每个参数对应的最大最小值(2)计算每个方案距离最优最劣解的距离(3)计算每个方案的优劣值三、使用举例1.形成决策矩阵2.计算加权决策矩阵(1)指标正向化处理 一、算法的提出  ...
  • 特征离散和特征选择

    千次阅读 2018-03-20 17:18:36
    连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果? Q:CTR预估,发现CTR预估一般都是用LR,而且特征都是离散的。为什么一定要用离散特征呢?这样做的好处在哪里? A: 在工业界,很...
  • 特征处理和特征选择

    千次阅读 2018-04-13 10:59:47
    特征处理之统计特征 历届的Kaggle/天池比赛,天猫/京东排序和推荐业务线里模型用到的特征 1.加减平均:这个用户所买商品高于所有用户购买商品平均价格的多少(权衡一个人的消费能力),用户连续登录天数超过平均...
  • title: 推荐系统理论初探 date: 2018-12-20 20:32:55 tags: 推荐系统 toc: true ...系统用户的基本信息,例如性别,年龄等 用户对物品或者信息的偏好,根据应用本身的不同,可能包括用户对物品的评...
  • 单变量分析1.1 卡方检验1.1.1 原理1.1.2 使用示例1.2 互信息(Mutual Information)1.2.1 原理1.2.1.1 互信息(Mutual Information)定义一定义二定义三1.2.1.2 Normalized Mutual Information1.2.1.3 Adjusted ...
  • 机器学习基本概念特征工程结构化数据非结构化数据 特征工程 特征工程师对原始数据进行一系列的工程处理,作为输入供算法和模型使用。 从本质上讲,特征工程是一个表示和展现数据的过程。 实际中,特征工程旨在...
  • LBP特征提取算法

    千次阅读 2018-07-11 20:06:56
    来源:... 一、LBP特征的背景介绍 LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. ...
  • MySQL基本操作四:数据的查询

    千次阅读 多人点赞 2018-12-02 21:15:59
    为方便后面举例,还是先建立一个表,并插入一些数据。我在这里依旧建立一个学生信息表,建表的代码如下: CREATE TABLE tab_student( StuID CHAR(4), Name VARCHAR(20), Sender CHAR(1), Age INT, Math INT,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,487
精华内容 19,394
关键字:

信息的基本特征举例