QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2248|回复: 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
    & X/ N5 Z$ L6 ~* b1 M/ d' j# P
    机器学习算法整理(内含代码), I9 @5 m/ E1 Q/ T7 p1 w0 y8 }* ?
    $ O) U0 _% G# r, Y4 Z
    一般来说,机器学习有三种算法:& {7 m4 ^" \' d) |2 {1 l9 p. Z

    0 v8 }8 j: V/ `( G1.监督式学习
    : M4 L3 t! I' y3 `/ [% v
    ( q3 y& |- i& o: [: M 监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率) H) `$ R" I$ ^8 C$ Z5 C

    ) E, l5 s7 z- s& |% \' y属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    ) j2 r  j' G0 F7 \0 S3 \/ ^
    # y* N! _0 T( p7 O. G5 ^% n2.无监督式算法9 C9 w' O- g' ~7 d

    , ]- z1 [1 G0 s5 j无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    8 L5 O) Q' H1 ~8 G
    ( C: ^4 m  |4 M- I属于无监督式学习的算法有:关联规则,K-means聚类算法等8 }- S4 `  |) q  [
    ; x4 e4 S1 D( Q+ |8 x% E* h
    3.强化学习
    + W% H' z' P) {- [- \0 I; E4 C) b4 _
    , x- e  P4 S$ @' Y( j这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    2 s/ ?; M( @8 g, Q& h
    ' Z( k8 ?; ?6 V1 y/ w属于强化学习的算法有:马尔可夫决策过程8 D+ A& `" _* b9 y: S( [) p9 R' i

    0 D% p7 ]+ W9 v& f1 u( O常见的机器学习算法有:+ v+ u9 N$ E/ k+ Q% K. ~; h

    / k' p# }1 b/ l9 f
    7 N0 x, a# p+ G( R+ z1.线性回归 (Linear Regression)
    ( r( V* u% J4 _0 K2 h* b: m
    . u8 S1 a  O+ ^7 D" G9 j2.逻辑回归 (Logistic Regression), ]5 {0 t$ R+ l1 O
    , d/ q" R8 h# B) d; D, r5 y+ F! l( |: Z
    3.决策树 (Decision Tree)4 b4 B0 o1 O4 {1 [" w4 s. ?" [  v

    ; p5 i# I0 W$ A* l# X4.支持向量机(SVM); A2 p4 D- L0 f4 u  G& l/ Z

    1 y, A  C0 Z1 R5 E  _7 y" X# v1 n# N5.朴素贝叶斯 (Naive Bayes)
      y+ s* L. Z/ P/ j1 L
    ( O9 N% u: o, i, q! s  d6.K邻近算法(KNN)
    & u# P+ r. C; l* c+ J' h! w4 T. h
    3 B( f! t7 V0 `1 |$ Q$ \' z, u7.K-均值算法(K-means)+ {  `, Q3 O2 g: X. P- U& O

    , E* [6 S& e/ G" ?& `* y$ P8.随机森林 (Random Forest)# u* Z' W" X, z

    8 I1 R4 t7 y8 r4 D5 e) ~# y* t9.降低维度算法(Dimensionality Reduction Algorithms)" c1 j1 c+ G# f3 v

    6 }2 ~7 v5 s8 x+ T( @10.Gradient Boost和Adaboost算法
    4 I- y6 j: \1 S4 a一个一个来说:
    & f; H6 x1 s- E4 P$ r1.线性回归- Y! z; Q, j. g; x5 C' P1 o

    ' j: M1 e" Z4 v- [9 k; w9 [线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.  ^  W. B5 k! t' d

    + J2 }5 ]3 g- N( E, Z在这个Y=ax+b这个公式里:, |2 h4 J; E. r  S7 N) C
    . p9 X! i7 v7 m7 W( K8 Q* _
    Y=因变量
    8 T/ |2 ^$ D4 o6 h1 `
    8 S- ?9 `# Z% F a =斜率7 V  P6 s! B, e9 F1 ?

    6 h6 x* ^* P$ O9 z2 o x=自变量
    3 e! ^- ^8 z: q- e, X/ w# p$ S& n
    b=截距7 s; g( L( v/ C3 s. Z' D% i7 F

    9 p7 a8 H- p3 h' ~ a和b可以通过最下化因变量误差的平方和得到(最小二乘法)4 \7 h5 g% a$ h3 h+ i7 }

    6 ~5 `$ z3 l' s' r/ V, N% Z我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。' l/ j( n: N, Y

    / k) M' c' K2 X: Y2 s% m+ H1 |给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.6 C; ^5 H& K! Z! U/ U. ^2 Q" R% F

    - |% ^# y' V0 n' S$ [4 A, p3 [4 W# K; K
    - u: v4 l* K% i% ~% O
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    5 R9 m/ x# A9 C$ h1 j* Z$ ^# d6 }& z# L
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归5 e, q/ w6 E  r7 d5 q# U) H* J* {2 @
    8 B3 X; F$ R% @: o( F% f- R9 J
    Import Library$ ^3 b6 C4 s0 j
    from sklearn import linear_model
    . V/ `9 Z6 x9 M0 J$ k4 |
    5 z, t  [& y' U4 k6 f4 j  Wx_train=input_variables_values_training_datasets, }! K0 t6 ]7 |: ?& F9 P' @
    y_train=target_variables_values_training_datasets
    , E7 f& k8 l3 L/ y; Gx_test=input_variables_values_test_datasets
    1 A* c+ i1 z8 z( B
    - m  k# h+ K! k( Z& c# Create linear regression object5 ]$ T" _5 @% U- ^! H$ v3 L1 P
    linear = linear_model.LinearRegression()
    ) E8 B& o. Z* a, m% t) ]: W' a. [+ O; |% m7 ^
    # Train the model using the training sets and check score
    % E( F: k( ^" z9 o( W4 @linear.fit(x_train, y_train)
    ; M' _9 |0 Q+ s! {linear.score(x_train, y_train)
    ! q' r; {, c5 w. _2 D5 q* K
    ; j# d$ ^+ P2 J# u0 B9 O#Equation coefficient and Intercept
    $ `1 `4 E; ^8 E! u3 ~- u8 p: }print('Coefficient: \n', linear.coef_)
    ' e2 R' H. n3 t) x( y) K: gprint('Intercept: \n', linear.intercept_)8 H7 ]& T, M3 M/ ]% Q

    9 E' S, b, V2 k3 m' X#Predict Output; s, D& _. x) o& Z
    predicted= linear.predict(x_test)  u: t1 D9 s& S4 I( _$ n
    2.逻辑回归) ^5 }6 s- I8 P4 A3 A8 R# z8 n
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    ' {+ f+ J6 w- s+ B5 f& _8 ^
    . I5 D: O" g8 F# g# W( J: b% G同样用例子来理解:
    3 z! S4 i4 _/ e0 W! [/ V' e' d: I4 a6 z' x+ Z
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    / H* q4 Y7 S- s. C% S
    : d2 U& l2 X9 J数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧2 t/ x! ]* i5 z# F

    9 H* [: K# H$ @# L+ p; n最终事件的预测变量的线性组合就是:
    ; S+ P( X0 I' f( Q% ]& Y) G: W7 f

    $ N. N/ D0 X+ b3 k5 y- modds= p/ (1-p) = probability of event occurrence / probability of not event occurrence/ t. @: Y/ J4 k5 `4 @
    + K% ~4 x" f% s) D/ ?* \- N
    ln(odds) = ln(p/(1-p))
    9 H+ e" h3 g" a+ n. I
    % t- T* |5 b+ E3 elogit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk
    4 q: B' E1 C! }' T9 |  O8 s3 J在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.- x: K4 T! H6 i+ q# W/ S! M, I

    - ]' X3 L; l- {  Z9 S* X% S- U7 E至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.
    6 T. J' ]9 @( A0 {" R6 @
    2 H) [" l* W( |" E) \4 E: g5 {2 Y2 @4 \% G( Q" [* V3 e1 Z3 V( d
    ) q: V* x! \. \: O
    from sklearn.linear_model import LogisticRegression
    2 i( v/ _+ _& u7 B7 M
    % W' Z& z+ e+ ]( _) u/ n& c# V" ]; C( Z, x model = LogisticRegression()* \# H6 B6 o. p7 g  ?2 D* |( K6 W
    ! {& s& x& L' }' E1 k7 w9 Z
    # Train the model using the training sets and check score0 p; E6 W# D  k7 u) C
    model.fit(X, y)
    1 U0 `6 G0 q8 V( n8 o3 V model.score(X, y)
    9 r1 o. B/ u8 i( S" D) N. K$ T( J4 X# ~8 w- L
    #Equation coefficient and Intercept
    1 F# A2 g- a3 g1 l print('Coefficient: \n', model.coef_); o! s0 j7 T: s" u( W8 F# Z2 ]( r
    print('Intercept: \n', model.intercept_). M& A7 ^$ T' w8 f# b
    9 J6 J1 {% P+ F$ Q
    #Predict Output
    0 S# Z) {3 S6 M2 X5 X9 M predicted= model.predict(x_test)
    & R7 l* ~% I  [& U# v6 }逻辑回归的优化:
    * p6 }- P( I( E6 e加入交互项
    ! @* q6 W* F/ w
    . X; u6 s5 _7 F' q( n- @  减少特征变量
    : ~+ B! @3 x: }0 Y/ v
    ; K/ Q2 O  r1 j& K3 o$ S) v  正则化6 C0 {+ ^* e. H/ O  {+ G; A. L0 ~

    , i6 ]5 o) d$ \/ D  使用非线性模型" u; T5 Y2 g6 l6 _
    ) B6 V0 |  K" @3 |' W
    3.决策树) D" T2 M( @9 F4 f/ G
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。: @1 p% b, T4 g

    7 a2 J4 p: T# v" J
    " I" r4 B: H$ ?+ M/ a, P! a# |  N# ^$ y9 y, h! D" d: K- R) U
    从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。
      B1 q, D, Z4 d6 {8 c: R( |* c. b2 ?) O7 l5 `  m) c
    4 S; {6 V& S6 o7 P
    from sklearn import tree
    % D; ]4 G5 L3 W, a/ x# L0 }; a; c' e+ g: I
      L4 K- s" t, m% |; w
    # Create tree object
    6 f1 y1 r# A$ l  U( M* T7 `1 qmodel = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  
    ( H6 f( x, I) u* A# p" F  r2 E' j5 b
    # model = tree.DecisionTreeRegressor() for regression, c+ k! q- _" x) u/ q# r8 ?

    # G1 C% S- ?" [) M( X, k1 n# Train the model using the training sets and check score
    : u- J- n" i0 D7 qmodel.fit(X, y)' F- G  b% l9 A3 c+ t& z
    model.score(X, y)
      y9 g# A7 j# E2 u6 h1 }9 ]% y& T6 W0 ]' D6 I8 q, n
    #Predict Output( L2 \( `, I5 o, k3 B- [- e( ^
    predicted= model.predict(x_test)) F. N4 U2 j/ O8 e2 C. K
    4. 支持向量机(SVM)
    ( ~) O5 o* ?. Y3 b. }" ~这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
    3 O5 I: B$ ?8 E) ?/ `: r' X5 E: p, J  e1 t
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。" x& _: L' U% i4 B; y9 }& ?& q
    0 b6 M+ [5 x" j. q' s# y
    : I$ t# L/ F* h& ?8 U9 v
    " J/ A# i9 W5 u* y
    在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
    0 N+ c: D$ p9 \2 B& Z( D
    0 ?' B: \4 B$ p#Import Library/ v$ R6 X% Y7 q
    from sklearn import svm* r( f# c3 o" `' [1 h+ h
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    5 I7 I5 Q' f- [! H- c/ E0 _2 Z# Create SVM classification object % l) I1 e0 H8 E8 }$ H7 R

    # r7 n% V: e  I% i5 a  @model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.
      Q/ B" f6 Z- d0 ~/ s/ Y8 B9 u" [# S' @$ e9 K1 m; s) k) v
    # Train the model using the training sets and check score
    0 i4 a3 x, \0 |0 ~/ P- p) Ymodel.fit(X, y)8 I6 Y. k. ?2 c
    model.score(X, y)0 b! b; b2 ~  G7 `# U

    4 S1 K, s  Y0 h#Predict Output
    2 [1 F, ^9 I! W- `+ jpredicted= model.predict(x_test)
    ! m2 \: B" S. {7 r8 y( f3 e5. 朴素贝叶斯
    5 L( k' g5 `1 O3 ~% I7 H6 L  q+ e这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。0 ^3 Z7 U- j" k8 h1 j
    $ q/ O& P1 |3 Q" q% i- m
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。  }4 {6 e( y3 S2 e. p2 E
    8 y* v  f+ t) z4 @
    贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:
    : @5 _, f0 d+ B! ?3 i2 P, E- N' w: X7 Q6 K! c
    , o5 G( y/ r* M0 G1 f/ X: m
    P(c|x)是已知特征x而分类为c的后验概率。
    ) d+ t; O! Q! ~; W3 t2 q5 `# n+ t1 \+ T, j
    P(c)是种类c的先验概率。
    , p9 S; g7 d* m2 f" c- [% ?7 ^" K% P! ^: l1 ^3 {% a
    P(x|c)是种类c具有特征x的可能性。
    : v5 X6 f0 H9 O1 d% b2 C
    0 u. M0 F* E" P* \& cP(x)是特征x的先验概率。
    9 n4 y9 Q7 O; U: W
    ( Z" L) g1 m' l& \( U2 G# k1 b3 b6 O8 W
    例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    8 U3 |( P1 e+ O2 [7 r/ f: [- ^- _6 X
    7 n. N$ H/ p+ o0 r, e+ y) {+ B7 L步骤1:根据已知数据做频率表3 O8 O6 O; v4 W9 r

    1 r% c. _. o# z- f3 I8 E8 h步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.$ y+ [: C. C* R. M9 S9 ]8 ]

    0 J& g# h6 }: ?' B8 \/ b
    % P$ T5 x$ t& I: c, U步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
    . m) }5 i4 z& l5 a  {提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    ( X6 \+ E- ~1 [1 B2 y4 P( H
    + ~2 g. [: X, U6 w- D% z我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。7 s5 D, b+ R5 |

    & C; Y+ g! k6 K: {& r" [+ o这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。# ?" d' _- L1 N: o5 Y9 x

    ! z6 O1 g& p( S: C/ m3 s. y那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
    + A, Z+ D* g9 R8 j9 l6 e. [8 h  R, H6 d$ U6 A+ o  B
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    ) T( I- G; t  w6 |3 |" j- o
    : v7 w6 _  H7 C, a; n/ f#Import Library
    9 ], N% `2 N1 n; Afrom sklearn.naive_bayes import GaussianNB9 T  _, U7 s/ \2 f$ `; b* ~
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset5 \1 t4 D+ B, i
    : S6 ], h' r$ a
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link( L% o/ C0 D9 v. P

    % V' [; d2 @' b1 R% j# Train the model using the training sets and check score  x$ }9 |  x6 z( o
    model.fit(X, y)
    ' {8 k% G& [; Z) U2 U/ d6 E5 N: b& V8 m! L* K  m
    #Predict Output  d& L2 P/ x$ O' o
    predicted= model.predict(x_test)  I) `/ W. n4 r& f& P7 }; i
    6.KNN(K-邻近算法)8 O$ e2 c# I2 F% [$ _
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    2 D% m7 [: X1 i  ?
    + Q* l( \, g; K1 V0 Q2 ]距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。) _* @6 J  a4 d" A

    - x/ x8 j# u" f$ J2 x
    8 k  T8 n  R' w" {4 p- z( j% A2 q- o" M
    KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。* v* M! r: U; U

    3 _/ `6 b( w/ L. x6 E! W在用KNN前你需要考虑到:
    . l% |& ?  ~  ~" q3 u' k( ~- o" m0 D3 H
    KNN的计算成本很高
    : ]7 t' y5 f0 R- v1 Q0 V  X. k+ f
      F& ?: O' p7 i  G5 o所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
    & K: @/ N! \* y) u7 r, Z: u# U! k7 h4 S: T+ Q2 h& R
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    + p$ h0 n; e! |: m: m' {8 t) J4 D& C6 `2 H
    #Import Library7 P7 D2 i7 }8 k: \+ E4 z" }8 q6 |
    from sklearn.neighbors import KNeighborsClassifier2 G. G, {& f6 f# D0 l5 q

    9 R+ e; M9 D( l7 F. ~* F#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    ( J. w8 J# ^( Q% p  v0 `/ T1 R7 H# Create KNeighbors classifier object model
    ; C) r! G) N0 f5 m4 T" ~! w1 T1 }; m/ @6 j& H; K
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 58 s/ W8 R( G* R# b. f! X) r
    " o0 z1 x3 h1 H5 y- w8 f
    # Train the model using the training sets and check score
    5 E; L/ i, s& w/ [2 Ymodel.fit(X, y)
    . t% a$ s, p. z) c5 _7 P8 ^$ b2 u( _& B( L/ ]7 f, P" e- F+ a
    #Predict Output8 s2 y' m; D) V
    predicted= model.predict(x_test)
    # U4 p6 ^# e! d5 _1 j7. K均值算法(K-Means)" Y" F, Z" X* `7 B6 G: a1 ?$ x
    这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    : }) T. k7 A( U) ]( t+ A- I& }3 z' c7 ~4 H; }( H& D1 U7 J7 \
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
    2 Z- u: U# {" Z% t5 d
    ) L. n: F( c' X6 N: n
    , Y8 j8 ~7 s4 @, |$ ^. C+ YK均值算法如何划分集群:& y# q) h6 h, g, ~: |0 n
    , d7 d3 N' i! v- _0 I- i6 B

    $ P/ [5 f5 T1 D8 f, I/ ]
    7 u8 V1 S9 W  f8 I7 B从每个集群中选取K个数据点作为质心(centroids)。
    : F5 B! B; V! S( M3 s: x8 I
    3 e) r6 D* z% o' p' t8 f将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    7 G! k5 E3 f" }5 R' p
    . O, Z6 [6 b6 G0 u5 |# e找出新集群的质心,这样就有了新的质心。! ^  }* W" c- Y5 Q. Q. I& ?+ j2 T

    0 A& A. P4 L& d4 n% O重复2和3,直到结果收敛,即不再有新的质心出现。
    & R7 f$ O! e. f/ C3 P
    7 c5 S1 o" S8 R
    # Y* |1 u( R' M2 V; g  k3 Y怎样确定K的值:
    & L/ I; @' s) K" P- e. t" H
    . e$ w% e) o  k如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。5 r# P. d: S! ~7 E

    + A3 S$ y: f' x+ f( U+ T5 d8 P我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。6 a( U% h- s, g

    ' H0 d6 D; J5 D' l( g$ |% o" h/ z0 `2 \, \, A' }" |$ W' M/ ~8 ?4 G
    #Import Library
    , p( i6 t2 n5 mfrom sklearn.cluster import KMeans+ G4 M: W1 W& k8 O

    ! v3 v" |( ^' {#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    ( m2 T4 g! q% }3 I  }( D7 Y# Create KNeighbors classifier object model - e1 x7 Y+ W; q: P) d/ C* ]  s
    k_means = KMeans(n_clusters=3, random_state=0)
    * k/ K) ]2 l' N* z8 P6 L9 V" ~+ r7 ^$ e, _1 f
    # Train the model using the training sets and check score
    : K( N+ y6 v- Jmodel.fit(X)
    1 H3 C7 `2 A0 _$ v2 h1 h! n
    : g% N. ~- ?0 e8 \8 [5 A1 F#Predict Output
    # v( f" y* V! B. k2 z3 Dpredicted= model.predict(x_test)
    2 k6 @! M5 ]0 @6 B8.随机森林
    & e% Q0 x/ H% N1 v随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。0 n" s3 z$ R' ?8 W) H/ k

    . d4 \5 \3 f7 Q4 z9 _' Q7 a  V怎样生成决策树:' u* l% ^1 b7 G& J- q

    / B! @1 Q5 l, E5 B; i如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。, T# Y$ Y! ]0 }6 y

    2 J4 H" K4 D* a如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    4 G) I! m/ m6 o: \6 ~3 W) P* c0 `) @, k4 ~+ e
    每个决策树都最大程度上进行分割,没有剪枝。
    0 J! \+ z8 e" G) q* f2 a
    ( b  C, K3 |9 Q: ^, [#Import Library$ B. g: g7 V1 C4 P' {5 }. k1 I' t5 u
    from sklearn.ensemble import RandomForestClassifier
    ; i2 E0 l7 U4 I  n1 y* N#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset2 S  f9 T  l4 M( e+ E! }

    * H$ x, e" u7 j1 k  T# Create Random Forest object
    8 p: m! E6 `# [9 I, A. N3 P! smodel= RandomForestClassifier()7 d+ i7 P- ~1 i
    9 C* ^/ R3 |, i; T6 y# Y
    # Train the model using the training sets and check score2 s( r. Z, }) M* d- v/ C
    model.fit(X, y)
    $ W  r. ^) z! k
    ) y  w/ B0 @3 b' F, A( H) a9 g#Predict Output0 @4 b( I  t. Y$ H8 n6 V
    predicted= model.predict(x_test)
      a% p, p; K4 W5 |& ]2 v9.降维算法(Dimensionality Reduction Algorithms)
    4 w: d9 B- V& K* b1 b! y+ P在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。: r- p3 g& `; N5 ]$ d
    3 H9 k* \  r) z& I
    例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。  d$ c8 T" Z% o, z  A' V
    4 V, z, I" \7 G" t! ?
    作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。) S/ q) {- Z" G5 I" K! J

    6 T5 G" D* p1 n, H( P# v/ @6 `2 e0 E0 k' q, l, _* H
    #Import Library
    1 U% a# a& @: m: F; xfrom sklearn import decomposition
    % J4 [! K# R; O; [8 R* N#Assumed you have training and test data set as train and test9 f' Q/ n' N! `3 F+ s, A
    # Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    * v! w/ o/ r; |! B6 |7 C# For Factor analysis- A! H) i& y8 U  U8 @
    #fa= decomposition.FactorAnalysis()
    5 g6 p! h) T# ^8 J# Reduced the dimension of training dataset using PCA
    & [6 |& k6 Z: w% J/ [* a+ H0 g2 G6 q* g4 L" p7 ~3 M/ e7 }
    train_reduced = pca.fit_transform(train)) ~; B0 k+ G2 ~, i8 `

    / z& l2 i, j9 S1 x1 [#Reduced the dimension of test dataset* [; N1 B  h- t9 h
    test_reduced = pca.transform(test)' b) O* E) D6 N- l% i7 J! h
    10.Gradient Boosing 和 AdaBoost
    2 z2 l8 R3 o7 u( O) PGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
    " Y2 p* o- h$ e8 V# k7 J4 G$ D
    ! T+ S* q# D( A. r1 W* T1 v#Import Library
    + p& Q  A( X2 c5 @from sklearn.ensemble import GradientBoostingClassifier
    ( z& r$ M1 W4 u- U& X#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    : w. _$ Y/ X& U& _3 g* h# Create Gradient Boosting Classifier object5 }. g! ^) V7 L% p
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
    & F& b  B$ V4 G. h
    % j9 M7 n9 i! n# Y# Train the model using the training sets and check score
    9 C( E; R$ r% m+ ]% vmodel.fit(X, y)  f  @5 _1 K& q2 J  K5 x
    #Predict Output
    # s" `, P" i+ F. {2 Bpredicted= model.predict(x_test)
    % f" {5 I  G, G0 W% ~- @8 fGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。- E& X- q  k: F; a8 j

    9 d% P( E% _4 Q0 q) f! O& R原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    & v0 G1 s  N' b" K————————————————
    , `, `# C1 W/ T- L. z, e版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 T- ^0 c/ X$ j/ c$ u6 k! B- O* p原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075
    - G. _# j: N, k" f+ W8 a+ S  G$ L4 D) ^/ g% ~: D

    & Z( ^9 @+ @' ]( @
    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-9-9 15:54 , Processed in 0.353458 second(s), 51 queries .

    回顶部