QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2190|回复: 0
打印 上一主题 下一主题

机器学习算法整理(内含代码)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 16:23 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    3 H8 k  F% p' i& F0 D+ V6 e
    机器学习算法整理(内含代码)% B( M7 \% S' e9 Z- A
    ' H3 ^+ G: v1 C8 {- G
    一般来说,机器学习有三种算法:
    : v9 X/ ^9 c+ D2 v- O/ t
      O1 T" F  D0 I5 M1.监督式学习
    ' w( [1 w0 p; C8 C9 M. Z! v6 I% @& j- X/ @# B, m& v' ~
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    * y( y+ a% U- d4 v7 u# k% o- ]. ~0 L, i" s2 s; \
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法" {8 B) v3 n$ u% X; h0 L# L& B3 C

    2 O5 B0 ^* D2 w+ M1 ]/ F& n2.无监督式算法/ u* G, W7 |1 Y! W2 ]
    3 _4 |* |2 h4 d+ P0 p4 d+ T( F
    无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.9 W' H; Y0 E/ y( C6 y# c9 x

    ; A$ X. W. s+ k/ n/ _6 ^! Q属于无监督式学习的算法有:关联规则,K-means聚类算法等
    & g7 a% t1 U0 `7 N+ H! B& W0 ~" \3 ]4 J1 O* m! S
    3.强化学习
    1 O: M1 D# Z8 S% F# `
    . \8 _- t  d1 v# }- z7 j这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定2 m; |+ [7 H" A6 ?7 I

    + Z6 P' }; D# F3 n属于强化学习的算法有:马尔可夫决策过程
    3 F" o9 }3 K, _; q% }1 c
    # S# E, c) Y1 ^常见的机器学习算法有:: e) h; w/ r/ j6 T
    * ?" ]! s: `+ c0 i  `+ ~

    1 i  j0 X( C" \7 W1.线性回归 (Linear Regression)
    4 h4 [* x+ f7 ?8 F9 J* F
    / X( d8 X# x, e- }8 u/ @0 e' e2.逻辑回归 (Logistic Regression)
    " y. A2 _! C2 k; n- k. N' S- w
    0 @" ~1 T. k2 k# S3.决策树 (Decision Tree)
    9 [4 S( Z+ J# V8 n
    0 j% e( d2 a3 ~; E* g4.支持向量机(SVM)
    " o) z# s" w& h3 \$ x0 ?# {( w3 z$ ^. _( h# D8 U8 d
    5.朴素贝叶斯 (Naive Bayes)) I$ I2 P" k3 B1 d3 F- ^7 m# {

    % d7 S$ M/ T6 @! b# ^6.K邻近算法(KNN)
    8 L1 \1 c+ b4 E/ k* Q5 `! p- }) h1 L6 v" _/ [& S) _, f
    7.K-均值算法(K-means)6 }& e" b9 @5 j. D2 d0 J6 [

    9 Y3 R0 g$ l( m5 E8.随机森林 (Random Forest)
    ' U; F: g+ `$ Y+ s2 U+ O; N$ }! u: J3 l1 k- z$ E) _
    9.降低维度算法(Dimensionality Reduction Algorithms)% z- r$ v+ F4 t6 f2 r
    : _& W$ H$ J7 L
    10.Gradient Boost和Adaboost算法2 F( n4 h# Q9 U0 E
    一个一个来说:1 }; @$ r9 |; @7 r
    1.线性回归: _# W5 O& w) l# s* w

    . y- n: H) y3 x- A8 o+ _7 @/ G线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.7 J- G' h  f' ?5 z3 n0 s
    : p" |( i' ?* h3 ]; Y) C, @$ B
    在这个Y=ax+b这个公式里:
    6 g& S6 D  C& Q  z
    4 L# i3 ]1 ]+ ]0 L" h9 B, U6 W Y=因变量3 z0 u/ c: O- Q& P$ L. M  ]

    & H" p( i7 L" L3 N1 ~$ a% p a =斜率1 N* l3 B+ S; C) q" H/ b7 Z
    0 k( A8 G/ A. y: ]* j
    x=自变量) A' A3 Y5 ^# E0 o2 q# x; s/ m
    9 @( |4 L" Z- ~& c
    b=截距
    3 g* M: A# W% Q# b5 g, i
    ) a: X# o. E4 {2 G* s a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    8 c  E& y7 T/ y' y% B& _' c( ~9 y% V3 Y5 r# ~' F* T7 C9 s# l
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。+ k' q* S* G+ w& ~4 X
    + Z# e0 G  G6 Q+ h
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.
    5 U' ]5 g/ _8 ?3 D$ R! U2 j, Z
    & A; p7 V) p2 o6 C, d" d) }3 d2 w: k0 C
    0 ^6 w* }7 L3 H4 \% A
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    ) [" Q' v; [8 L  M/ |$ A' K9 k& ]$ {3 X. U$ |
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归9 T+ i9 F. e7 f, L+ {

    6 L  Y  a7 h% z, ?! XImport Library$ o( u* T% z5 f- O" p; ]
    from sklearn import linear_model
    + h( P) d0 A0 q
    ) C% w$ Q, F5 x$ u9 c' Cx_train=input_variables_values_training_datasets0 w. D& @: p0 x* U! h
    y_train=target_variables_values_training_datasets
    ( U' s* x- l  P/ e% Hx_test=input_variables_values_test_datasets- N) ?" `; m  a7 x* a3 J7 }! \, R( B: {

    / R. P8 j) t5 D% O$ h9 j$ {# Create linear regression object
    2 j( X- l! e, h8 b: ^linear = linear_model.LinearRegression()
    - e2 U' z' `- Y7 T5 z* p# B. f) X* y) E6 I1 A. ]3 i+ q
    # Train the model using the training sets and check score6 `5 p' e/ n  s6 y3 v
    linear.fit(x_train, y_train)' n$ J- F) ?3 Z- v
    linear.score(x_train, y_train)
    7 y! x$ i9 |# _6 }3 B  R3 b3 k( Z0 v6 D6 |7 U- O  l' ]2 _
    #Equation coefficient and Intercept
    # I5 Z5 P$ m4 `. eprint('Coefficient: \n', linear.coef_)& ~. \3 Y! x2 h6 N  {
    print('Intercept: \n', linear.intercept_)$ T, S+ V5 O9 q1 R! i; j2 S$ ^4 D6 g

    7 {0 \$ Y( D& D$ W% u1 M& r#Predict Output
    % z5 ], p& \& ]7 R! i3 h+ ?predicted= linear.predict(x_test)! m0 T$ u! S2 S, i' x8 j& [+ g+ X
    2.逻辑回归" p" N& K+ A# C
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!2 r7 X* W# L7 Z% j+ B' k& h/ U
    9 b! v6 f  q6 Q9 Q8 ?
    同样用例子来理解:" S  y+ W# Q- x  o3 ^1 _9 c
    & B0 Y$ b' @& b% C
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。9 {0 w$ Y: N, v7 f4 ?8 t; ^' A" H

    : M5 S" N/ x  V数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧$ y' n& k; D( C8 U# F+ u* Q- u

    9 Q  U& ?( D$ |* y7 q  W/ R5 v最终事件的预测变量的线性组合就是:/ l& w8 p. l6 V! c' h2 j1 L# _
    ) Y$ h- C' r9 q6 ]
    ) T8 x+ T( I* H( x& E
    odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence* ]. E; G& R4 k% R; u. B9 P

    ! Y4 ^7 g3 w1 c* sln(odds) = ln(p/(1-p))
    # l, u  \. w' K
    . \$ S% s; \- ]- K: q6 E) u% [logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk# b1 ]" J. ?' q& k( }2 P) c" W
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.' R/ x2 F. S! U" g, C  ~

    * W2 p2 _. E2 f7 u- [至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    0 `2 s5 i% k, z4 U3 h7 F0 w: a# o7 Q' F% d+ _! b# a  E. n" z, K, _
    . g0 b& }2 Q) Y+ f' q9 O4 h
    ; k- a9 p$ _5 Q& c) Z  m9 Y# I
    from sklearn.linear_model import LogisticRegression
    ) w- E# ~, Q' F3 K* T1 N3 {. ~. G: Y; }9 \& M( z
    model = LogisticRegression()% n1 W+ ?$ |( p

    . M9 R' V* s+ g8 | # Train the model using the training sets and check score) Z1 n# B" D7 _/ a6 R0 {9 x7 C
    model.fit(X, y)3 e: W; T2 {6 p( U" G1 h
    model.score(X, y)$ m/ M: l0 R  h% T

    ) `* k2 u2 W1 e' {! U #Equation coefficient and Intercept
    9 D0 U4 K( _0 A( W% }8 M0 { print('Coefficient: \n', model.coef_)3 c$ D) t7 P2 C
    print('Intercept: \n', model.intercept_)
    * W! G% J7 I5 I+ N3 V# ~# D5 Y$ \7 M3 K2 R5 i( H% f8 i
    #Predict Output
    4 L9 x. i4 |2 k5 L% i, \: s predicted= model.predict(x_test)3 Q& \1 t' I. j! O  `* f
    逻辑回归的优化:
    ) Q8 n7 T% j3 V0 l: G# L: O加入交互项
    $ O# ?3 {$ T4 k/ q! m& ]+ c% f# x7 ^. `! z2 L0 c
      减少特征变量& u$ H0 k2 d7 K( z5 Q

    8 }0 k7 w- T( Y4 y; T. J# S  正则化
    # A9 N! v: P" G6 T* N# v! J! |6 {! ~" D3 Y8 M" T
      使用非线性模型% ~, W9 y& V) \- P* f) s' u

    : J  F) N/ o$ @- N! l$ C; i3 h3.决策树; m5 i1 v# x* C# R
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。7 o* \0 e/ }% K: W
    + }! ~' A% E3 P+ A# v! D

    0 i8 g$ O) A0 \1 a+ h, a! }) x- u: b& r0 g- t$ q9 P5 `/ Y" [& u* ~. j" ?. i* Y
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
    / i+ U, q" C8 A7 u- ^: s% t6 W2 s
    2 F- c( L( S8 n6 q
    from sklearn import tree
    ! ]) m( ~, v- r# F9 f
    2 d7 F. W4 M, z' J
    ( f7 d: d8 J) p  p$ j# w# Create tree object ( z' k. v$ R, l" `6 D
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    1 l* R; L  k% R0 P3 D7 u  M: E6 r
    # model = tree.DecisionTreeRegressor() for regression
    - W$ B6 H( I) D) V( A) {" v9 t* e
    # Train the model using the training sets and check score
    " k9 S, r0 Y( w; B7 K1 cmodel.fit(X, y)3 l5 b; I) H# x
    model.score(X, y)3 [  j; p$ ^# i  E) N$ }. m+ L6 t( Q

    + h1 `" t8 d0 j' P7 O* G6 S  R#Predict Output+ I2 Q5 M8 y# K
    predicted= model.predict(x_test)2 n+ r, t+ j1 H* g. \
    4. 支持向量机(SVM)
    ' E0 Y5 j9 h! z+ V& f这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。. [: p. g! }/ Y/ S
    6 B& F  C( Z- o6 J' C6 v% n' c
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    - Z( S8 D9 ?! J# V
    & l0 S) `; }0 Q' ~' W7 P* c5 D/ _' d( X. M# S' v

    0 {% z  l6 k3 x; g' b在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。' o4 u2 ^) _0 t# v

    . m9 ?0 z3 `) |#Import Library
    6 _6 d& c! B. ]- E" Y" [+ rfrom sklearn import svm2 \3 T; ]+ Q4 u$ l2 f0 Z- e
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset. |) o1 y6 u. K& T; l4 l+ `9 G+ y
    # Create SVM classification object
    : y. r& r9 _2 D* }- I. q# B! x8 B" z3 P% M! ?7 h- c7 O
    model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.3 i( K9 r. P9 V8 Z  |3 t
    : s2 w  l( E% k" l; s6 {  B
    # Train the model using the training sets and check score
    . D# F/ H$ g  ^3 T; c4 l' C3 Dmodel.fit(X, y)
    9 d$ E8 }( }( w" B) Q4 R) V/ H( x# `model.score(X, y)4 c# B% [# y: F4 N5 I. M
    , g% O  }' a! j: C) `+ O: Z
    #Predict Output
      d" Z; q8 W9 e; Kpredicted= model.predict(x_test)) u; @# w4 B$ D6 n1 J0 G: i5 ?% X! ?
    5. 朴素贝叶斯+ h, [: a% \% Z, F. f4 S+ \- `
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
    8 r& z6 D: a# x5 b6 A3 b0 k6 o& ]. p4 \3 e
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。: C4 W4 l% m$ q1 k0 o

    ) d' U4 ~* I/ }' _4 I贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    ; W6 N4 X# G9 Q- O+ E# H- P( n+ L2 `9 T

    % H2 u4 y' `4 c. q. ^P(c|x)是已知特征x而分类为c的后验概率。: L3 r6 d8 X; Q5 s5 i) ]6 j' A9 T
    0 M( \9 |4 t6 w+ i) L; p; N
    P(c)是种类c的先验概率。; M* a3 m  d0 m4 v" R" {
    9 p/ o, M; j- m- a
    P(x|c)是种类c具有特征x的可能性。5 p" s8 B8 B+ Q& ?& u, O

    " @3 M! Q" r3 R# `P(x)是特征x的先验概率。
    5 O5 \/ Z. `9 W+ f2 v
    ; g% N. e  J) ]& Z$ l; p! e0 u2 [/ Z# M- O5 a. K9 o$ A$ U: g
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:/ a/ ?* p9 }& i+ U% m) Z" F

    4 H% z- k7 g4 s步骤1:根据已知数据做频率表
    ( O# ~4 I# f' h  w4 \! A: u/ x. d: U: _* L& E
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    / {0 E7 ?4 i/ C9 [7 j+ B4 z
    0 I; ^8 z$ S/ P3 l) M) F, m8 Q2 w, P: L4 A
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    7 d0 o, P0 o! r/ U' f提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    / H* v9 ^' g. @+ \5 n& i  D: k4 D/ n( ?9 S/ a' @. W9 B6 q
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    # R9 Q4 T( }6 U2 o3 V( T* V  }* n9 {+ y, J& J3 ^
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
    . s1 ~2 H; @* ]
    0 U- `$ I! E0 o- F# t那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。  F3 R/ E6 Z- ^' ?( ?
    / o) V) a0 q0 t% u7 s% T
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。$ k& D* e4 k. p

    ( N+ \5 d) ?8 C6 G7 W; U#Import Library( X  L" w3 J  ]# P
    from sklearn.naive_bayes import GaussianNB
    ' U0 t  {5 ]# H* n9 s: P#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    3 a6 r) s- b/ l0 p) Y( C2 l5 ~" J
    + P* t1 a: M# l5 S6 E' v, E# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link, v$ G9 B' F. q: W; v

    $ g8 [7 Q: w; l& T) t! M# m0 }( G$ c# Train the model using the training sets and check score
    ' v1 w! l* R0 Qmodel.fit(X, y)
    , P9 [, |; n. p% @% K: L2 |5 F9 R; Y/ g+ g2 [# `3 ]3 @# A
    #Predict Output
    ' J' y3 j2 R3 y( K* N6 O1 X( B: |predicted= model.predict(x_test)+ T; e& S0 `% Y/ {/ |  t) e8 }
    6.KNN(K-邻近算法)
      @/ H6 y  |& r! @8 p7 M这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    ) M& o% l5 Z# L7 Q& z+ N! }  `8 O9 N. `2 d4 U6 ^
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    9 S# j( U+ K3 v1 P3 c* h$ y% n9 }1 p2 f
    5 P1 L8 U, V0 ?, i, [

    + Y& E5 c! f* x1 C4 }0 Z0 QKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    4 ?& R, W2 ^' g" K' A
    3 {) `* |; ?( C1 K在用KNN前你需要考虑到:
    1 y2 _/ d. v9 m) X1 I% u1 T+ S( N) g& [% q* t9 ]& Z
    KNN的计算成本很高2 G) I& T1 E- i" S+ C5 m

    5 P5 r9 j1 S! `9 b& }: V; }) f# {所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。  M$ Z+ |4 S5 n' J  q

    - }( s1 k4 a' }# `- W/ j: H0 o在进行KNN前预处理数据,例如去除异常值,噪音等。3 q8 N1 D" G- a+ H1 {  c3 N
    $ l6 t! P$ G) `& j3 g. v& p. s
    #Import Library
    $ e# V8 [" ^3 h: \! G& sfrom sklearn.neighbors import KNeighborsClassifier( h5 T' F& y! h- M

    ( N* \& a) T9 z( ~! I#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    0 W" H0 w: g5 ~. A' r. \( T3 y# Create KNeighbors classifier object model * r9 k4 w% _0 C; k

    * W1 P% t- _, P  l- v5 c1 CKNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    ' `- e# ]( j7 z6 h& _# V) n
    * S3 o8 R9 n" S# Train the model using the training sets and check score
    2 p* ]# ?" j. [5 L+ V1 Wmodel.fit(X, y)& ?/ t, [: s+ z; g' Y9 d) R' t
    2 M4 I/ W0 Z8 p: K2 U
    #Predict Output3 W( M% z  h' b; U) X& }* K
    predicted= model.predict(x_test)
    : h. w; [1 y5 ?) D$ w" T* u8 B7. K均值算法(K-Means)  N5 m2 o: U4 t3 c7 e5 ], x7 \
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    8 t: V. f$ o0 q7 p: k
    5 C& x& }) k/ F3 y( x还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!( |7 a" N& B5 E) Q

    & n7 _* W, G  o9 z5 b% F. d7 Q% i. j" f) Q3 K
    K均值算法如何划分集群:: n1 A1 k2 V  N
    ' u6 g1 _3 }$ n- d; D& q
      h& O+ |* |" {

    3 _1 G+ d+ y0 i% q, S从每个集群中选取K个数据点作为质心(centroids)。
    . K/ W) ]6 P* c* ^7 V$ W6 D
    ( R5 A, O0 H2 ~& P2 _将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    1 w+ Q$ n  f+ {% y  E- D  G
    - I; Z; h, X1 u2 P找出新集群的质心,这样就有了新的质心。
    5 ^: n3 _( q  B3 r+ m) a$ h0 s
    ! f+ C( N/ t/ u/ g* s( |1 h9 k重复2和3,直到结果收敛,即不再有新的质心出现。
    0 \) D: H, p6 _+ F/ l, h
    " w0 J! q2 r. n  y$ T) J/ ]. ?
    5 m: y3 u1 ^' `6 P' v6 d5 t2 e, A怎样确定K的值:
    2 |1 j: z$ m3 Z" S* l, B7 f
    * O& s" X8 C7 a) i& ?, O( }如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
    & d* n; Z% L  e, q8 u
    * q4 T$ {* e- p! \1 g9 E3 x我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。1 @8 X/ @1 G1 F0 @% s$ G! d2 V8 f

      G! O3 S- z0 N0 H2 T" p
    % C" p( ?4 `! {' W  _#Import Library9 k/ J6 H. h- N) `5 ~
    from sklearn.cluster import KMeans0 P; q( ]5 M5 X1 x

    . }8 K5 f. \( W( g* G4 t7 @/ J#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    : G- R; \0 \8 B- ]' f# Create KNeighbors classifier object model 2 g' z1 p' a1 t- [5 a
    k_means = KMeans(n_clusters=3, random_state=0)- f8 ~8 F0 k" f7 r% M

    7 r  W: r4 q& e# Train the model using the training sets and check score
    + B; Z8 j& |  n  _- D/ H! n- ]( Z& \model.fit(X)# U( Q! v" o! _( m; z5 {
    " }" h' K7 X. l% f. Z7 A" @* E/ l+ M
    #Predict Output
    & S7 h/ g% S7 lpredicted= model.predict(x_test)
    2 |1 x( \2 `- Y- b2 `8.随机森林
    / T# f# p2 y2 i  I# o. R6 B9 @0 @  @$ W: r随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。* Y4 Z  z& P4 J$ E2 v, o& r2 k3 K

    & C5 q: D) q$ G/ n# ]& G# Z怎样生成决策树:+ V( G7 _. F( A) l* ?( F5 z
    ! j# F* y$ F( d: ]% `& ]
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。: Q+ d8 ]. w9 D* b* @) }

    3 J$ Z- B1 x4 ~6 M/ g  k. N$ j如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。* }8 s. w* }& {/ n

    5 c$ x' F% M* D% J9 f' q$ I3 E; H- Q/ _每个决策树都最大程度上进行分割,没有剪枝。6 F: {, x0 `/ R. i

    9 c4 N. s! ~6 `, R0 p. I9 t#Import Library
    0 x0 y7 [3 K# ^from sklearn.ensemble import RandomForestClassifier
    9 m! n% @7 Y3 V) A$ \5 N#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset, C! E$ U1 o. d3 u0 A" A
    - U* q) O8 i- q+ x2 q
    # Create Random Forest object0 D- P3 d6 j3 P# D' N
    model= RandomForestClassifier()9 `  g6 j$ s. o5 P' d/ G) z

    4 J9 H3 }9 P* r6 Q! s: r# Train the model using the training sets and check score9 f5 Q  x( j+ ^0 d" a7 I5 I
    model.fit(X, y)
    $ Y  Z) X  I3 \  h: b+ p: H0 N* k" x
    # t; m/ A3 ]1 m: l: A/ J  i2 \#Predict Output  ]7 `8 K, _) O/ s) w
    predicted= model.predict(x_test)) s( t+ r* N9 @$ G1 M. t0 M- B9 r
    9.降维算法(Dimensionality Reduction Algorithms)
    3 g9 x% w, q: t" |在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。2 |: g  ], a1 Q

    ' [* Z5 M" k% ^  T( M例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
    " {$ \0 O* O8 n: }4 m+ k, v& }/ l/ H1 ]
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    8 t8 n) d( Y. u. P) x6 h: [/ y9 \0 o  ]- u
    ! T: d' t/ w, t  Z  G; y
    #Import Library
    * X& X* u# ]3 _; R. g4 \* Yfrom sklearn import decomposition
    8 Z  u# N* b: J( v#Assumed you have training and test data set as train and test# T- H$ f( I- S! ?! A. R
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)) @6 M& {/ F( n1 z- s; d) @
    # For Factor analysis
    3 i  Y% ]6 h$ Z( }8 Q- L#fa= decomposition.FactorAnalysis(), ]9 ]* v% q1 p" q0 r
    # Reduced the dimension of training dataset using PCA" X% T$ C" F6 G5 M
    3 A; \$ z! D! a  y
    train_reduced = pca.fit_transform(train)
    . O3 ^( |3 i5 J$ _4 j3 Q5 W  T' m) q) R! q
    #Reduced the dimension of test dataset
    : Z; N7 O, p. ctest_reduced = pca.transform(test)
    ' ^5 {  ^- g1 T2 v10.Gradient Boosing 和 AdaBoost9 A: E3 x  b6 u% [+ @
    GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。- V9 N+ |# [: u. _
    ! _) A5 @$ r* r% D
    #Import Library7 _- x5 f( \' I* p! ~* W
    from sklearn.ensemble import GradientBoostingClassifier
    0 l: q/ H3 B6 J: [  ^6 h#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    8 w! F2 j1 p& V# Create Gradient Boosting Classifier object
    2 c) m" v5 C; _& S$ hmodel= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    * V3 }7 D* B: b9 C9 T- U1 X5 h7 M& W* m% }2 t+ {3 K* ~$ X3 b  ^
    # Train the model using the training sets and check score. ~3 L+ W- R' A8 H9 [( H) \
    model.fit(X, y)7 Q1 @3 x: Z5 K" o' a, c
    #Predict Output. j6 L# B5 |6 ]6 |3 E: M
    predicted= model.predict(x_test)
    . I0 W& M9 m% o& JGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    # Z. c2 H+ R4 A0 G$ t. O  _( {# b2 I# O/ `1 h9 \
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/511913862 q  b2 K2 f5 F# Y: e+ C& y
    ————————————————, h0 \0 I( D; H& Q# |6 b
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- M3 \5 T( t& r
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075' O  ^, r7 f% T( C9 u
      J& Y' ?1 m6 b3 v

    2 S. ^$ e% e! f8 r3 H
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对2 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-20 17:52 , Processed in 0.461921 second(s), 51 queries .

    回顶部