QQ登录

只需要一步,快速开始

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

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

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

5250

主题

81

听众

16万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-4-9 16:23 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    4 P1 {0 Y3 X; A& d- o机器学习算法整理(内含代码). N$ l( K& C8 s9 }7 e2 n- A% f

    ) i* m  R8 g0 N9 x一般来说,机器学习有三种算法:
    7 Z: ?0 q4 H' E. r  a
    8 J9 ?' o/ G! ]' |- b% X/ O5 u( B  m1.监督式学习
    5 F4 G( V! E6 @( M3 K5 V" \# K7 x/ d5 T- u0 V0 k, L* K
    监督式学习算法包括一个目标变量(也就是因变量)和用来预测目标变量的预测变量(相当于自变量).通过这些变量,我们可以搭建一个模型,从而对于一个自变量,我们可以得到对应的因变量.重复训练这个模型,直到它能在训练数据集上达到理想的准确率
    7 W( I* d* ^( b0 {+ \
    9 h% d( r* H- P# M7 E; O. U- b0 M% [属于监督式学习的算法有:回归模型,决策树,随机森林,K近邻算法,逻辑回归等算法
    % X  {/ W& G  l: V' N1 r% b( n7 s1 F5 b
    2.无监督式算法7 H* G2 e# G4 _, P8 m

    4 q, _2 X. ^+ y& D3 s' f! i! f. p/ c无监督式学习不同的是,无监督学习中我们没有需要预测或估计的因变量.无监督式学习是用来对总体对象进行分类的.它在根据某一指标将客户分类上有广泛作用.
    2 |4 e$ d5 f/ y* @  \( }
    : d* s8 ~- o# D; P属于无监督式学习的算法有:关联规则,K-means聚类算法等
    $ @/ `2 b, s( V! ?2 w
    1 I$ n' M/ ~5 U2 n; Y6 U3.强化学习. `: A' H& I/ V$ a8 f
    / b% M) E) h. i  u! y' r$ r# X
    这个算法可以训练程序作出某一决定,程序在某一情况下尝试所有的可能行为,记录不同行动的结果并试着找出最好的一次尝试来做决定
    + r: O, g) `: X  s
      G. B0 V3 Y' E7 [8 i9 @. `, \属于强化学习的算法有:马尔可夫决策过程
    ( V! e" f! d$ Y1 y1 U2 `- b" D( y3 R! C- U+ V
    常见的机器学习算法有:7 C% y% i" @1 S, F
    3 h! S' p1 c6 R; m, A, @3 u
    + B6 |" w; C4 [7 p( |
    1.线性回归 (Linear Regression)
    , H) A) y4 W5 K. d5 D7 ]2 R1 ?- L/ I6 o  x+ R" _$ E6 o1 i* p
    2.逻辑回归 (Logistic Regression)
      O) n$ H! a( }; E# I- j* ~; U3 A+ T3 J
    3.决策树 (Decision Tree)5 D2 l+ W$ p/ c. w7 ^) H" e2 b

    5 i% L. B  z1 M0 m9 Y/ M3 B) N4.支持向量机(SVM)
    9 e7 |& i. j& S# s
    ' Q$ n( B/ f, ?. U: c- N1 R0 K$ O6 K5.朴素贝叶斯 (Naive Bayes)* w4 q8 P; c$ ^5 Y" R3 ^0 D" p! f3 R

    , ]3 Q, q' ^# v1 T( s6.K邻近算法(KNN). H! j, H4 o+ K3 R3 X1 v5 {1 @

    # S( ^# v& e% \/ p) W! L7.K-均值算法(K-means)
    2 k3 P7 P9 M: H. G4 \1 t! ]! ?2 z0 C  f  i. c$ z. |( x
    8.随机森林 (Random Forest)
    ) [3 R" n7 z9 @: I5 u* L
    0 u; Y& j  _) I0 n. Y- H9.降低维度算法(Dimensionality Reduction Algorithms)1 O; b; u. G! M0 R3 N
    5 z$ @" p9 y% ^/ ~4 B( ?' S
    10.Gradient Boost和Adaboost算法
    3 H: O  Q$ K+ q( i4 r1 o一个一个来说:0 `6 b) ]3 Z" [- s+ R" b, j; f% m
    1.线性回归
    0 p5 I  V3 m7 u& u
    ' T2 P7 O2 a+ ~线性回归是利用连续性变量来估计实际数值(比如房价等),我们通过线性回归算法找出自变量和因变量的最佳线性关系,图形上可以确定一条最佳的直线.这条最佳直线就是回归线.线性回归关系可以用Y=ax+b表示.% F) b% q3 n/ s+ `( P7 q

    1 u0 [0 e$ W+ d4 \在这个Y=ax+b这个公式里:! [7 h9 i2 ~* g! M1 I% K+ H; o# A

    4 x( F4 G5 y) d" k8 V* G' L Y=因变量5 P: w, t+ P0 f) u, B
      Y& j- B8 c2 }( [; _
    a =斜率
    ( a, T+ Z( _) E$ s5 |" ]% A4 c, h) M5 l
    x=自变量0 w" R; m$ o& k2 g4 F
    5 a! m, ]! J1 J% Z: v6 d
    b=截距
    9 ~$ C5 \! d' }. a& a1 x% O1 N
    & A* U9 \' r9 ~+ v. P+ G a和b可以通过最下化因变量误差的平方和得到(最小二乘法)& r5 {' R( R& x( e+ F; O
    6 \3 O2 `( u) K+ z4 B
    我们可以假想一个场景来理解线性回归.比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。* n. Y* s5 U" j# B5 [- N3 k1 M

    , l; V2 q" \6 Y# B; s. t给大家画一个图,方便理解,下图用的线性回归方程是Y=0.28x+13.9.通过这个方程,就可以根据一个人的身高预测他的体重信息.+ h. m$ K1 T; B7 I7 \$ s6 O
    ' K4 [+ Z0 U8 u, @4 x* b

    8 O; r- T+ N. Z; k& k7 ~0 `2 \! \- M! g7 {" Y" y
    线性回归还分为:一元线性回归和多元线性回归.很明显一元只有一个自变量,多元有多个自变量.
    5 v$ N! J. {# }; M2 L# f3 F. h3 F, c7 f: n) P: P+ a' N: K
    拟合多元线性回归的时候,可以利用多项式回归或曲线回归2 b" Q2 `5 t. _6 r
    7 ^5 D8 V* o; m; Y' t1 u
    Import Library; y+ d) _! u+ t
    from sklearn import linear_model: m. o6 ?+ C0 y; k. T8 i0 v' R% C
    1 H+ ?6 W3 d. p
    x_train=input_variables_values_training_datasets- _# G. b" u& H* o1 E. D% B& T# G
    y_train=target_variables_values_training_datasets9 d% [& f5 {: J: G) K" S- B: N
    x_test=input_variables_values_test_datasets
    ' r/ x6 \, Y6 `$ y! K, ~/ o2 G1 t( ~/ _* `
    # Create linear regression object
    9 b6 u  h1 V( i- c4 Slinear = linear_model.LinearRegression()
    ) C3 b- R0 k. `# Y6 a6 s& q4 A# S4 V
    # Train the model using the training sets and check score8 t  S. o* G" T1 x
    linear.fit(x_train, y_train)& f9 [! `& ~$ |; C
    linear.score(x_train, y_train)
    9 y# w7 A% h( t8 l1 ~* c5 e7 V7 ~) G# U* c6 r
    #Equation coefficient and Intercept% S' M6 G& U9 q3 l1 O; r
    print('Coefficient: \n', linear.coef_)1 T! p4 g" j2 a% C! C1 t
    print('Intercept: \n', linear.intercept_)( W+ G, [& m# v" w/ N

    $ g. _' @8 X! Z#Predict Output. F( A/ E6 K3 v& {
    predicted= linear.predict(x_test)% ]# |" V) s  h" k
    2.逻辑回归: S5 K7 J4 O6 e
    逻辑回归最早听说的时候以为是回归算法,其实是一个分类算法,不要让他的名字迷惑了.通常利用已知的自变量来预测一个离散型因变量的值(通常是二分类的值).简单来讲,他就是通过拟合一个Lg来预测一个时间发生的概率,所以他预测的是一个概率值,并且这个值是在0-1之间的,不可能出这个范围,除非你遇到了一个假的逻辑回归!
    : ^. e' Y1 W0 h" i1 R9 n) ^8 y( L1 M- t$ C! F* N
    同样用例子来理解:
    $ t- }7 q; k% s( v9 r. I9 M# ]4 _# m3 |9 q( v
    假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
    0 [6 h6 e( D: p2 q) b* S" Z( \
    0 G9 d( s# b* t# P. j8 Y: p# U数学又来了,做算法这行业是离不开数学的,还是好好学学数学吧% p3 v1 J9 E( v

    0 f3 J8 G& ], ]( C8 c6 h7 s$ g$ A9 Z最终事件的预测变量的线性组合就是:1 E  i% w/ @* V  m) f. l

    . _" F# |1 ^9 C( A* s
    8 h6 b5 C# c! ?. F# i  xodds= p/ (1-p) = probability of event occurrence / probability of not event occurrence* r. ^+ _9 w/ m. H+ p# {( g
    ' }# V" m; S: L9 [3 i
    ln(odds) = ln(p/(1-p))7 E0 M  V* O1 p3 b' C4 Q; |
    , |3 O; O4 v( n9 r9 X6 Z2 D
    logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk" X* V! \! K) ]9 H
    在这里,p是我们感兴趣的事件出现的概率.他通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和.3 ]! g; X- z# \( X5 H
    $ @$ R* ^3 Y7 W8 X7 I
    至于有的人会问,为什么需要做对数呢?简单来说这是重复阶梯函数的最佳方法.8 w( T" H4 e. h. v
    # ^' u' U: [, Z% ]5 q
    - Q2 A3 b: I5 e, ^2 d- K

    ' T0 A- _7 Q3 F$ A4 _ from sklearn.linear_model import LogisticRegression
    " t" [* B% |+ B/ |& H& K( z" P# l
    0 X/ ^* y8 \6 y2 o/ @6 \7 j model = LogisticRegression()
    4 `9 Z$ A# ?* [  z
    . i" z$ k: t6 c8 u! I # Train the model using the training sets and check score% N8 j1 e, q+ T, Q
    model.fit(X, y)+ W. ^: L( H. h, ^- y
    model.score(X, y)
    ) E% T# \# E- S* g
    $ K  P3 J- l) U" m8 M #Equation coefficient and Intercept1 x# C. w0 U- _2 p
    print('Coefficient: \n', model.coef_)
    + N; r3 F" Y! z6 x. H print('Intercept: \n', model.intercept_)
    $ B- v% E$ |+ P( l4 K* h
    , R" j( h6 G( l6 n& l- H8 g, d9 Z- g #Predict Output
    0 r# p% g! F7 D2 S# y, | predicted= model.predict(x_test)- F) ]3 w7 @) Y- J# @( c6 \' `
    逻辑回归的优化:
    , f1 L  I+ I' ?3 h& j9 l5 x* }加入交互项
    2 U: o0 V+ T' P" H/ z0 o5 [$ p+ `5 T( j6 N* Q. g) J
      减少特征变量
    2 D8 N/ }6 t3 S7 ?! |
    * P( K8 U" t8 D4 n6 {0 w0 x" r  正则化
    & N9 {8 H' ]7 c4 o5 W$ C+ ?* B+ l2 b' p7 u* ~6 H
      使用非线性模型
    4 Z: T' E  n& M' S* w
    # W2 n9 m: m$ V& n& w2 {, E3.决策树  I2 y% a7 b2 Z$ q8 G
    这是我最喜欢也是能经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。这个算法可以让我们把一个总体分为两个或多个群组。分组根据能够区分总体的最重要的特征变量/自变量进行。
    ! Y; u1 d  b) W1 Y% y: r# X. N$ l" y

    - p8 A( h5 t4 u7 D/ u' B4 X
    / _! `1 j6 r. A3 k3 }6 [/ a' _  [从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如Gini,information Gain, Chi-square,entropy。4 Z' Y9 v- J; y3 @, }3 [2 ^

      [/ {2 s3 \/ c
    " Y" G" R4 z; nfrom sklearn import tree
    : l2 S& o( |5 L, l) z$ |
    8 b5 f; M" E0 n3 Y( D9 y( C3 p. \1 Q& o4 v+ w9 B9 B  i7 l
    # Create tree object : r( J0 _# O# \6 G8 H# N0 L1 R" }( _
    model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini  : M) X3 i% N( s* s; R
    9 x/ @# Y! D: |. b1 E- c* E
    # model = tree.DecisionTreeRegressor() for regression% e1 \3 Q; J4 B

    8 b( t3 K. H$ t6 {* V" J- B9 ]# Train the model using the training sets and check score
    0 u( N) W: R# |5 L( W9 ?9 m1 U; Hmodel.fit(X, y)2 z0 ^- U1 l3 d" |
    model.score(X, y)
    $ W4 X0 s; u; i3 r# n% l3 T6 H# e" }% @! Q; l
    #Predict Output
    ) N9 a) C% X* O9 [7 k/ s7 S6 A' Vpredicted= model.predict(x_test)  ^' H7 h, g! V( G% K6 A2 v
    4. 支持向量机(SVM)
    9 @* S  q7 t0 p1 E7 H5 z这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
      J2 r+ ]6 L9 J" ^: L- y6 T( u: e4 T" m  b6 O" f4 N0 X: b2 w
    现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
    ! O, G: u" W0 C' ?- A/ i7 |) j' q* H: o' o% [
    $ e; R3 r. n0 I! I; x7 b" C- K4 @

    2 G( _) W- P- o$ f# S; K在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。+ {! P3 c4 T) U& p5 Z2 L
    : T) \3 s' h+ s* A  Y
    #Import Library7 ?$ U# B1 \& C+ t% X
    from sklearn import svm
    $ X- M4 N& z/ i0 r#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
      s- t* z7 p3 f. N& h: _, _8 ~# Create SVM classification object
    + V% @' |) `5 ^* ]/ e
    " b% u9 a) O' C3 b7 [5 D; hmodel = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail.6 j" E; D4 m( O* p6 [; d

    8 v% G8 @$ o) F# _# Train the model using the training sets and check score* e# D" K4 a8 Z9 Z+ }: R0 G
    model.fit(X, y)" h4 t" ~$ O  `1 L
    model.score(X, y)
    4 \+ o8 o7 y' l* x3 C& z" I2 }. ^7 U9 r/ J# n: I
    #Predict Output# }& k  q+ Q! j, n; j7 y
    predicted= model.predict(x_test)8 S  Q6 f" a! p* q! J8 Z
    5. 朴素贝叶斯* m9 u4 H  D! V! I* I/ r& ^) m0 _
    这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。7 |$ [: Z: j0 t+ A1 u! U# P
    7 {" Y5 ]$ X+ e
    朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
    5 R8 ?  M  f2 g- [6 G$ `
    % y, R' P5 W/ q0 z贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下:' t% L/ k* u) j3 U  h5 G
    ' l! v9 J' r. P( Q) v- {& P& P
    ' t$ x. a3 z/ e' O% r( V
    P(c|x)是已知特征x而分类为c的后验概率。
    . q3 L/ W6 ~7 A/ T+ D# X' s! e7 O: ]9 F
    P(c)是种类c的先验概率。; d! F- s2 r; z: V0 u

    6 b/ P/ I& B! W4 ^P(x|c)是种类c具有特征x的可能性。8 w9 S4 H' T1 A4 ^$ c/ }

    $ D: k7 ~& Y$ `( B8 J4 ^2 k( qP(x)是特征x的先验概率。
    % _3 s# c# O+ y* M3 H, j9 a7 L. B9 G' O0 ]8 p7 L. S

    ) }6 {4 m$ _3 G/ C. u例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
    - A0 T6 I( e, J& n
    5 ~6 H: U( V2 f9 B0 ]0 [步骤1:根据已知数据做频率表
    ; j# U+ |4 K4 A7 P; C! H, L$ V0 q* j% e! M8 \; W3 V
    步骤2:计算各个情况的概率制作概率表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.& s8 A' H1 }  S9 e: O$ w

    ( O2 u8 i% O2 v% p, `1 Y$ v
    & Q1 P( q3 I8 V* }; E2 N步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
      V. T! S5 W3 K1 C& W! c) E0 ~提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
    # s; f) k- [( S; K0 d. m5 ^$ S9 `- F3 j) Z* B
    我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
    7 T2 [; m/ y0 h: P3 c' p1 \2 t- G( _  A/ S& T
    这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。6 ^3 f# |( j' X9 g

    / W1 q$ A  w( _0 ]6 U& v. {4 @) M那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。7 O+ b2 h- w( q7 J$ j
    , r4 `9 k3 M# y, {9 M: Z8 t
    当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
    $ N% P& ^6 |4 D6 `8 |1 z
    ( A. e# i2 a- N+ }) J8 A#Import Library3 F4 z8 F# X. N- E
    from sklearn.naive_bayes import GaussianNB
    % S2 D( F# t+ \& @! F, _) ], L#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset% s- A/ P3 @- k( `
    # K! E! D0 d7 ^% v
    # Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
    ! E' Y1 n0 ?/ Z" Y% Y6 z" _# |2 c' {9 ^
    # Train the model using the training sets and check score
    , Q7 B" S& g$ l$ jmodel.fit(X, y)
      L6 f, l) P2 m6 b2 u8 o4 @8 j; H3 V# M0 F! j
    #Predict Output
    8 m! S* k& H/ w6 ]- hpredicted= model.predict(x_test)
    ' X& W& R# E" D; |% l5 D3 G6.KNN(K-邻近算法)5 B) K0 L' F8 _: L3 X6 \
    这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
    " U' J, }: u+ K% [* |
    # u8 t0 f; M* n8 p6 |* d距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
    , A0 ^9 W% I1 w) P1 n5 O* T# h1 N4 i* P1 r* Q8 }2 c

    7 z) d8 A7 M6 M$ t1 f
    - k  U, M7 M- D4 a: j  ~6 rKNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
    6 `8 k) h# R( S' D
    0 k- A$ W0 M4 K! ~在用KNN前你需要考虑到:- i" j: z& Y2 M
    / A( x) J+ Y9 h% G3 V- y, [' ^
    KNN的计算成本很高2 Z+ f# y; F4 r( |! c
    " \; [$ [- I8 _& t3 V4 c
    所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。2 d8 K, D/ a. ?$ m2 I6 `
    ) k# v- ]+ e! l" H5 S5 [" {& I  S: X
    在进行KNN前预处理数据,例如去除异常值,噪音等。
    2 H+ D8 T6 U3 t, v1 t
    ( l- B8 V2 [& l; q! C# H  i/ c#Import Library# N, ?6 e5 h* l$ P0 v, R$ E: M
    from sklearn.neighbors import KNeighborsClassifier7 e( ^9 u- G) y2 Q( U5 \* \
    - ~' y: ?0 i3 r2 s
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset9 N" l% J% _# S2 S
    # Create KNeighbors classifier object model . c- A$ {: m, l6 g6 y& I% A* ~  z
    ! p" [5 x! Z$ n* y& P
    KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5
    , _# Z1 I0 w( L2 w% ~
    5 W* d  c! v8 i8 ^* X2 c6 x# Train the model using the training sets and check score. d! b' ^* {" C
    model.fit(X, y)
    4 g6 ?! x4 D; Y" \, p! X  F) ^
    $ A. y" D- P# x4 C#Predict Output. J+ Z3 h" z: r; U
    predicted= model.predict(x_test)
    % I4 W! {# P( p' ~, `1 G  b7. K均值算法(K-Means)
    1 S' b) p- V2 ~& c' w. L这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
    ; c) b* ?7 x  J4 j, S2 x6 j7 B# ]5 E) C& d: ~
    还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
      X& @$ a# _; g% }3 |8 \9 v7 w$ ^7 W# }0 ~. w1 M
    5 X1 N. `7 L, w+ Q
    K均值算法如何划分集群:% S- I( U' ]' X6 ~% T- i; y  S# f
    7 u; t* l5 C; ]3 x( d

    ; r1 N2 f6 O% w+ w; E
    # ?* k* R% z# N. y! K3 w从每个集群中选取K个数据点作为质心(centroids)。1 @9 }* p. c/ t9 K2 I9 T
    9 |7 B& T# ~% B, y) }$ w
    将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
    # }3 l* R3 o% ~& q( ?4 C, u. N1 K- D8 l% Z5 k. _
    找出新集群的质心,这样就有了新的质心。7 J& \* a+ }9 e
    2 z2 ^7 ^0 y2 |* J3 m
    重复2和3,直到结果收敛,即不再有新的质心出现。) B2 V$ O' B# k' t. h, u

    ; M/ @- }, x; p2 Z+ Q( \5 U- o) ^! v2 b- H2 v
    怎样确定K的值:. m6 N; ~$ {- t
    # A( b' ^! v" Z- z
    如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。0 K% j/ w. o5 o# Z+ q

    . U" }1 Z4 k, T# n' S0 F我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。, \% ~+ n+ C- e+ F, u8 {3 b7 H5 c

    - e+ u& G" I5 s4 P  v) h/ E! X9 M9 e3 `/ b1 U/ \% a
    #Import Library: D5 q( s! z  U) Q4 L9 q1 l, P
    from sklearn.cluster import KMeans  j3 p1 B4 d( T6 H  f

    + v$ q0 n9 E9 @6 l) a#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
    # k; `6 O4 ^) R! W* L8 q2 }# Create KNeighbors classifier object model
    4 Y: }- f9 X4 J1 W4 `( }k_means = KMeans(n_clusters=3, random_state=0)9 F( ~/ u5 y, B; a, c* R

      ^- v4 @$ ^" o: `7 e# Train the model using the training sets and check score
    2 T" m% n- C. Kmodel.fit(X)  {1 T) V% z/ d* K* ~* g! h% Z% z

    & M  w/ V( H! O' R#Predict Output
    + @( U9 k$ I0 o) opredicted= model.predict(x_test)
    8 M5 `/ z- K7 x: @8.随机森林
    : ~# r$ i5 t8 M: Z8 x2 f随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
    * j8 u6 m7 [6 F8 n
    % E) G4 ^/ l+ O怎样生成决策树:1 ?6 H! l1 ?. a3 ]8 H' {  E

    - L6 m& c4 H1 d7 T如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。0 Q. Y: i5 k7 L% O1 S; \6 L

    9 x! v: J7 Q/ B! t" x! z7 \如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
    1 F/ f. D5 @3 o* b, m: @0 _; u& v  `
    每个决策树都最大程度上进行分割,没有剪枝。
      a0 m! k* i* x0 a# y
    , g$ ?6 F2 ?: j6 n4 q' F#Import Library
    $ y8 k: |) [% s. g* b0 g. xfrom sklearn.ensemble import RandomForestClassifier# i% G% Q! }: y4 z' Q1 l+ Z
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    3 m, j" @. J% M4 q1 {) P. O% K. C) g
    # Create Random Forest object
    ( R* Y8 \7 U0 N4 p6 o; mmodel= RandomForestClassifier(); j6 s# a1 h0 i( v
      i9 r- y4 a; F- h5 k  s- o
    # Train the model using the training sets and check score
    , b8 ], `8 T0 O7 bmodel.fit(X, y)
    # a8 m8 I1 t2 u
    ( G5 x; |- P  f! Q; v2 @#Predict Output
    ! d7 j4 ?4 a2 Y0 D) ^6 opredicted= model.predict(x_test)- W! \: y5 f1 D/ f2 o* G( L
    9.降维算法(Dimensionality Reduction Algorithms)% [7 h3 s5 d1 g& j& c/ U6 y, |. \
    在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。. j: z! {3 @0 x% Q3 T, y

    , o% O" s& ]6 z1 t2 z5 K+ ~8 v例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。, o/ x8 V$ J7 J* ^9 s# @) R# v

    8 G% u7 x% S# T1 T: H( ~作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。, h/ f4 b  R* |2 @" S' `$ \* k

    5 t8 k9 q& a+ d# E. u9 R3 K" u9 u4 o
    #Import Library
    ! @, w! l( E  a. B7 X( ?2 nfrom sklearn import decomposition( R: F; a! a3 Z& `+ G
    #Assumed you have training and test data set as train and test
    % ?# h3 _( \! r- b9 |8 S  i# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features)
    / ?: x# M; w8 `8 y* [# For Factor analysis
    / b8 S  _. z$ G( z2 U7 g* a7 }- c#fa= decomposition.FactorAnalysis()
    ! s# _1 ^. {8 @* [0 m# Reduced the dimension of training dataset using PCA
    / B7 A; }! @( F
    $ k+ x! t% T( a" E: `: @train_reduced = pca.fit_transform(train)
    8 _7 e! i+ ]3 m2 A9 u: t9 S; E
    ! g' N7 a/ N& r2 R2 [#Reduced the dimension of test dataset
    ( L' p! O; B  ctest_reduced = pca.transform(test)
    & c& ~$ B, M9 K1 B7 Z8 r10.Gradient Boosing 和 AdaBoost
    8 m) U1 X: \& }9 _' q& [" oGBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。3 P, f+ v7 l. k5 _+ K
    : I" d; }5 t$ X. j' g- F7 F
    #Import Library
    6 ~; J3 b# q6 M% h' |from sklearn.ensemble import GradientBoostingClassifier9 J2 U7 [/ J0 Q0 H
    #Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
    9 G( s4 ~( }2 Q' _# Create Gradient Boosting Classifier object, A3 t0 F! b# `# ]* v* T
    model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)& E, V% w* W- r  Y: U8 A
    9 k( ^9 z( x& y5 i" q( H
    # Train the model using the training sets and check score
    , Z9 c! M7 L! a7 O5 e, m' \model.fit(X, y), M5 f6 q5 j6 c; Y& G% i  G; S
    #Predict Output& _9 a  f! h. H8 {3 ?
    predicted= model.predict(x_test)
    ; B3 n: L- _" o4 OGradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问 这两个算法有什么不同。
    & B$ a0 A7 H& C7 d5 B3 U7 q" z% F, r: w" m$ X) N7 P' U
    原文链接:http://blog.csdn.net/han_xiaoyang/article/details/51191386
    ( H) {( S4 ^' I" ^7 T————————————————/ _; [" i( G( g. w' e$ ]
    版权声明:本文为CSDN博主「_小羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 U; ^# z5 c8 @8 W/ J9 f
    原文链接:https://blog.csdn.net/qq_39303465/article/details/79176075* \4 |, t2 W6 K9 g5 x' z3 J  e

    ' f) M/ ~1 h: D2 s0 O# B
    0 a0 S4 u' a& [* J  Z% v6 ^
    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, 2024-4-25 13:17 , Processed in 0.378389 second(s), 50 queries .

    回顶部