QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2189|回复: 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

    ; a' D- e& H- O4 }; h" @. ^# z机器学习算法整理(内含代码)
    ( T. |8 M# \& _- ?6 c
    ) n* P: N5 F5 e. d. L! j5 Q一般来说,机器学习有三种算法:; M# m$ w: M8 s
    0 F$ k: w+ h. t" N1 E- e
    1.监督式学习
    , s5 J- ~6 V2 ?4 a$ W/ ?. w4 G& m& [, H* @. D
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率6 b! c, }  i$ i" f) U
    / `, g8 i$ [0 i
    属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    3 Y( ?0 a+ n( R; Z) H
    # K9 T* c" q9 I* `  ^2.无监督式算法6 C5 y8 ]: V' H1 Z9 L5 C

    7 M/ c2 l. X5 I" X8 y无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    & K9 k; L& [* S- R5 `/ H5 i. n* g) ?) C4 Z
    属于无监督式学习的算法有:关联规则,K-means聚类算法等
    5 K3 R9 Q( s2 L" A9 Q4 D
    ) B! L. ?* y7 z6 X9 W. K3.强化学习" T- I( w/ d. y6 [$ q$ Q

    % g* {6 P" R, V这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    % U' Y' H6 J' y$ R
    5 w$ T* |4 W  E5 x$ B9 E属于强化学习的算法有:马尔可夫决策过程
    ' P) X3 x2 C! \+ ~( i+ t; ]! Z% C' v$ E6 O
    常见的机器学习算法有:
    ! B9 j" ^+ {* h2 ]9 k2 k+ [
    , M7 U+ q/ d  R
      _/ \$ S. l7 F: I& Q& |1.线性回归 (Linear Regression)6 A; Q& a& ?7 {, C- j/ o" a9 M

    ' P( U; V! R0 t8 B  F' k2.逻辑回归 (Logistic Regression)
    4 ]  q! R; S# E7 \& J$ x+ D: @, D( V% w* k( D7 }- ?
    3.决策树 (Decision Tree)
    ; u( e  L; p8 g, C+ G+ s. i. f9 Y
    . N- B) ~1 [( b# a2 \8 w4.支持向量机(SVM)
    ! k. q( s% b: u4 L$ r# K+ i7 g5 E
    * P7 m% M3 x5 o- N5 y5 v5.朴素贝叶斯 (Naive Bayes)! p3 E# t* L+ v5 M: P

    ; ]3 n/ e7 j3 F) C  ?4 U- |3 K3 C6.K邻近算法(KNN)
    ' }  X5 |* E- w: Q: P' P  {' [' _% w. B  a0 X6 @
    7.K-均值算法(K-means)/ G- F9 h# B9 q# }( \/ p3 \

    + X0 r" C1 Y! T1 o( ?% }- [' }8.随机森林 (Random Forest)
    : }' Z2 K7 A, m- c# @2 P  j! q) R
    & D0 \* g7 u5 H# h- I; E4 u9.降低维度算法(Dimensionality Reduction Algorithms)
    8 t( k) \9 \  |: d% Z( o' a/ E4 K
    + K1 h. e. q) I% x10.Gradient Boost和Adaboost算法
    8 n5 r7 x$ q) O, F9 R7 B* W一个一个来说:
    ! ?. h* l  l4 w/ m1.线性回归! {: V3 {* E6 R+ r1 }7 \1 O8 d

    : N/ u3 ~3 q; F+ }  {# s, k5 W线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.
    # b8 A! }) j/ C: f
    ; Y& x) [+ D( g$ C5 @# x7 N/ c在这个Y=ax+b这个公式里:
    9 o. D% @3 u" b) z3 V& _9 q
    1 N% ^" ~0 d: Y7 F7 S4 \ Y=因变量
    ) g  y# J# p4 y7 M1 @
    ! {9 ~9 m% w: A! L# w& S a =斜率/ p: p4 t, p( w, T! N: M% f  ]

    % Q$ X* b8 t& p' x3 m. G x=自变量
    6 E' O$ @. J$ y+ t7 D; c! A; u2 J3 c  S: W/ [  n2 `9 D
    b=截距
    4 \1 w. ^) A$ N$ @
    4 K+ x3 v& D  o8 o* f% V a和b可以通过最下化因变量误差的平方和得到(最小二乘法)
    5 O) t0 F$ |9 J2 l0 a
    5 [  [6 A* k1 A6 o我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。. V- X+ k$ P& K. N  M' C9 {& d
    % G$ [- `1 r2 V/ A
    给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.7 u  {$ r1 m/ f4 w3 Q3 }

    ' @5 M9 X, i$ m8 C5 L% H" c0 i% t, ^, N# a% p

    ( K/ W: O6 |$ p. I( y9 ]/ ]2 v线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    0 O, ]$ T1 Y) A! Q- ^' @& R. T+ \( e$ U( g% K
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归
    ! R2 a5 l; `) {1 m- s5 B5 q" i$ d& h# G. \9 f; W3 ~: S
    Import Library
    & E9 {) q: Y3 w+ S8 Kfrom sklearn import linear_model
    " ^" _' i7 R: ~8 h, l9 [4 G- E9 J8 e, Z) X8 j5 F
    x_train=input_variables_values_training_datasets, \( z3 H9 Z1 d  D3 K
    y_train=target_variables_values_training_datasets- K% R  X, f: f7 k9 N: F  ]
    x_test=input_variables_values_test_datasets% u0 y  S0 f  H7 f9 d

    ) R0 Y. Y' [+ U/ @2 w, A, n2 y, v# Create linear regression object
    8 T$ Y( s, z5 H# O- O) }  ^linear = linear_model.LinearRegression()
    0 F; w7 f: n/ k+ N, X& |: K: r
    % ~+ E. f2 M5 I2 z0 r% ?3 j  G# Train the model using the training sets and check score
    ; }  G' A; B$ ?. ilinear.fit(x_train, y_train)1 u8 {$ Z2 w& F  C1 y  `
    linear.score(x_train, y_train)
    3 g5 G* B( h: s/ Z
    ' w  g0 Z2 \* ^+ ]: X" m#Equation coefficient and Intercept
    1 U) ^7 P) ?) L% F9 K: H9 {9 O% Sprint('Coefficient: \n', linear.coef_)- k& P: {. R3 L, X) ~& e! f
    print('Intercept: \n', linear.intercept_)
    9 h0 A1 ~. e, p
    9 c; ~& B: _4 I' A: U5 o3 L#Predict Output
    $ n3 w6 a7 }1 [predicted= linear.predict(x_test)& s7 Q: \8 J' u5 D6 c0 ?
    2.逻辑回归" W6 C% ~+ n4 k+ M% F
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    - z2 O% n; R5 }; U: [& J7 K# M  e5 Y( d% P3 I& \# U
    同样用例子来理解:
    ( ^: p7 `4 I% G$ I6 ^9 b' N) j7 S+ N& I1 r. `+ B  A7 b
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    ) A4 U+ J0 p1 ?4 j7 g" w# T0 v- _* A. u; t0 s6 I
    数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧
    . Y( N/ C+ N& K
    - {3 w9 {) i! s最终事件的预测变量的线性组合就是:
    + \2 s( c( f( Y4 V7 ^. v" n( }$ y, |
    0 n6 j% P: X# k7 N0 s
    8 U0 B2 Q' V, z) C$ fodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence9 w8 w, ]. S1 ^
    % i; ^. T- R. ?$ Q9 V. @5 u
    ln(odds) = ln(p/(1-p)). t' D% s" D) b/ B5 F6 ~7 F$ x
    . @" w' k4 l+ M' _3 X
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk$ Z$ E3 J  f3 {* ?1 y! Z/ K- s/ t! R
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.6 s! ?; S8 P3 |  L$ B! P

    : ~" ~/ g1 }, I7 U/ n" S至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    % R- i( F  `& a. D" P1 T' O: T% @6 j) }) Q6 w" e' H
    6 Z% [/ S& K5 {, L6 V+ v0 t6 L
    1 L# o( k( u6 @+ A7 @6 c& B  T
    from sklearn.linear_model import LogisticRegression5 g- k0 @% o! S

    5 G0 ]  {8 u3 ^# t# O8 j model = LogisticRegression()' F+ T6 I6 P# J; R' ^
      o; ?$ r8 c; F4 [
    # Train the model using the training sets and check score2 X9 B, Y5 a8 \- M
    model.fit(X, y)
    . O, o3 ^0 O. _/ @ model.score(X, y)# P) n; t7 q2 x$ H+ C( }
    ( S# @7 z. m9 X4 p2 d9 D
    #Equation coefficient and Intercept
    ! X! M: @' K" i  E4 T, n print('Coefficient: \n', model.coef_)% _; b) x  D, d- B
    print('Intercept: \n', model.intercept_)" c. |. l1 J8 D9 j0 j
    + K& u% `# h7 i! R
    #Predict Output
    & `9 x/ T( F" G- M# f- b predicted= model.predict(x_test)
    0 `* e& h# F  M1 W逻辑回归的优化:2 q# K& b. l* M( C
    加入交互项6 p0 F, f- g0 Q: b, p4 `
    1 k  W6 }. h$ _# ]5 Z# ^$ n
      减少特征变量" G0 ~% L  k/ U$ Q
    $ J8 S0 n# d) [" R) g# C
      正则化) D3 ^! [. T( z3 H) R$ Y2 J

    - B8 b. M$ A1 g2 C) v. `  使用非线性模型, T: B; l& X0 [+ V5 ]

    ( c8 }- m2 ?/ w& E, A' W- U5 ^3.决策树# g* d- m0 y; \! m3 W" t% P
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
      S% W# j* G7 _" s% v# E  I# n: U3 E3 ^* r

    % A( l+ X1 Q. d' P: G6 _! a- z4 S- [& t1 T* s
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。0 S9 H( t- L0 o1 u4 ^# t3 h* A

    $ n+ |5 {/ p$ c' S& y% k# F9 g# l2 g/ H! w
    from sklearn import tree
    8 i  P% s7 }/ S2 @$ {' Q8 a, L! X* ^% u0 U3 c/ o& E3 n8 j
    # m# a, ?( |& s7 D4 t& i- z
    # Create tree object 7 q- Q+ y+ H; Q0 a
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  : \, B1 K& P: T6 o
    ! K' o: j2 j5 i3 m9 V' p$ M
    # model = tree.DecisionTreeRegressor() for regression; r8 `% t% a- u9 `8 d, H! ]4 a5 h

    ; H2 G) r) U# T# Train the model using the training sets and check score# c4 N; U  G* D3 J' P( p
    model.fit(X, y)! B, B2 d- A2 C3 Y$ o
    model.score(X, y)
    7 E+ E$ I. K1 i2 F: `" E  v  h" ~6 H# C8 ?% ^( l
    #Predict Output
    3 {+ M) X; q7 F$ p: X7 F  [predicted= model.predict(x_test)# h4 R6 P$ ~. j: Z. k  D' j
    4. 支持向量机(SVM)
    ( ?2 }7 }: z# u: \: V$ F这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    9 z* u4 w2 u' k2 J& u1 R2 I) n; Q8 H& J
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    ( {+ \+ h& D: A' U/ `. L! z1 J' L( M" n
    ' I) P6 V. H& [# _) }) i0 Y
    - C- q- j1 N" r, w8 K' P
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。! S* q$ U! r+ @! p2 c
    & V! m7 q( ]& Q# i, H: L( t
    #Import Library  T' U) A; q; k" E) ^
    from sklearn import svm
    7 E- A# j  p6 _) L% O) h#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : \0 o2 l+ ~, w: O# Create SVM classification object
    + p+ U  |) e8 h+ B
    $ A7 o2 b0 |8 j- b, F  nmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
    , d+ A/ D& ?/ v8 Q
    & g+ K- E7 o" b  o) t. W# Train the model using the training sets and check score
    ( Z* X3 L4 f# qmodel.fit(X, y)
    ; E1 H* a2 w! Q1 H% s8 v  B9 a4 ]; {model.score(X, y)
    2 W4 R# u' T5 F  y5 @8 S! p9 \: q: B: H
    #Predict Output1 U. Q8 c3 f- q" l  Z
    predicted= model.predict(x_test)
    * {. W/ V8 v6 r  s5 |! C; l/ `3 B6 k5. 朴素贝叶斯
    0 f$ Q* ]' C4 L这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。- E2 t' p) l& R

    , V  A( Z/ `6 A朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    & Q) `7 j% }( D: Q
    3 ^2 Q! s3 [  m- r9 H# X5 R贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    1 {4 a# S/ T5 P/ y9 r9 p9 Y9 Z" P# u8 u

    $ {  s7 L0 i% z2 w3 bP(c|x)是已知特征x而分类为c的后验概率。" Z8 t' u' a  \1 L) ?

    ' F; `  d, O  }4 w0 kP(c)是种类c的先验概率。
    : e/ E5 G, \7 v: j- w( Y5 P8 v" K; m2 X+ T; z, k9 F
    P(x|c)是种类c具有特征x的可能性。5 b- a! Q0 T9 ]  G& _

    # }6 O; J  y* tP(x)是特征x的先验概率。
    & k$ [, Y2 ]7 Y1 b
    & q. w: u; q/ l0 s5 l7 F+ \
    & d, Q9 ]% J2 i6 Q, ~9 J- ~例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    * T, c, t8 f9 q" F  g9 G! P7 f0 J4 P
    步骤1:根据已知数据做频率表
    & G/ i. L+ q, D( K& v+ G2 P2 U0 V4 J8 F6 c. j7 C
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
    , w+ r& i. `" G6 q; k1 Y
    1 J1 F2 h. S$ M3 }: Q% K( h6 ^# j! M% j: v0 L: R3 o
    步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。7 w) Z/ p0 f9 ?1 ?
    提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    7 t, s& I. E! t( O$ x
    " {! J, Q! H" r1 o) J  V我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    1 [$ R, s- j2 V0 @" o6 c; a/ i! N4 L9 i% i% o7 ~, ?$ F& W; n* S5 M
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。! Q  [6 ~: _5 G, h
    + f& f; d* h4 H* @
    那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    / c. i* B' W0 h$ _! k
    3 n% I: {2 B/ ]. n  E/ x3 w& d当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。& `/ u2 M; V: d9 S

    2 w% d) F% [# i6 u#Import Library
    & y5 U5 V( Z- _5 _0 O' N; y) K& Dfrom sklearn.naive_bayes import GaussianNB2 t! C6 c+ b) `' T7 `$ i  ]
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    8 T. a; B' _3 W( r) v6 b9 X: m0 p& y$ m. U( [3 S, j
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link: P: [: X" @. L" R" M% z) |
    3 z4 M# l; |- a/ u. ^
    # Train the model using the training sets and check score
    ! A- ~2 y4 h5 zmodel.fit(X, y)
    & q2 s# J% h; _! T2 \5 f+ c9 ?: F+ V: x. I  u1 M
    #Predict Output
    # {0 n% e4 W) n" [' r6 }) fpredicted= model.predict(x_test)! F. O0 N7 V* N" U+ J6 v. t
    6.KNN(K-邻近算法)9 h: t: Y. O+ F! v
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    ! y) V/ d8 ]5 L2 j( A4 q$ g9 F9 R  P4 {8 G& E5 Q
    距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    7 C8 l- l7 Z3 Z0 n# s, X' \* e3 s8 d& t* g/ \/ }# g

    1 h0 S+ H( w' O- a" }4 H  ^
    3 m% d  M3 _% U( qKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    $ u8 c) s  i8 l! f9 ?7 x
    . }: r% m9 s, N1 C' z" b/ ]. P/ {在用KNN前你需要考虑到:
    . K) Z2 z2 o+ P8 O$ V2 ~( j; O( e0 e7 P
    KNN的计算成本很高9 j1 u: K& r; H7 I+ B! p
    - y3 U) P& D3 \4 W
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。) R& N: o- r1 |- Q7 W# K1 M! p4 E

    : w1 {1 k1 x. E$ b  i1 F4 j. r. c在进行KNN前预处理数据,例如去除异常值,噪音等。
      y* M3 i6 O: O. p! J. J4 h* u
    8 N. J, Q4 P, T1 h* i#Import Library
    5 r$ U& y2 f4 Dfrom sklearn.neighbors import KNeighborsClassifier
    $ I5 T1 ~8 Q, A  D. J; a. k3 n3 c1 I& ]3 x1 A3 L' T! v
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    / f- `) E5 B% y% m# Create KNeighbors classifier object model / k: A- G1 B: h
    / N3 K& C- w" u! {& d( H! O7 s
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    6 q5 ~6 `: f5 D# v. f  Q  Y' o  b, r: D. ~1 [; ]" F6 Q
    # Train the model using the training sets and check score! H, {, G3 R) ]; K% Z6 k
    model.fit(X, y)# h7 y1 x3 ^3 V) k5 p0 e- k
    9 _9 I% F! i! Q7 c# B( W) l$ J
    #Predict Output
    4 t8 `' T7 q! }9 t1 n0 u& wpredicted= model.predict(x_test)+ j8 M. ]; }0 g* {2 x' T' ^
    7. K均值算法(K-Means)# E  c: X8 p1 f
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。- X7 k/ d* d; ]! |' J
    % A& v- [2 s. \9 W
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    $ V- Y/ B& y' V$ Z; j& b6 |/ ~1 a3 X2 d1 h! `

    , C: t3 ^- x3 |% @7 D; UK均值算法如何划分集群:/ l% D* v) K; j% L

    7 }& A5 Y' ^- _
    ) c/ u, d; _/ e! ^; ~" z+ z/ H2 e; R) _
    从每个集群中选取K个数据点作为质心(centroids)。
    6 G7 X" l! k4 M' W& @) n" I1 A& i% I* S( G* z- b; D# u7 N
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。4 v! ]6 d( p" p& h

    5 \# H! R3 P. o8 X# D找出新集群的质心,这样就有了新的质心。
    # N& j2 i0 g, i0 u/ c$ X# E/ i
    4 P" `4 T" D3 X9 }重复2和3,直到结果收敛,即不再有新的质心出现。/ ?1 v# ~5 O, l

    $ o, W# M% O6 Q' ?- {' j: [
    " c; w8 c! l; l( w怎样确定K的值:1 Z9 K" @& J$ }7 H8 M

    ! B) p1 ~/ u4 Q4 A  a" W如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。' N; M# Q$ Y+ S: I0 W

    1 Q& X; W% H% ~, L我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
    5 H$ o8 @; M, M6 g
    ) R+ K, |+ d' W8 D; s) V8 G. {5 j) Q3 F1 s: x3 K, K
    #Import Library8 ]9 H/ f% B& P' u
    from sklearn.cluster import KMeans% e, s! ~$ x( J. S/ j( g( z% f

    7 L9 \  @; A1 i4 n" @  }7 \#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    6 N" P- s* P! \/ r: t1 v# Create KNeighbors classifier object model
      Y3 \  s2 B$ Q9 ak_means = KMeans(n_clusters=3, random_state=0)
    7 c# m. H# Q* c: h/ H9 ?8 U3 S8 H2 T" K2 b. N
    # Train the model using the training sets and check score
    ; y9 `! }- T# v8 P; s. S( }+ R1 }model.fit(X)
    : G1 }1 c+ M$ d' D$ Q) Z/ M/ n) v# [' n% B$ Y* ~2 z; q
    #Predict Output# l6 M; r) m5 o8 s* z3 v
    predicted= model.predict(x_test)6 t& K' |* O0 r, B$ g  H
    8.随机森林! F- I+ {8 @) q9 k: @7 ~
    随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。8 l9 W- v* q' u( T: B8 F' q
    1 H* p" Y0 }  Z+ A7 x. F# Z% R
    怎样生成决策树:: _! l# u. }9 z1 L# ^: d& A% E
    & U- R, c6 o  z: Q+ A* e  Y+ _
    如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
    . |5 X2 H0 K) l( e* ^# c( z  p* c# s1 ]& j8 j( P9 _, U. b
    如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    & R7 R$ y# G& S4 \; w/ [6 z  V) C$ f* W7 n; p3 d
    每个决策树都最大程度上进行分割,没有剪枝。
    , o4 D& _3 b; _- O  H( b
    ( _: r1 E0 Q7 p" O1 B1 e# z) W#Import Library
    % ?3 Z$ U& L" ?* T0 h0 xfrom sklearn.ensemble import RandomForestClassifier% q1 r1 i3 {. t# a
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ' O; i& {/ \; m) @6 [/ v& C$ B. T9 z  U2 a
    # Create Random Forest object
    , V2 k$ T( d5 t6 m6 }7 nmodel= RandomForestClassifier()
    % D" z% Z" z* B3 q- ^% |" E3 Q& p: \3 p! a' q
    # Train the model using the training sets and check score
    & s1 Z5 H- y+ N* b4 y! umodel.fit(X, y)
    ! g. W* Y  A( P' S, N( b; h; ^/ }) x$ D9 {) i. L1 {
    #Predict Output
    : `% R- O4 _$ cpredicted= model.predict(x_test)6 @8 G1 q  J1 M4 v* Z  `- \
    9.降维算法(Dimensionality Reduction Algorithms), O& T  l# {2 {) {' j% W
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。. I, t" l7 ~. w3 q3 I

    + ^2 N+ ?& D3 t, h8 a例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。, V* \, A/ M0 a/ X* F, m4 J
    % p$ @1 Q' W( {6 H) `4 ^+ `
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
    : f" S+ E8 {0 r( o- r
    , |. V- k* |; G
    1 S0 A- b0 N, Z. b8 A) R% T#Import Library0 }: g2 s1 U3 X! V% l4 E+ _
    from sklearn import decomposition
    % w1 G$ j1 h6 I" C/ x#Assumed you have training and test data set as train and test
    " v. ~3 _+ j3 i+ |# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)' ]8 Y) ?- i1 q$ O
    # For Factor analysis
    3 ?3 {2 N* F! u; ^- H' h& W5 P#fa= decomposition.FactorAnalysis()
    4 A" ~3 l% L2 w# Reduced the dimension of training dataset using PCA8 I4 H0 ?& |4 v% u2 i
    # Z/ }4 ]# W; k3 Y3 O
    train_reduced = pca.fit_transform(train)
    * y! W( b: U; t- _( b5 w; [+ d
      N0 ?3 t! X* ^* [- S& z#Reduced the dimension of test dataset
    & k/ a8 t% U/ R& i: H! z3 Ktest_reduced = pca.transform(test)8 s/ M( ?; {& o  l+ G
    10.Gradient Boosing 和 AdaBoost
    9 ~0 t7 l3 @$ D! V. eGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。! v6 q0 l* f* T8 M
    : U2 m7 H; E  R( \2 {! b
    #Import Library  D" W1 p& [$ p
    from sklearn.ensemble import GradientBoostingClassifier
    7 K3 X9 J9 d- b9 o1 S#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    & c' @) z* }. Z: P% O6 ^- J9 H# Create Gradient Boosting Classifier object9 n2 [6 V4 H7 P$ `* g
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    ) l. k+ N- r/ q; j  t" G% C& [$ {  O  T, Q- H
    # Train the model using the training sets and check score
    2 a7 J2 `& A: Z; l" S) I& b4 Wmodel.fit(X, y)
    4 r' I3 x& n5 P* g! y2 b& W#Predict Output- f) K! @# }; o- d; T+ w! z
    predicted= model.predict(x_test)
    # ~1 x! x& e0 u2 H- O$ ZGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    , d6 c9 B$ P$ r/ M; W8 ]
    2 ?/ v3 g8 J9 R0 P8 }原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386. i1 K: j- g6 a, k
    ————————————————* r9 ?" t' W- Z) B
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; Y" K' M( e( b" Q- o
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075: _& X# ^8 G9 }: w" F
    * m' B' H1 G: @3 j. @. ^) C

    % d) G6 f& n# b. f- [
    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 14:06 , Processed in 0.415046 second(s), 52 queries .

    回顶部